From b0a5479c3b8775e058ec62cc3261a97f02fef101 Mon Sep 17 00:00:00 2001 From: kristi5 Date: Fri, 15 Nov 2019 23:10:07 +0100 Subject: [PATCH] JSN-SR04T add Mode 2 and Mode 3 --- tasmota/language/bg-BG.h | 4 +- tasmota/language/cs-CZ.h | 4 +- tasmota/language/de-DE.h | 4 +- tasmota/language/el-GR.h | 4 +- tasmota/language/en-GB.h | 4 +- tasmota/language/es-ES.h | 4 +- tasmota/language/fr-FR.h | 4 +- tasmota/language/he-HE.h | 4 +- tasmota/language/hu-HU.h | 4 +- tasmota/language/it-IT.h | 4 +- tasmota/language/ko-KO.h | 4 +- tasmota/language/nl-NL.h | 4 +- tasmota/language/pl-PL.h | 4 +- tasmota/language/pt-BR.h | 4 +- tasmota/language/pt-PT.h | 4 +- tasmota/language/ru-RU.h | 4 +- tasmota/language/sk-SK.h | 4 +- tasmota/language/sv-SE.h | 4 +- tasmota/language/tr-TR.h | 4 +- tasmota/language/uk-UK.h | 4 +- tasmota/language/zh-CN.h | 4 +- tasmota/language/zh-TW.h | 4 +- tasmota/tasmota_template.h | 8 +-- tasmota/xsns_22_sr04.ino | 136 ++++++++++++++++++++++++++++++++++--- 24 files changed, 174 insertions(+), 58 deletions(-) diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index 1ac26a0ea..c1daf8b21 100644 --- a/tasmota/language/bg-BG.h +++ b/tasmota/language/bg-BG.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h index 0417eb67b..c40cdb2b0 100644 --- a/tasmota/language/cs-CZ.h +++ b/tasmota/language/cs-CZ.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h index e5900b056..55c2eb8d0 100644 --- a/tasmota/language/de-DE.h +++ b/tasmota/language/de-DE.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h index 785d4d486..c9a57c635 100644 --- a/tasmota/language/el-GR.h +++ b/tasmota/language/el-GR.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h index 5e1ff19c1..6ff230746 100644 --- a/tasmota/language/en-GB.h +++ b/tasmota/language/en-GB.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h index 186635a66..a403369b7 100644 --- a/tasmota/language/es-ES.h +++ b/tasmota/language/es-ES.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h index 2a8835159..302dc41c1 100644 --- a/tasmota/language/fr-FR.h +++ b/tasmota/language/fr-FR.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h index ea8487d6d..f50128447 100644 --- a/tasmota/language/he-HE.h +++ b/tasmota/language/he-HE.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h index 6f978e7bb..d33b465d8 100644 --- a/tasmota/language/hu-HU.h +++ b/tasmota/language/hu-HU.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h index ad28b0d94..5d2d3e10f 100644 --- a/tasmota/language/it-IT.h +++ b/tasmota/language/it-IT.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h index 346db3154..28bb44b6d 100644 --- a/tasmota/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h index 9a752a963..75a990387 100644 --- a/tasmota/language/nl-NL.h +++ b/tasmota/language/nl-NL.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h index 19e8552ca..76415e599 100644 --- a/tasmota/language/pl-PL.h +++ b/tasmota/language/pl-PL.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h index 7e5b117a4..111ce5359 100644 --- a/tasmota/language/pt-BR.h +++ b/tasmota/language/pt-BR.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h index 2b36e9a09..af85629dc 100644 --- a/tasmota/language/pt-PT.h +++ b/tasmota/language/pt-PT.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h index e287c3b89..72a68753d 100644 --- a/tasmota/language/ru-RU.h +++ b/tasmota/language/ru-RU.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h index 9eb0e33dc..9042cf59e 100644 --- a/tasmota/language/sk-SK.h +++ b/tasmota/language/sk-SK.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h index 87559bee6..83078f9d0 100644 --- a/tasmota/language/sv-SE.h +++ b/tasmota/language/sv-SE.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h index c5f200c78..3999d9093 100644 --- a/tasmota/language/tr-TR.h +++ b/tasmota/language/tr-TR.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/uk-UK.h b/tasmota/language/uk-UK.h index 85483781d..64c806dfb 100644 --- a/tasmota/language/uk-UK.h +++ b/tasmota/language/uk-UK.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h index 915c42fc2..5c5c37379 100644 --- a/tasmota/language/zh-CN.h +++ b/tasmota/language/zh-CN.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h index 04fff0a37..9a40f2470 100644 --- a/tasmota/language/zh-TW.h +++ b/tasmota/language/zh-TW.h @@ -552,8 +552,8 @@ #define D_SENSOR_HPMA_TX "HPMA Tx" #define D_SENSOR_SBR_RX "SerBr Rx" #define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index e73e60aad..3f59c2dae 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -97,8 +97,8 @@ enum UserSelectablePins { GPIO_SDS0X1_RX, // Nova Fitness SDS011 Serial interface GPIO_SBR_TX, // Serial Bridge Serial interface GPIO_SBR_RX, // Serial Bridge Serial interface - GPIO_SR04_TRIG, // SR04 Trigger pin - GPIO_SR04_ECHO, // SR04 Echo pin + GPIO_SR04_TRIG, // SR04 Trigger/TX pin + GPIO_SR04_ECHO, // SR04 Echo/RX pin GPIO_SDM120_TX, // SDM120 Serial interface GPIO_SDM120_RX, // SDM120 Serial interface GPIO_SDM630_TX, // SDM630 Serial interface @@ -603,8 +603,8 @@ const uint8_t kGpioNiceList[] PROGMEM = { GPIO_RF_SENSOR, // Rf receiver with sensor decoding #endif #ifdef USE_SR04 - GPIO_SR04_TRIG, // SR04 Trigger pin - GPIO_SR04_ECHO, // SR04 Echo pin + GPIO_SR04_TRIG, // SR04 Tri/TXgger pin + GPIO_SR04_ECHO, // SR04 Ech/RXo pin #endif #ifdef USE_TM1638 GPIO_TM16CLK, // TM1638 Clock diff --git a/tasmota/xsns_22_sr04.ino b/tasmota/xsns_22_sr04.ino index e70fea52f..c3d27872e 100644 --- a/tasmota/xsns_22_sr04.ino +++ b/tasmota/xsns_22_sr04.ino @@ -20,6 +20,7 @@ #ifdef USE_SR04 #include +#include /*********************************************************************************************\ * HC-SR04, HC-SR04+, JSN-SR04T - Ultrasonic distance sensor * @@ -30,17 +31,129 @@ #define XSNS_22 22 -uint8_t sr04_echo_pin = 0; -uint8_t sr04_trig_pin = 0; +uint8_t sr04_type = 1; +int sr04_echo_pin = 0; +int sr04_trig_pin = 0; real64_t distance; NewPing* sonar = nullptr; +TasmotaSerial* sonar_serial = nullptr; + + + +uint8_t Sr04TModeDetect(void) +{ + sr04_type = 0; + if (pin[GPIO_SR04_ECHO]>=99) return sr04_type; -void Sr04Init(void) -{ sr04_echo_pin = pin[GPIO_SR04_ECHO]; - sr04_trig_pin = pin[GPIO_SR04_TRIG]; - sonar = new NewPing(sr04_trig_pin, sr04_echo_pin, 300); + sr04_trig_pin = (pin[GPIO_SR04_TRIG] < 99) ? pin[GPIO_SR04_TRIG] : -1; + sonar_serial = new TasmotaSerial(sr04_echo_pin, sr04_trig_pin, 1); + + if (sonar_serial->begin(9600,1)) { + DEBUG_SENSOR_LOG(PSTR("SR04: Detect mode")); + + if (sr04_trig_pin!=-1) { + sr04_type = (Sr04TMiddleValue(Sr04TMode3Distance(),Sr04TMode3Distance(),Sr04TMode3Distance())!=NO_ECHO)?3:1; + } else { + sr04_type = 2; + } + } else { + sr04_type = 1; + } + + if (sr04_type < 2) { + delete sonar_serial; + sonar_serial = nullptr; + sonar = new NewPing(sr04_trig_pin, sr04_echo_pin, 300); + } else { + if (sonar_serial->hardwareSerial()) { + ClaimSerial(); + } + } + + AddLog_P2(LOG_LEVEL_INFO,PSTR("SR04: Mode %d"), sr04_type); + return sr04_type; +} + +uint16_t Sr04TMiddleValue(uint16_t first, uint16_t second, uint16_t third) +{ + uint16_t ret = first; + if (first > second) { + first = second; + second = ret; + } + + if (third < first) { + return first; + } else if (third > second) { + return second; + } else { + return third; + } +} + +uint16_t Sr04TMode3Distance() { + + sonar_serial->write(0x55); + sonar_serial->flush(); + + return Sr04TMode2Distance(); +} + +uint16_t Sr04TMode2Distance(void) +{ + sonar_serial->setTimeout(300); + const char startByte = 0xff; + + if (!sonar_serial->find(startByte)) { + //DEBUG_SENSOR_LOG(PSTR("SR04: No start byte")); + return NO_ECHO; + } + + delay(5); + + uint8_t crc = sonar_serial->read(); + //read high byte + uint16_t distance = ((uint16_t)crc) << 8; + + //read low byte + distance += sonar_serial->read(); + crc += distance & 0x00ff; + crc += 0x00FF; + + //check crc sum + if (crc != sonar_serial->read()) { + AddLog_P2(LOG_LEVEL_ERROR,PSTR("SR04: Reading CRC error.")); + return NO_ECHO; + } + //DEBUG_SENSOR_LOG(PSTR("SR04: Distance: %d"), distance); + return distance; +} + +void Sr04TReading(void) { + + if (sonar_serial==nullptr && sonar==nullptr) { + Sr04TModeDetect(); + } + + switch (sr04_type) { + case 3: + distance = (real64_t)(Sr04TMiddleValue(Sr04TMode3Distance(),Sr04TMode3Distance(),Sr04TMode3Distance()))/ 10; //convert to cm + break; + case 2: + //empty input buffer first + while(sonar_serial->available()) sonar_serial->read(); + distance = (real64_t)(Sr04TMiddleValue(Sr04TMode2Distance(),Sr04TMode2Distance(),Sr04TMode2Distance()))/10; + break; + case 1: + distance = (real64_t)(sonar->ping_median(5))/ US_ROUNDTRIP_CM; + break; + default: + distance = NO_ECHO; + } + + return; } #ifdef USE_WEBSERVER @@ -49,8 +162,7 @@ const char HTTP_SNS_DISTANCE[] PROGMEM = #endif // USE_WEBSERVER void Sr04Show(bool json) -{ - distance = (real64_t)(sonar->ping_median(5))/ US_ROUNDTRIP_CM; +{ if (distance != 0) { // Check if read failed char distance_chr[33]; @@ -79,10 +191,14 @@ bool Xsns22(uint8_t function) { bool result = false; - if ((pin[GPIO_SR04_ECHO] < 99) && (pin[GPIO_SR04_TRIG] < 99)) { + if (sr04_type) { switch (function) { case FUNC_INIT: - Sr04Init(); + result = (pin[GPIO_SR04_ECHO]<99); + break; + case FUNC_EVERY_SECOND: + Sr04TReading(); + result = true; break; case FUNC_JSON_APPEND: Sr04Show(1);