From ea99cdce5700e87f13218ce2729656b33e2f5cc5 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Thu, 20 Feb 2020 18:50:43 +0100 Subject: [PATCH] Add support for La Crosse TX23 Anemometer (#3146) --- tasmota/language/bg-BG.h | 2 +- tasmota/language/cs-CZ.h | 2 +- tasmota/language/de-DE.h | 2 +- tasmota/language/el-GR.h | 2 +- tasmota/language/en-GB.h | 2 +- tasmota/language/es-ES.h | 2 +- tasmota/language/fr-FR.h | 2 +- tasmota/language/he-HE.h | 2 +- tasmota/language/hu-HU.h | 2 +- tasmota/language/it-IT.h | 2 +- tasmota/language/ko-KO.h | 2 +- tasmota/language/nl-NL.h | 2 +- tasmota/language/pl-PL.h | 2 +- tasmota/language/pt-BR.h | 2 +- tasmota/language/pt-PT.h | 2 +- tasmota/language/ru-RU.h | 2 +- tasmota/language/sk-SK.h | 2 +- tasmota/language/sv-SE.h | 2 +- tasmota/language/tr-TR.h | 2 +- tasmota/language/uk-UA.h | 2 +- tasmota/language/zh-CN.h | 2 +- tasmota/language/zh-TW.h | 2 +- tasmota/my_user_config.h | 4 +- tasmota/support_features.ino | 2 +- tasmota/tasmota_post.h | 6 +- tasmota/tasmota_template.h | 8 +- tasmota/xsns_35_tx20.ino | 311 +++++++++++++++++++++++------------ 27 files changed, 241 insertions(+), 134 deletions(-) diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index 270300bf7..be2fceb3c 100644 --- a/tasmota/language/bg-BG.h +++ b/tasmota/language/bg-BG.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h index 8c47e47ab..6ef51f27d 100644 --- a/tasmota/language/cs-CZ.h +++ b/tasmota/language/cs-CZ.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h index 615020f33..e7e3c6a74 100644 --- a/tasmota/language/de-DE.h +++ b/tasmota/language/de-DE.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX20_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h index a73651d93..b3608bb7b 100644 --- a/tasmota/language/el-GR.h +++ b/tasmota/language/el-GR.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h index b9f03bacc..66a6e0243 100644 --- a/tasmota/language/en-GB.h +++ b/tasmota/language/en-GB.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h index 9b0b08888..59916f487 100644 --- a/tasmota/language/es-ES.h +++ b/tasmota/language/es-ES.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h index 455bec483..5356848d8 100644 --- a/tasmota/language/fr-FR.h +++ b/tasmota/language/fr-FR.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RF TX" #define D_SENSOR_RFRECV "RF RX" #define D_SENSOR_TUYA_TX "Tuya TX" diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h index 009191f54..fa3b07a31 100644 --- a/tasmota/language/he-HE.h +++ b/tasmota/language/he-HE.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h index 65de942cb..541d0c783 100644 --- a/tasmota/language/hu-HU.h +++ b/tasmota/language/hu-HU.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h index a8ab6f1c6..62127ef24 100644 --- a/tasmota/language/it-IT.h +++ b/tasmota/language/it-IT.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h index 9607cd9d5..2a20ce2d0 100644 --- a/tasmota/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h index 6602a7129..658f18547 100644 --- a/tasmota/language/nl-NL.h +++ b/tasmota/language/nl-NL.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h index 06bf65d06..e2d59a2dc 100644 --- a/tasmota/language/pl-PL.h +++ b/tasmota/language/pl-PL.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h index a896196b1..da386917c 100644 --- a/tasmota/language/pt-BR.h +++ b/tasmota/language/pt-BR.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h index 551f4767e..1f9c36a6b 100644 --- a/tasmota/language/pt-PT.h +++ b/tasmota/language/pt-PT.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h index b4708ac10..846a653ac 100644 --- a/tasmota/language/ru-RU.h +++ b/tasmota/language/ru-RU.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h index 5427059bc..f335ca42d 100644 --- a/tasmota/language/sk-SK.h +++ b/tasmota/language/sk-SK.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h index dea7e0210..9485c1f4e 100644 --- a/tasmota/language/sv-SE.h +++ b/tasmota/language/sv-SE.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h index 8fc13e0df..ee2a548ae 100644 --- a/tasmota/language/tr-TR.h +++ b/tasmota/language/tr-TR.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/uk-UA.h b/tasmota/language/uk-UA.h index 9365f68e7..98a352ea7 100644 --- a/tasmota/language/uk-UA.h +++ b/tasmota/language/uk-UA.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFRecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h index 019b679f4..c46d353ea 100644 --- a/tasmota/language/zh-CN.h +++ b/tasmota/language/zh-CN.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h index 5d7c00069..118aeb501 100644 --- a/tasmota/language/zh-TW.h +++ b/tasmota/language/zh-TW.h @@ -564,7 +564,7 @@ #define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_TX2X_TX "TX2x" #define D_SENSOR_RFSEND "RFSend" #define D_SENSOR_RFRECV "RFrecv" #define D_SENSOR_TUYA_TX "Tuya Tx" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index d641ac761..6c4af1e31 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -618,7 +618,9 @@ #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) -//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k code) +// Select none or only one of the below defines +//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+1k3 code) +//#define USE_TX23_WIND_SENSOR // Add support for La Crosse TX23 anemometer (+1k4 code) //#define USE_RC_SWITCH // Add support for RF transceiver using library RcSwitch (+2k7 code, 460 iram) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 85f5a77ea..ba1a2e465 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -367,7 +367,7 @@ void GetFeatures(void) #ifdef USE_PZEM_DC feature_sns2 |= 0x00001000; // xnrg_06_pzem_dc.ino #endif -#ifdef USE_TX20_WIND_SENSOR +#if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR) feature_sns2 |= 0x00002000; // xsns_35_tx20.ino #endif #ifdef USE_MGC3130 diff --git a/tasmota/tasmota_post.h b/tasmota/tasmota_post.h index c148efd9f..0d0b65d6e 100644 --- a/tasmota/tasmota_post.h +++ b/tasmota/tasmota_post.h @@ -212,7 +212,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #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) -//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k code) +//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+1k3 code) +//#define USE_TX23_WIND_SENSOR // Add support for La Crosse TX23 anemometer (+1k4 code) #define USE_RC_SWITCH // Add support for RF transceiver using library RcSwitch (+2k7 code, 460 iram) #define USE_RF_SENSOR // Add support for RF sensor receiver (434MHz or 868MHz) (+0k8 code) // #define USE_THEO_V2 // Add support for decoding Theo V2 sensors as documented on https://sidweb.nl using 434MHz RF sensor receiver (+1k4 code) @@ -404,6 +405,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer +#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer #undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch #undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code) #undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code) @@ -513,6 +515,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer +#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer #undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch #undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code) #undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code) @@ -625,6 +628,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer +#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer #undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch #undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code) #undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index b099eb49b..c4ee7b19d 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -128,7 +128,7 @@ enum UserSelectablePins { GPIO_SDS0X1_TX, // Nova Fitness SDS011 Serial interface GPIO_HX711_SCK, // HX711 Load Cell clock GPIO_HX711_DAT, // HX711 Load Cell data - GPIO_TX20_TXD_BLACK, // TX20 Transmission Pin + GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin GPIO_RFSEND, // RF transmitter GPIO_RFRECV, // RF receiver GPIO_TUYA_TX, // Tuya Serial interface @@ -267,7 +267,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_PZEM016_RX "|" D_SENSOR_PZEM017_RX "|" D_SENSOR_DFR562 "|" D_SENSOR_SDS0X1_TX "|" D_SENSOR_HX711_SCK "|" D_SENSOR_HX711_DAT "|" - D_SENSOR_TX20_TX "|" + D_SENSOR_TX2X_TX "|" D_SENSOR_RFSEND "|" D_SENSOR_RFRECV "|" D_SENSOR_TUYA_TX "|" D_SENSOR_TUYA_RX "|" D_SENSOR_MGC3130_XFER "|" D_SENSOR_MGC3130_RESET "|" @@ -721,8 +721,8 @@ const uint8_t kGpioNiceList[] PROGMEM = { #ifdef USE_PMS5003 GPIO_PMS5003, // Plantower PMS5003 Serial interface #endif -#ifdef USE_TX20_WIND_SENSOR - GPIO_TX20_TXD_BLACK, // TX20 Transmission Pin +#if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR) + GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin #endif #ifdef USE_MP3_PLAYER GPIO_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player Serial interface diff --git a/tasmota/xsns_35_tx20.ino b/tasmota/xsns_35_tx20.ino index 0c61392bc..850c7deda 100644 --- a/tasmota/xsns_35_tx20.ino +++ b/tasmota/xsns_35_tx20.ino @@ -1,7 +1,7 @@ /* - xsns_35_Tx20.ino - La Crosse Tx20 wind sensor support for Tasmota + xsns_35_Tx20.ino - La Crosse Tx20/Tx23 wind sensor support for Tasmota - Copyright (C) 2020 Thomas Eckerstorfer and Theo Arends + Copyright (C) 2020 Thomas Eckerstorfer, Norbert Richter 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 @@ -17,19 +17,31 @@ along with this program. If not, see . */ -#ifdef USE_TX20_WIND_SENSOR +#if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR) +#if defined(USE_TX20_WIND_SENSOR) && defined(USE_TX23_WIND_SENSOR) +#undef USE_TX20_WIND_SENSOR +#warning **** use USE_TX20_WIND_SENSOR or USE_TX23_WIND_SENSOR but not both together, TX20 disabled **** +#endif /*********************************************************************************************\ - * La Crosse Tx20 wind sensor + * La Crosse TX20/TX23 Anemometer * * based on https://github.com/bunnyhu/ESP8266_TX20_wind_sensor/ * http://blog.bubux.de/windsensor-tx20-mit-esp8266/ * https://www.john.geek.nz/2011/07/la-crosse-tx20-anemometer-communication-protocol/ + * http://www.rd-1000.com/chpm78/lacrosse/Lacrosse_TX23_protocol.html + * https://www.john.geek.nz/2012/08/la-crosse-tx23u-anemometer-communication-protocol/ + * + * TX23 RJ11 connection: + * 1 yellow - GND + * 2 green - NC + * 3 red - Vcc 3.3V + * 4 black/brown - TxD Signal (GPIOxx) \*********************************************************************************************/ #define XSNS_35 35 -#define TX20_BIT_TIME 1220 // microseconds -#define TX20_RESET_VALUES 60 // seconds +#define TX2X_BIT_TIME 1220 // microseconds +#define TX2X_RESET_VALUES 60 // seconds // The Arduino standard GPIO routines are not enough, // must use some from the Espressif SDK as well @@ -37,17 +49,21 @@ extern "C" { #include "gpio.h" } +#ifdef USE_TX20_WIND_SENSOR + #define D_TX2x_NAME "TX20" +#else + #define D_TX2x_NAME "TX23" +#endif + #ifdef USE_WEBSERVER - -const char HTTP_SNS_TX20[] PROGMEM = - "{s}TX20 " D_TX20_WIND_SPEED "{m}%s " D_UNIT_KILOMETER_PER_HOUR "{e}" - "{s}TX20 " D_TX20_WIND_SPEED_AVG "{m}%s " D_UNIT_KILOMETER_PER_HOUR "{e}" - "{s}TX20 " D_TX20_WIND_SPEED_MAX "{m}%s " D_UNIT_KILOMETER_PER_HOUR "{e}" - "{s}TX20 " D_TX20_WIND_DIRECTION "{m}%s{e}"; - +const char HTTP_SNS_TX2X[] PROGMEM = + "{s}" D_TX2x_NAME " " D_TX20_WIND_SPEED "{m}%s " D_UNIT_KILOMETER_PER_HOUR "{e}" + "{s}" D_TX2x_NAME " " D_TX20_WIND_SPEED_AVG "{m}%s " D_UNIT_KILOMETER_PER_HOUR "{e}" + "{s}" D_TX2x_NAME " " D_TX20_WIND_SPEED_MAX "{m}%s " D_UNIT_KILOMETER_PER_HOUR "{e}" + "{s}" D_TX2x_NAME " " D_TX20_WIND_DIRECTION "{m}%s (%s°){e}"; #endif // USE_WEBSERVER -const char kTx20Directions[] PROGMEM = D_TX20_NORTH "|" +const char kTx2xDirections[] PROGMEM = D_TX20_NORTH "|" D_TX20_NORTH D_TX20_NORTH D_TX20_EAST "|" D_TX20_NORTH D_TX20_EAST "|" D_TX20_EAST D_TX20_NORTH D_TX20_EAST "|" @@ -64,133 +80,218 @@ const char kTx20Directions[] PROGMEM = D_TX20_NORTH "|" D_TX20_NORTH D_TX20_WEST "|" D_TX20_NORTH D_TX20_NORTH D_TX20_WEST; -uint8_t tx20_sa = 0; -uint8_t tx20_sb = 0; -uint8_t tx20_sd = 0; -uint8_t tx20_se = 0; -uint16_t tx20_sc = 0; -uint16_t tx20_sf = 0; +uint8_t tx2x_sa = 0; +uint8_t tx2x_sb = 0; +uint8_t tx2x_sd = 0; +uint8_t tx2x_se = 0; +uint16_t tx2x_sc = 0; +uint16_t tx2x_sf = 0; -float tx20_wind_speed_kmh = 0; -float tx20_wind_speed_max = 0; -float tx20_wind_speed_avg = 0; -float tx20_wind_sum = 0; -int tx20_count = 0; -uint8_t tx20_wind_direction = 0; +float tx2x_wind_speed_kmh = 0; +float tx2x_wind_speed_max = 0; +float tx2x_wind_speed_avg = 0; +float tx2x_wind_sum = 0; +int tx2x_count = 0; +uint8_t tx2x_wind_direction = 0; -bool tx20_available = false; +bool tx2x_available = false; + +#ifdef USE_TX23_WIND_SENSOR +uint8_t tx23_stage = 0; +#endif #ifndef ARDUINO_ESP8266_RELEASE_2_3_0 // Fix core 2.5.x ISR not in IRAM Exception -void Tx20StartRead(void) ICACHE_RAM_ATTR; // As iram is tight and it works this way too +void TX2xStartRead(void) ICACHE_RAM_ATTR; // As iram is tight and it works this way too #endif // ARDUINO_ESP8266_RELEASE_2_3_0 -void Tx20StartRead(void) +void TX2xStartRead(void) { - /* La Crosse TX20 Anemometer datagram every 2 seconds + /** + * La Crosse TX20 Anemometer datagram every 2 seconds * 0-0 11011 0011 111010101111 0101 1100 000101010000 0-0 - Received pin data at 1200 uSec per bit * sa sb sc sd se sf * 00100 1100 000101010000 1010 1100 000101010000 - sa to sd inverted user data, LSB first - * sa - Start frame always 00100 + * sa - Start frame (invert) 00100 + * sb - Wind direction (invert) 0 - 15 + * sc - Wind speed 0 (invert) - 511 + * sd - Checksum (invert) + * se - Wind direction 0 - 15 + * sf - Wind speed 0 - 511 + * + * La Crosse TX23 Anemometer datagram after setting TxD to low/high + * 1-1 0 1 0-0 11011 0011 111010101111 0101 1100 000101010000 1-1 - Received pin data at 1200 uSec per bit + * t s c sa sb sc sd se sf + * 1 0 1-1 00100 1100 000101010000 1010 1100 000101010000 - sa to sd inverted user data, LSB first + * t - host pulls TxD low - signals TX23 to sent measurement + * s - TxD released - TxD is pulled high due to pullup + * c - TX23U pulls TxD low - calculation in progress + * sa - Start frame 11011 * sb - Wind direction 0 - 15 * sc - Wind speed 0 - 511 * sd - Checksum - * se - Wind direction 0 - 15 - * sf - Wind speed 0 - 511 + * se - Wind direction (invert) 0 - 15 + * sf - Wind speed (invert) 0 - 511 */ +#ifdef USE_TX23_WIND_SENSOR + if (0!=tx23_stage) + { + if ((2==tx23_stage) || (3==tx23_stage)) + { +#endif + tx2x_available = false; - tx20_available = false; + tx2x_sa = 0; + tx2x_sb = 0; + tx2x_sd = 0; + tx2x_se = 0; + tx2x_sc = 0; + tx2x_sf = 0; - tx20_sa = 0; - tx20_sb = 0; - tx20_sd = 0; - tx20_se = 0; - tx20_sc = 0; - tx20_sf = 0; + delayMicroseconds(TX2X_BIT_TIME / 2); - delayMicroseconds(TX20_BIT_TIME / 2); + for (int32_t bitcount = 41; bitcount > 0; bitcount--) { + uint8_t dpin = (digitalRead(pin[GPIO_TX2X_TXD_BLACK])); +#ifdef USE_TX23_WIND_SENSOR + if (bitcount > 41 - 5) { + // start + tx2x_sa = (tx2x_sa << 1) | (dpin); + } else if (bitcount > 41 - 5 - 4) { + // wind dir + tx2x_sb = tx2x_sb >> 1 | ((dpin) << 3); + } else if (bitcount > 41 - 5 - 4 - 12) { + // windspeed + tx2x_sc = tx2x_sc >> 1 | ((dpin) << 11); + } else if (bitcount > 41 - 5 - 4 - 12 - 4) { + // checksum + tx2x_sd = tx2x_sd >> 1 | ((dpin) << 3); + } else if (bitcount > 41 - 5 - 4 - 12 - 4 - 4) { + // wind dir (invert) + tx2x_se = tx2x_se >> 1 | ((dpin ^ 1) << 3); + } else { + // windspeed (invert) + tx2x_sf = tx2x_sf >> 1 | ((dpin ^ 1) << 11); + } +#else + if (bitcount > 41 - 5) { + // start frame (invert) + tx2x_sa = (tx2x_sa << 1) | (dpin ^ 1); + } else if (bitcount > 41 - 5 - 4) { + // wind dir (invert) + tx2x_sb = tx2x_sb >> 1 | ((dpin ^ 1) << 3); + } else if (bitcount > 41 - 5 - 4 - 12) { + // windspeed (invert) + tx2x_sc = tx2x_sc >> 1 | ((dpin ^ 1) << 11); + } else if (bitcount > 41 - 5 - 4 - 12 - 4) { + // checksum (invert) + tx2x_sd = tx2x_sd >> 1 | ((dpin ^ 1) << 3); + } else if (bitcount > 41 - 5 - 4 - 12 - 4 - 4) { + // wind dir + tx2x_se = tx2x_se >> 1 | (dpin << 3); + } else { + // windspeed + tx2x_sf = tx2x_sf >> 1 | (dpin << 11); + } +#endif + delayMicroseconds(TX2X_BIT_TIME); + } - for (int32_t bitcount = 41; bitcount > 0; bitcount--) { - uint8_t dpin = (digitalRead(pin[GPIO_TX20_TXD_BLACK])); - if (bitcount > 41 - 5) { - // start, inverted - tx20_sa = (tx20_sa << 1) | (dpin ^ 1); - } else if (bitcount > 41 - 5 - 4) { - // wind dir, inverted - tx20_sb = tx20_sb >> 1 | ((dpin ^ 1) << 3); - } else if (bitcount > 41 - 5 - 4 - 12) { - // windspeed, inverted - tx20_sc = tx20_sc >> 1 | ((dpin ^ 1) << 11); - } else if (bitcount > 41 - 5 - 4 - 12 - 4) { - // checksum, inverted - tx20_sd = tx20_sd >> 1 | ((dpin ^ 1) << 3); - } else if (bitcount > 41 - 5 - 4 - 12 - 4 - 4) { - // wind dir - tx20_se = tx20_se >> 1 | (dpin << 3); - } else { - // windspeed - tx20_sf = tx20_sf >> 1 | (dpin << 11); + uint8_t chk = (tx2x_sb + (tx2x_sc & 0xf) + ((tx2x_sc >> 4) & 0xf) + ((tx2x_sc >> 8) & 0xf)); + chk &= 0xf; + +#ifdef USE_TX23_WIND_SENSOR + // check checksum, non-inverted with inverted values and max. speed + if ((chk == tx2x_sd) && (tx2x_sb==tx2x_se) && (tx2x_sc==tx2x_sf) && (tx2x_sc < 511)) { + tx2x_available = true; + } +#else + if ((chk == tx2x_sd) && (tx2x_sc < 511)) { // if checksum seems to be ok and wind speed below 51.1 m/s + tx2x_available = true; + } +#endif +#ifdef USE_TX23_WIND_SENSOR } - - delayMicroseconds(TX20_BIT_TIME); + tx23_stage++; } +#endif - uint8_t chk = (tx20_sb + (tx20_sc & 0xf) + ((tx20_sc >> 4) & 0xf) + ((tx20_sc >> 8) & 0xf)); - chk &= 0xf; - - if ((chk == tx20_sd) && (tx20_sc < 400)) { // if checksum seems to be ok and wind speed below 40 m/s - tx20_available = true; - } -/* - if ((tx20_sb == tx20_se) && (tx20_sc == tx20_sf) && (tx20_sc < 400)) { - tx20_available = true; - } -*/ // Must clear this bit in the interrupt register, // it gets set even when interrupts are disabled - GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1 << pin[GPIO_TX20_TXD_BLACK]); + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1 << pin[GPIO_TX2X_TXD_BLACK]); } -void Tx20Read(void) +void Tx2xReset(void) { - if (!(uptime % TX20_RESET_VALUES)) { - tx20_count = 0; - tx20_wind_sum = 0; - tx20_wind_speed_max = 0; + tx2x_count = 0; + tx2x_wind_sum = 0; + tx2x_wind_speed_max = 0; +} + +void Tx2xRead(void) +{ +#ifdef USE_TX23_WIND_SENSOR + // note: TX23 speed calculation is unstable when conversion starts + // less than 2 seconds after last request + if ((uptime % 3)==0) { + // TX23 start transmission by pulling down TxD line for at minimum 500ms + // so we pull TxD signal to low every 3 seconds + tx23_stage = 0; + pinMode(pin[GPIO_TX2X_TXD_BLACK], OUTPUT); + digitalWrite(pin[GPIO_TX2X_TXD_BLACK], LOW); + } else if ((uptime % 3)==1) { + // after pulling down TxD every 3 second we pull-up TxD every 3+1 seconds + // to trigger start transmission + tx23_stage = 1; // first rising signal is invalid + pinMode(pin[GPIO_TX2X_TXD_BLACK], INPUT_PULLUP); } - else if (tx20_available) { - tx20_wind_speed_kmh = float(tx20_sc) * 0.36; - if (tx20_wind_speed_kmh > tx20_wind_speed_max) { - tx20_wind_speed_max = tx20_wind_speed_kmh; +#endif + if (0==Settings.tele_period && !(uptime % TX2X_RESET_VALUES)) { + Tx2xReset(); + } + else if (tx2x_available) { + // Wind speed spec: 0 to 180 km/h (0 to 50 m/s) + tx2x_wind_speed_kmh = float(tx2x_sc) * 0.36; + if (tx2x_wind_speed_kmh > tx2x_wind_speed_max) { + tx2x_wind_speed_max = tx2x_wind_speed_kmh; } - tx20_count++; - tx20_wind_sum += tx20_wind_speed_kmh; - tx20_wind_speed_avg = tx20_wind_sum / tx20_count; - tx20_wind_direction = tx20_sb; + tx2x_count++; + tx2x_wind_sum += tx2x_wind_speed_kmh; + tx2x_wind_speed_avg = tx2x_wind_sum / tx2x_count; + tx2x_wind_direction = tx2x_sb; } } -void Tx20Init(void) { - pinMode(pin[GPIO_TX20_TXD_BLACK], INPUT); - attachInterrupt(pin[GPIO_TX20_TXD_BLACK], Tx20StartRead, RISING); +void Tx2xInit(void) +{ +#ifdef USE_TX23_WIND_SENSOR + tx23_stage = 0; + pinMode(pin[GPIO_TX2X_TXD_BLACK], OUTPUT); + digitalWrite(pin[GPIO_TX2X_TXD_BLACK], LOW); +#else + pinMode(pin[GPIO_TX2X_TXD_BLACK], INPUT); +#endif + attachInterrupt(pin[GPIO_TX2X_TXD_BLACK], TX2xStartRead, RISING); } -void Tx20Show(bool json) +void Tx2xShow(bool json) { char wind_speed_string[33]; - dtostrfd(tx20_wind_speed_kmh, 2, wind_speed_string); + dtostrfd(tx2x_wind_speed_kmh, 1, wind_speed_string); char wind_speed_max_string[33]; - dtostrfd(tx20_wind_speed_max, 2, wind_speed_max_string); + dtostrfd(tx2x_wind_speed_max, 1, wind_speed_max_string); char wind_speed_avg_string[33]; - dtostrfd(tx20_wind_speed_avg, 2, wind_speed_avg_string); + dtostrfd(tx2x_wind_speed_avg, 1, wind_speed_avg_string); char wind_direction_string[4]; - GetTextIndexed(wind_direction_string, sizeof(wind_direction_string), tx20_wind_direction, kTx20Directions); + GetTextIndexed(wind_direction_string, sizeof(wind_direction_string), tx2x_wind_direction, kTx2xDirections); + char wind_direction_degree[33]; + dtostrfd(tx2x_wind_direction*22.5, 1, wind_direction_degree); if (json) { - ResponseAppend_P(PSTR(",\"TX20\":{\"Speed\":%s,\"SpeedAvg\":%s,\"SpeedMax\":%s,\"Direction\":\"%s\"}"), - wind_speed_string, wind_speed_avg_string, wind_speed_max_string, wind_direction_string); + ResponseAppend_P(PSTR(",\"" D_TX2x_NAME "\":{\"Speed\":%s,\"SpeedAvg\":%s,\"SpeedMax\":%s,\"Direction\":\"%s\",\"Degree\":%s}"), + wind_speed_string, wind_speed_avg_string, wind_speed_max_string, wind_direction_string, wind_direction_degree); + Tx2xReset(); #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_TX20, wind_speed_string, wind_speed_avg_string, wind_speed_max_string, wind_direction_string); + WSContentSend_PD(HTTP_SNS_TX2X, wind_speed_string, wind_speed_avg_string, wind_speed_max_string, wind_direction_string, wind_direction_degree); #endif // USE_WEBSERVER } } @@ -203,20 +304,20 @@ bool Xsns35(uint8_t function) { bool result = false; - if (pin[GPIO_TX20_TXD_BLACK] < 99) { + if (pin[GPIO_TX2X_TXD_BLACK] < 99) { switch (function) { case FUNC_INIT: - Tx20Init(); + Tx2xInit(); break; case FUNC_EVERY_SECOND: - Tx20Read(); + Tx2xRead(); break; case FUNC_JSON_APPEND: - Tx20Show(1); + Tx2xShow(1); break; #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: - Tx20Show(0); + Tx2xShow(0); break; #endif // USE_WEBSERVER } @@ -224,4 +325,4 @@ bool Xsns35(uint8_t function) return result; } -#endif // USE_TX20_WIND_SENSOR \ No newline at end of file +#endif // USE_TX20_WIND_SENSOR || USE_TX23_WIND_SENSOR \ No newline at end of file