diff --git a/tasmota/xsns_45_vl53l0x.ino b/tasmota/xsns_45_vl53l0x.ino index ef9de345c..f3a9bbe74 100644 --- a/tasmota/xsns_45_vl53l0x.ino +++ b/tasmota/xsns_45_vl53l0x.ino @@ -1,5 +1,5 @@ /* - xsns_45_vl53l0x.ino - VL53L0X support for Tasmota + xsns_45_vl53l0x.ino - VL53L0X time of flight sensor support for Tasmota Copyright (C) 2020 Theo Arends and Gerhard Mutz @@ -19,23 +19,30 @@ #ifdef USE_I2C #ifdef USE_VL53L0X +/*********************************************************************************************\ + * VL53L0x time of flight sensor + * + * I2C Addres: 0x29 +\*********************************************************************************************/ -#define XSNS_45 45 -#define XI2C_31 31 // See I2CDEVICES.md +#define XSNS_45 45 +#define XI2C_31 31 // See I2CDEVICES.md #include #include "VL53L0X.h" VL53L0X sensor; -uint8_t vl53l0x_ready = 0; -uint16_t vl53l0x_distance; -uint16_t Vl53l0_buffer[5]; -uint8_t Vl53l0_index; +struct { + uint16_t distance; + uint16_t distance_prev; + uint16_t buffer[5]; + uint8_t ready = 0; + uint8_t index; +} Vl53l0x; /********************************************************************************************/ -void Vl53l0Detect(void) -{ +void Vl53l0Detect(void) { if (!I2cSetDevice(0x29)) { return; } if (!sensor.init()) { return; } @@ -49,9 +56,9 @@ void Vl53l0Detect(void) // instead, provide a desired inter-measurement period in // ms (e.g. sensor.startContinuous(100)). sensor.startContinuous(); - vl53l0x_ready = 1; + Vl53l0x.ready = 1; - Vl53l0_index=0; + Vl53l0x.index = 0; } #ifdef USE_WEBSERVER @@ -61,50 +68,64 @@ const char HTTP_SNS_VL53L0X[] PROGMEM = #define USE_VL_MEDIAN -void Vl53l0Every_250MSecond(void) -{ - uint16_t tbuff[5],tmp; - uint8_t flag; - +void Vl53l0Every_250MSecond(void) { // every 200 ms uint16_t dist = sensor.readRangeContinuousMillimeters(); - if (dist==0 || dist>2000) { - dist=9999; + if ((0 == dist) || (dist > 2000)) { + dist = 9999; } #ifdef USE_VL_MEDIAN // store in ring buffer - Vl53l0_buffer[Vl53l0_index]=dist; - Vl53l0_index++; - if (Vl53l0_index>=5) Vl53l0_index=0; + Vl53l0x.buffer[Vl53l0x.index] = dist; + Vl53l0x.index++; + if (Vl53l0x.index >= 5) { + Vl53l0x.index = 0; + } // sort list and take median - memmove(tbuff,Vl53l0_buffer,sizeof(tbuff)); - for (byte ocnt=0; ocnt<5; ocnt++) { - flag=0; - for (byte count=0; count<4; count++) { - if (tbuff[count]>tbuff[count+1]) { - tmp=tbuff[count]; - tbuff[count]=tbuff[count+1]; - tbuff[count+1]=tmp; - flag=1; + uint16_t tbuff[5]; + memmove(tbuff, Vl53l0x.buffer, sizeof(tbuff)); + uint16_t tmp; + uint8_t flag; + for (uint32_t ocnt = 0; ocnt < 5; ocnt++) { + flag = 0; + for (uint32_t count = 0; count < 4; count++) { + if (tbuff[count] > tbuff[count +1]) { + tmp = tbuff[count]; + tbuff[count] = tbuff[count +1]; + tbuff[count +1] = tmp; + flag = 1; } } - if (!flag) break; + if (!flag) { break; } } - vl53l0x_distance=tbuff[2]; + Vl53l0x.distance = tbuff[2]; #else - vl53l0x_distance=dist; + Vl53l0x.distance = dist; #endif } -void Vl53l0Show(boolean json) -{ +#ifdef USE_DOMOTICZ +void Vl53l0Every_Second(void) { + if (abs(Vl53l0x.distance - Vl53l0x.distance_prev) > 8) { + Vl53l0x.distance_prev = Vl53l0x.distance; + DomoticzSensor(DZ_ILLUMINANCE, Vl53l0x.distance); + } +} +#endif // USE_DOMOTICZ + +void Vl53l0Show(boolean json) { if (json) { - ResponseAppend_P(PSTR(",\"VL53L0X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l0x_distance); + ResponseAppend_P(PSTR(",\"VL53L0X\":{\"" D_JSON_DISTANCE "\":%d}"), Vl53l0x.distance); +#ifdef USE_DOMOTICZ + if (0 == tele_period) { + DomoticzSensor(DZ_ILLUMINANCE, Vl53l0x.distance); + } +#endif // USE_DOMOTICZ #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_VL53L0X, vl53l0x_distance); + WSContentSend_PD(HTTP_SNS_VL53L0X, Vl53l0x.distance); #endif } } @@ -122,11 +143,16 @@ bool Xsns45(byte function) if (FUNC_INIT == function) { Vl53l0Detect(); } - else if (vl53l0x_ready) { + else if (Vl53l0x.ready) { switch (function) { case FUNC_EVERY_250_MSECOND: Vl53l0Every_250MSecond(); break; +#ifdef USE_DOMOTICZ + case FUNC_EVERY_SECOND: + Vl53l0Every_Second(); + break; +#endif // USE_DOMOTICZ case FUNC_JSON_APPEND: Vl53l0Show(1); break;