step1 - add arrays

This commit is contained in:
Barbudor 2022-03-10 22:00:20 +01:00
parent b810136e9c
commit 6072830907
1 changed files with 40 additions and 20 deletions

View File

@ -1,5 +1,5 @@
/* /*
xsns_77_vl53l1x.ino - VL53L1X sensor support for Tasmota xsns_77_vl53l1x_device[0].ino - VL53L1X sensor support for Tasmota
Copyright (C) 2021 Theo Arends, Rui Marinho and Johann Obermeier Copyright (C) 2021 Theo Arends, Rui Marinho and Johann Obermeier
@ -30,49 +30,69 @@
#define XSNS_77 77 #define XSNS_77 77
#define XI2C_54 54 // See I2CDEVICES.md #define XI2C_54 54 // See I2CDEVICES.md
#include "VL53L1X.h" #define VL53LXX_MAX_SENSORS VL53L0X_MAX_SENSORS
VL53L1X vl53l1x = VL53L1X(); // create object copy #define GPIO_VL53LXX_XSHUT1 GPIO_VL53L0X_XSHUT1
#define VL53L1X_ADDRESS 0x29 #include "VL53L1X.h"
VL53L1X vl53l1x_device[VL53LXX_MAX_SENSORS];
#define VL53LXX_ADDRESS 0x29
#ifndef VL53LXX_ADDRESS_MOVED
#define VL53LXX_ADDRESS_MOVED 0x78
#endif
struct { struct {
uint16_t distance = 0; uint16_t distance = 0;
bool ready = false; } vl53l1x_data[VL53LXX_MAX_SENSORS];
} vl53l1x_sensors;
bool VL53L1X_xshut = false;
bool VL53L1X_detected = false;
/********************************************************************************************/ /********************************************************************************************/
void Vl53l1Detect(void) { void Vl53l1Detect(void) {
if (!I2cSetDevice(VL53L1X_ADDRESS)) { return; }
if (!vl53l1x.init()) { return; }
I2cSetActiveFound(vl53l1x.getAddress(), "VL53L1X"); for (uint32_t i = 0; i < VL53LXX_MAX_SENSORS; i++) {
vl53l1x.setTimeout(500); if (PinUsed(GPIO_VL53LXX_XSHUT1, i)) {
vl53l1x.setDistanceMode(VL53L1X::Long); // could be Short, Medium, Long pinMode(Pin(GPIO_VL53LXX_XSHUT1, i), OUTPUT);
vl53l1x.setMeasurementTimingBudget(140000); digitalWrite(Pin(GPIO_VL53LXX_XSHUT1, i), i==0 ? 1 : 0);
vl53l1x.startContinuous(50); VL53L1X_xshut = true;
vl53l1x_sensors.ready = true; }
else {
break; // XSHUT indexes must be continuous. We stop at the 1st not defined one
}
}
if (!I2cSetDevice(VL53LXX_ADDRESS)) { return; }
if (!vl53l1x_device[0].init()) { return; }
I2cSetActiveFound(vl53l1x_device[0].getAddress(), "VL53L1X");
vl53l1x_device[0].setTimeout(500);
vl53l1x_device[0].setDistanceMode(VL53L1X::Long); // could be Short, Medium, Long
vl53l1x_device[0].setMeasurementTimingBudget(140000);
vl53l1x_device[0].startContinuous(50);
VL53L1X_detected = true;
} }
void Vl53l1Every_250MSecond(void) { void Vl53l1Every_250MSecond(void) {
uint16_t dist = vl53l1x.read(); uint16_t dist = vl53l1x_device[0].read();
if (!dist || dist > 4000) { if (!dist || dist > 4000) {
dist = 9999; dist = 9999;
} }
vl53l1x_sensors.distance = dist; vl53l1x_data[0].distance = dist;
} }
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
void Vl53l1Every_Second(void) { void Vl53l1Every_Second(void) {
char distance[FLOATSZ]; char distance[FLOATSZ];
dtostrfd((float)vl53l1x_sensors.distance / 10, 1, distance); dtostrfd((float)vl53l1x_data[0].distance / 10, 1, distance);
DomoticzSensor(DZ_ILLUMINANCE, distance); DomoticzSensor(DZ_ILLUMINANCE, distance);
} }
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
void Vl53l1Show(bool json) { void Vl53l1Show(bool json) {
if (json) { if (json) {
ResponseAppend_P(PSTR(",\"VL53L1X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l1x_sensors.distance); ResponseAppend_P(PSTR(",\"VL53L1X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l1x_data[0].distance);
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
if (0 == TasmotaGlobal.tele_period) { if (0 == TasmotaGlobal.tele_period) {
Vl53l1Every_Second(); Vl53l1Every_Second();
@ -80,7 +100,7 @@ void Vl53l1Show(bool json) {
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
} else { } else {
WSContentSend_PD(HTTP_SNS_DISTANCE, PSTR("VL53L1X"), vl53l1x_sensors.distance); WSContentSend_PD(HTTP_SNS_DISTANCE, PSTR("VL53L1X"), vl53l1x_data[0].distance);
#endif #endif
} }
} }
@ -97,7 +117,7 @@ bool Xsns77(uint8_t function) {
if (FUNC_INIT == function) { if (FUNC_INIT == function) {
Vl53l1Detect(); Vl53l1Detect();
} }
else if (vl53l1x_sensors.ready) { else if (VL53L1X_detected) {
switch (function) { switch (function) {
case FUNC_EVERY_250_MSECOND: case FUNC_EVERY_250_MSECOND:
Vl53l1Every_250MSecond(); Vl53l1Every_250MSecond();