diff --git a/BUILDS.md b/BUILDS.md index e2d86b053..e882329d9 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -149,6 +149,7 @@ | USE_EZORGB | - | - | - | - | - | - | - | | USE_EZORTD | - | - | - | - | - | - | - | | USE_SEESAW_SOIL | - | - | - | - | - | - | - | +| USE_TOF10120 | - | - | - | - | - | - | - | | | | | | | | | | | Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks | USE_SPI | - | - | - | - | - | - | x | diff --git a/CHANGELOG.md b/CHANGELOG.md index e8d7f6ced..cfbb32efb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. - Basic support for ESP32 M5stack core2 16MB binary tasmota32-core2.bin (#10635) - Support for Sugar Valley NeoPool Controller by Norbert Richter (#10637) - Rule trigger string comparisons for EndsWith ``$>``, StartsWith ``$<`` and Contains ``$|`` (#10538) +- Support for TOF10120 time of flight sensor by Cyril Pawelko (#10190) ### Breaking Changed - ESP32 switch from default SPIFFS to default LittleFS file system loosing current (zigbee) files diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 301b48111..60ee9608b 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -90,3 +90,4 @@ Index | Define | Driver | Device | Address(es) | Description 55 | USE_EZORGB | xsns_78 | EZORGB | 0x61 - 0x70 | Color sensor 55 | USE_EZOPMP | xsns_78 | EZOPMP | 0x61 - 0x70 | Peristaltic Pump 56 | USE_SEESAW_SOIL | xsns_81 | SEESOIL | 0x36 - 0x39 | Adafruit seesaw soil moisture sensor + 57 | USE_TOF10120 | xsns_84 | TOF10120 | 0x52 | Time-of-flight (ToF) distance sensor diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5303ed3cd..558c87910 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -74,6 +74,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for FTC532 8-button touch controller by Peter Franck [#10222](https://github.com/arendst/Tasmota/issues/10222) - Support for BS814A-2 8-button touch buttons by Peter Franck [#10447](https://github.com/arendst/Tasmota/issues/10447) - Support for up to 4 I2C SEESAW_SOIL Capacitance & Temperature sensors by Peter Franck [#10481](https://github.com/arendst/Tasmota/issues/10481) +- Support for TOF10120 time of flight sensor by Cyril Pawelko [#10190](https://github.com/arendst/Tasmota/issues/10190) - Support for Afrikaans language translations by Christiaan Heerze - Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index f77a3571c..0c7438907 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -784,6 +784,7 @@ const char HTTP_SNS_GALLONS[] PROGMEM = "{s}%s " D_TOTAL_USAGE "{ const char HTTP_SNS_GPM[] PROGMEM = "{s}%s " D_FLOW_RATE "{m}%s " D_UNIT_GALLONS_PER_MIN "{e}"; const char HTTP_SNS_MOISTURE[] PROGMEM = "{s}%s " D_MOISTURE "{m}%d " D_UNIT_PERCENT "{e}"; const char HTTP_SNS_RANGE[] PROGMEM = "{s}%s " D_RANGE "{m}%d" "{e}"; +const char HTTP_SNS_DISTANCE[] PROGMEM = "{s}%s " D_DISTANCE "{m}%d " D_UNIT_MILLIMETER "{e}"; const char HTTP_SNS_VOLTAGE[] PROGMEM = "{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}"; const char HTTP_SNS_CURRENT[] PROGMEM = "{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"; const char HTTP_SNS_POWER[] PROGMEM = "{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}"; diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index cd1d62cd7..e2310d951 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -558,7 +558,8 @@ // #define USE_SPS30 // [I2cDriver30] Enable Sensiron SPS30 particle sensor (I2C address 0x69) (+1.7 code) #define USE_ADE7953 // [I2cDriver7] Enable ADE7953 Energy monitor as used on Shelly 2.5 (I2C address 0x38) (+1k5) // #define USE_VL53L0X // [I2cDriver31] Enable VL53L0x time of flight sensor (I2C address 0x29) (+4k code) -// #define USE_VL53L1X // [I2cDriver54] Enable support for VL53L1X sensor (I2C address 0x29) using Pololu VL53L1X library (+2k9 code) +// #define USE_VL53L1X // [I2cDriver54] Enable VL53L1X time of flight sensor (I2C address 0x29) using Pololu VL53L1X library (+2k9 code) +// #define USE_TOF10120 // [I2cDriver57] Enable TOF10120 time of flight sensor (I2C address 0x52) (+0k6 code) // #define USE_MLX90614 // [I2cDriver32] Enable MLX90614 ir temp sensor (I2C address 0x5a) (+0.6k code) // #define USE_CHIRP // [I2cDriver33] Enable CHIRP soil moisture sensor (variable I2C address, default 0x20) // #define USE_PAJ7620 // [I2cDriver34] Enable PAJ7620 gesture sensor (I2C address 0x73) (+2.5k code) @@ -591,6 +592,7 @@ // #define USE_EZODO // [I2cDriver55] Enable support for EZO's DO sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) // #define USE_EZORGB // [I2cDriver55] Enable support for EZO's RGB sensor (+0k5 code) - Shared EZO code required for any EZO device (+1k2 code) // #define USE_EZOPMP // [I2cDriver55] Enable support for EZO's PMP sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) +// #define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) // #define USE_DISPLAY // Add I2C Display Support (+2k code) #define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0 diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index a5134c1c1..53e0b3398 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -701,7 +701,7 @@ void ResponseAppendFeatures(void) #ifdef USE_BS814A2 feature7 |= 0x01000000; // xdrv_51_bs814a2.ino #endif -#ifdef USE_SEESAW_SOIL +#if defined(USE_I2C) && defined(USE_SEESAW_SOIL) feature7 |= 0x02000000; // xsns_81_seesaw_soil.ino #endif #ifdef USE_WIEGAND @@ -710,8 +710,9 @@ void ResponseAppendFeatures(void) #ifdef USE_NEOPOOL feature7 |= 0x08000000; // xsns_83_neopool.ino #endif - -// feature7 |= 0x10000000; +#if defined(USE_I2C) && defined(USE_TOF10120) + feature7 |= 0x10000000; // xsns_84_tof10120 +#endif // feature7 |= 0x20000000; // feature7 |= 0x40000000; // feature7 |= 0x80000000; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 5dcce7502..fd04983ec 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -109,7 +109,8 @@ //#define USE_SPS30 // [I2cDriver30] Enable Sensiron SPS30 particle sensor (I2C address 0x69) (+1.7 code) #define USE_ADE7953 // [I2cDriver7] Enable ADE7953 Energy monitor as used on Shelly 2.5 (I2C address 0x38) (+1k5) //#define USE_VL53L0X // [I2cDriver31] Enable VL53L0x time of flight sensor (I2C address 0x29) (+4k code) -//#define USE_VL53L1X // [I2cDriver54] Enable support for VL53L1X sensor (I2C address 0x29) using Pololu VL53L1X library (+2k9 code) +//#define USE_VL53L1X // [I2cDriver54] Enable VL53L1X time of flight sensor (I2C address 0x29) using Pololu VL53L1X library (+2k9 code) +//#define USE_TOF10120 // [I2cDriver57] Enable TOF10120 time of flight sensor (I2C address 0x52) (+0k6 code) //#define USE_MLX90614 // [I2cDriver32] Enable MLX90614 ir temp sensor (I2C address 0x5a) (+0.6k code) //#define USE_CHIRP // [I2cDriver33] Enable CHIRP soil moisture sensor (variable I2C address, default 0x20) //#define USE_PAJ7620 // [I2cDriver34] Enable PAJ7620 gesture sensor (I2C address 0x73) (+2.5k code) @@ -140,6 +141,7 @@ //#define USE_EZODO // [I2cDriver55] Enable support for EZO's DO sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) //#define USE_EZORGB // [I2cDriver55] Enable support for EZO's RGB sensor (+0k5 code) - Shared EZO code required for any EZO device (+1k2 code) //#define USE_EZOPMP // [I2cDriver55] Enable support for EZO's PMP sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) +//#define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) //#define USE_SPI // Hardware SPI using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK) in addition to two user selectable GPIOs(CS and DC) //#define USE_RC522 // Add support for MFRC522 13.56Mhz Rfid reader (+6k code) @@ -194,8 +196,8 @@ //#define USE_MAX31865 // Add support for MAX31865 RTD sensors using softSPI #define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k code, 0k3 mem, 48 iram) #define USE_IR_RECEIVE // Support for IR receiver (+5k5 code, 264 iram) - #define USE_LMT01 // Add support for TI LMT01 temperature sensor, count pulses on single GPIO (+0k5 code) +//#define USE_WIEGAND // Add support for 24/26/32/34 bit RFID Wiegand interface (D0/D1) (+1k7 code) #define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code) #define USE_HX711 // Add support for HX711 load cell (+1k5 code) //#define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) diff --git a/tasmota/xsns_45_vl53l0x.ino b/tasmota/xsns_45_vl53l0x.ino index 54c49534c..1d377bd6d 100644 --- a/tasmota/xsns_45_vl53l0x.ino +++ b/tasmota/xsns_45_vl53l0x.ino @@ -25,8 +25,11 @@ * 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 + +#define USE_VL_MEDIAN +#define USE_VL_MEDIAN_SIZE 5 // Odd number of samples median detection #include #include "VL53L0X.h" @@ -44,7 +47,6 @@ struct { void Vl53l0Detect(void) { if (!I2cSetDevice(0x29)) { return; } - if (!sensor.init()) { return; } I2cSetActiveFound(sensor.getAddress(), "VL53L0X"); @@ -61,15 +63,7 @@ void Vl53l0Detect(void) { Vl53l0x.index = 0; } -#ifdef USE_WEBSERVER -const char HTTP_SNS_VL53L0X[] PROGMEM = - "{s}VL53L0X " D_DISTANCE "{m}%d" D_UNIT_MILLIMETER "{e}"; // {s} = , {m} = , {e} = -#endif // USE_WEBSERVER - -#define USE_VL_MEDIAN - void Vl53l0Every_250MSecond(void) { - // every 200 ms uint16_t dist = sensor.readRangeContinuousMillimeters(); if ((0 == dist) || (dist > 2000)) { dist = 9999; @@ -79,18 +73,18 @@ void Vl53l0Every_250MSecond(void) { // store in ring buffer Vl53l0x.buffer[Vl53l0x.index] = dist; Vl53l0x.index++; - if (Vl53l0x.index >= 5) { + if (Vl53l0x.index >= USE_VL_MEDIAN_SIZE) { Vl53l0x.index = 0; } // sort list and take median - uint16_t tbuff[5]; + uint16_t tbuff[USE_VL_MEDIAN_SIZE]; memmove(tbuff, Vl53l0x.buffer, sizeof(tbuff)); uint16_t tmp; uint8_t flag; - for (uint32_t ocnt = 0; ocnt < 5; ocnt++) { + for (uint32_t ocnt = 0; ocnt < USE_VL_MEDIAN_SIZE; ocnt++) { flag = 0; - for (uint32_t count = 0; count < 4; count++) { + for (uint32_t count = 0; count < USE_VL_MEDIAN_SIZE -1; count++) { if (tbuff[count] > tbuff[count +1]) { tmp = tbuff[count]; tbuff[count] = tbuff[count +1]; @@ -100,7 +94,7 @@ void Vl53l0Every_250MSecond(void) { } if (!flag) { break; } } - Vl53l0x.distance = tbuff[2]; + Vl53l0x.distance = tbuff[(USE_VL_MEDIAN_SIZE -1) / 2]; #else Vl53l0x.distance = dist; #endif @@ -125,7 +119,7 @@ void Vl53l0Show(boolean json) { #endif // USE_DOMOTICZ #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_VL53L0X, Vl53l0x.distance); + WSContentSend_PD(HTTP_SNS_DISTANCE, PSTR("VL53L0X"), Vl53l0x.distance); #endif } } @@ -134,8 +128,7 @@ void Vl53l0Show(boolean json) { * Interface \*********************************************************************************************/ -bool Xsns45(byte function) -{ +bool Xsns45(byte function) { if (!I2cEnabled(XI2C_31)) { return false; } bool result = false; diff --git a/tasmota/xsns_77_vl53l1x.ino b/tasmota/xsns_77_vl53l1x.ino index f245fda86..76908ad6e 100644 --- a/tasmota/xsns_77_vl53l1x.ino +++ b/tasmota/xsns_77_vl53l1x.ino @@ -36,8 +36,8 @@ VL53L1X vl53l1x = VL53L1X(); // create object copy #define VL53L1X_ADDRESS 0x29 struct { - bool ready = false; uint16_t distance = 0; + bool ready = false; } vl53l1x_sensors; /********************************************************************************************/ @@ -54,13 +54,7 @@ void Vl53l1Detect(void) { vl53l1x_sensors.ready = true; } -#ifdef USE_WEBSERVER -const char HTTP_SNS_VL53L1X[] PROGMEM = - "{s}VL53L1X " D_DISTANCE "{m}%d" D_UNIT_MILLIMETER "{e}"; // {s} = , {m} = , {e} = -#endif // USE_WEBSERVER - void Vl53l1Every_250MSecond(void) { - // every 250 ms uint16_t dist = vl53l1x.read(); if (!dist || dist > 4000) { dist = 9999; @@ -78,15 +72,15 @@ void Vl53l1Every_Second(void) { void Vl53l1Show(bool json) { if (json) { + ResponseAppend_P(PSTR(",\"VL53L1X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l1x_sensors.distance); #ifdef USE_DOMOTICZ if (0 == TasmotaGlobal.tele_period) { Vl53l1Every_Second(); } #endif // USE_DOMOTICZ - ResponseAppend_P(PSTR(",\"VL53L1X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l1x_sensors.distance); #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_VL53L1X, vl53l1x_sensors.distance); + WSContentSend_PD(HTTP_SNS_DISTANCE, PSTR("VL53L1X"), vl53l1x_sensors.distance); #endif } } @@ -95,9 +89,9 @@ void Vl53l1Show(bool json) { * Interface \*********************************************************************************************/ -bool Xsns77(uint8_t function) -{ +bool Xsns77(uint8_t function) { if (!I2cEnabled(XI2C_54)) { return false; } + bool result = false; if (FUNC_INIT == function) { diff --git a/tasmota/xsns_83_neopool.ino b/tasmota/xsns_83_neopool.ino index c0902699c..21d25e728 100644 --- a/tasmota/xsns_83_neopool.ino +++ b/tasmota/xsns_83_neopool.ino @@ -1,7 +1,7 @@ /* xsns_83_neopool.ino - Sugar Valley NeoPool Control System Modbus support for Tasmota - Copyright (C) 2021 Norbert Richter + Copyright (C) 2021 Norbert Richter This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_84_tof10120.ino b/tasmota/xsns_84_tof10120.ino new file mode 100644 index 000000000..b0454a5ba --- /dev/null +++ b/tasmota/xsns_84_tof10120.ino @@ -0,0 +1,144 @@ +/* + xsns_84_tof10120.ino - TOF10120 sensor support for Tasmota + + Copyright (C) 2021 Cyril Pawelko and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_I2C +#ifdef USE_TOF10120 +/*********************************************************************************************\ + * TOF10120 I2C Mode (Serial not supported) + * + * I2C Address: 0x52 + * + * Connections: + * 1 - Black Gnd + * 2 - Red Vcc + * 3 - Yellow Rxd - Not supported + * 4 - White Txd - Not supported + * 5 - Blue I2C SDA + * 6 - Green I2C SCL +\*********************************************************************************************/ + +#define XSNS_84 84 +#define XI2C_57 57 // See I2CDEVICES.md + +#define TOF10120_ADDRESS 0x52 +#define TOF10120_INCORRECT_DISTANCE 0xFFFF + +struct { + uint16_t distance = 0; + bool ready = false; +} tof10120_sensor; + +/********************************************************************************************/ + +uint16_t Tof10120Read() { + uint16_t distance; + + Wire.beginTransmission(TOF10120_ADDRESS); + Wire.write(byte(0x00)); + Wire.endTransmission(); + delay(1); + Wire.requestFrom(TOF10120_ADDRESS, 2); + if (Wire.available() == 2) { + distance = Wire.read(); + distance = distance <<8; + distance |= Wire.read(); + } else { // Incorrect value read + AddLog_P(LOG_LEVEL_DEBUG, "TOF: No value read"); + return TOF10120_INCORRECT_DISTANCE; + } + AddLog_P(LOG_LEVEL_DEBUG_MORE, "TOF: Distance %u", distance); + return distance; +} + +void Tof10120Detect(void) { + if (!I2cSetDevice(TOF10120_ADDRESS)) { return; } + if (Tof10120Read() == TOF10120_INCORRECT_DISTANCE) { return; } + + I2cSetActiveFound(TOF10120_ADDRESS, "TOF10120"); + tof10120_sensor.ready = true; +} + +void Tof10120Every_250MSecond(void) { + uint16_t dist = Tof10120Read(); +// if ( dist < 400000) { +// dist = TOF10120_INCORRECT_DISTANCE; +// } + tof10120_sensor.distance = dist; +} + +#ifdef USE_DOMOTICZ +void Tof10120Every_Second(void) { + char distance[FLOATSZ]; + dtostrfd((float)tof10120_sensor.distance / 10, 1, distance); + DomoticzSensor(DZ_ILLUMINANCE, distance); +} +#endif // USE_DOMOTICZ + +void Tof10120Show(bool json) { + if (json) { + ResponseAppend_P(PSTR(",\"TOF10120\":{\"" D_JSON_DISTANCE "\":%d}"), tof10120_sensor.distance); +#ifdef USE_DOMOTICZ + if (0 == TasmotaGlobal.tele_period) { + Tof10120Every_Second(); + } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_DISTANCE, PSTR("TOF10120"), tof10120_sensor.distance); +#endif + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns84(uint8_t function) { + if (!I2cEnabled(XI2C_57)) { return false; } + + bool result = false; + + if (FUNC_INIT == function) { + Tof10120Detect(); + } + else if (tof10120_sensor.ready) { + switch (function) { + case FUNC_EVERY_250_MSECOND: + Tof10120Every_250MSecond(); + break; +#ifdef USE_DOMOTICZ + case FUNC_EVERY_SECOND: + Tof10120Every_Second(); + break; +#endif // USE_DOMOTICZ + case FUNC_JSON_APPEND: + Tof10120Show(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Tof10120Show(0); + break; +#endif // USE_WEBSERVER + } + } + return result; +} + +#endif // USE_TOF10120 +#endif // USE_I2C \ No newline at end of file diff --git a/tools/decode-status.py b/tools/decode-status.py index bb5b4e6c3..fa56c4b9b 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -245,7 +245,7 @@ a_features = [[ "USE_DISPLAY_ILI9488","USE_DISPLAY_SSD1351","USE_DISPLAY_RA8876","USE_DISPLAY_ST7789", "USE_DISPLAY_SSD1331","USE_UFILESYS","USE_TIMEPROP","USE_PID", "USE_BS814A2","USE_SEESAW_SOIL","USE_WIEGAND","USE_NEOPOOL", - "","","","" + "USE_TOF10120","","","" ]] usage = "usage: decode-status {-d | -f} arg" @@ -273,7 +273,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20210116 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v20210122 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj))