diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index b56aa4beb..09f891f72 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 82b70438d..75736d41d 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index a5a537298..6e1764174 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index e457f7507..30ffdf40e 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Herzschlag" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index fceb42bd8..ac6e65ae8 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index f9dc18b83..2ce63356d 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -848,9 +848,10 @@ #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" #define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" -#define D_SENSOR_BL6523_TX "BL6523 Tx" -#define D_SENSOR_BL6523_RX "BL6523 Rx" +#define D_SENSOR_BL6523_TX "BL6523 Tx" +#define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 804029e77..76c2af828 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index de929c48e..55f8acd43 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index e122e17ab..e63b292bd 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 329dfedf3..855a31aa2 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index e33c9cede..91c278ce4 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index f8f824c70..684c8e4b7 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 - TX" #define D_SENSOR_BL6523_RX "BL6523 - RX" #define D_SENSOR_HEARTBEAT "Battito cardiaco" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 - SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 - RCLK" #define D_GPIO_SHIFT595_OE "74x595 - OE" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index e9228e5f8..3238fda0e 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index f44ac2d51..93eec0a0c 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index f628977f4..f9df4d5da 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 196d27625..59756bfe1 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index e96ce05b3..e8b0e1797 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index b6a02c466..7cdd4243f 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index c0484512f..bd5f301d6 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 2457d312b..30123fd11 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 8b821b66d..727ec7a6d 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index d0fc1c40a..331ab84ce 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index ab5821eed..ac14f8b10 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 3bf878c1a..b403d5ff4 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 2014b08e8..1f7e27e5a 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 0fc3c3b64..194f7d399 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -851,6 +851,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 4b673c930..e358c66a7 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -921,6 +921,19 @@ void MqttPublishTeleperiodSensor(void) { } } +void SkipSleep(bool state) { + if (state) { + TasmotaGlobal.skip_sleep += 2; + } else { + if (TasmotaGlobal.skip_sleep) { + TasmotaGlobal.skip_sleep--; + } + if (TasmotaGlobal.skip_sleep) { + TasmotaGlobal.skip_sleep--; + } + } +} + /*********************************************************************************************\ * State loops \*********************************************************************************************/ @@ -1045,6 +1058,10 @@ void Every100mSeconds(void) if (!TasmotaGlobal.latching_relay_pulse) SetLatchingRelay(0, 0); } + if (TasmotaGlobal.skip_sleep) { + TasmotaGlobal.skip_sleep--; // Clean up possible residue + } + for (uint32_t i = 0; i < MAX_PULSETIMERS; i++) { if (TasmotaGlobal.pulse_timer[i] != 0L) { // Timer active? if (TimeReached(TasmotaGlobal.pulse_timer[i])) { // Timer finished? diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index e7c2fa2f7..f9233885d 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -175,6 +175,7 @@ struct TasmotaGlobal_t { uint8_t latching_relay_pulse; // Latching relay pulse timer uint8_t active_device; // Active device in ExecuteCommandPower uint8_t sleep; // Current copy of Settings->sleep + uint8_t skip_sleep; // Abandon sleep and allow loop uint8_t leds_present; // Max number of LED supported uint8_t led_inverted; // LED inverted flag (1 = (0 = On, 1 = Off)) uint8_t led_power; // LED power state @@ -514,7 +515,7 @@ void BacklogLoop(void) { void SleepDelay(uint32_t mseconds) { if (!TasmotaGlobal.backlog_nodelay && mseconds) { uint32_t wait = millis() + mseconds; - while (!TimeReached(wait) && !Serial.available()) { // We need to service serial buffer ASAP as otherwise we get uart buffer overrun + while (!TimeReached(wait) && !Serial.available() && !TasmotaGlobal.skip_sleep) { // We need to service serial buffer ASAP as otherwise we get uart buffer overrun delay(1); } } else { @@ -594,7 +595,7 @@ void loop(void) { uint32_t my_activity = millis() - my_sleep; - if (Settings->flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep + if (Settings->flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep // yield(); // yield == delay(0), delay contains yield, auto yield in loop SleepDelay(TasmotaGlobal.sleep); // https://github.com/esp8266/Arduino/issues/2021 } else { diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 490ff9bdf..5fa49fc4d 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -184,6 +184,7 @@ enum UserSelectablePins { GPIO_CM11_TXD, GPIO_CM11_RXD, // CM11 Serial interface GPIO_BL6523_TX, GPIO_BL6523_RX, // BL6523 based Watt meter Serial interface GPIO_ADE7880_IRQ, // ADE7880 IRQ + GPIO_RESET, // Generic reset GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -407,6 +408,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_CM11_TX "|" D_SENSOR_CM11_RX "|" D_SENSOR_BL6523_TX "|" D_SENSOR_BL6523_RX "|" D_SENSOR_ADE7880_IRQ "|" + D_SENSOR_RESET "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -468,8 +470,9 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif AGPIO(GPIO_OUTPUT_HI), // Fixed output high AGPIO(GPIO_OUTPUT_LO), // Fixed output low - AGPIO(GPIO_HEARTBEAT), // Every second pulsed high - AGPIO(GPIO_HEARTBEAT_INV), // Every second pulsed low + AGPIO(GPIO_HEARTBEAT), // Every second pulsed high + AGPIO(GPIO_HEARTBEAT_INV), // Every second pulsed low + AGPIO(GPIO_RESET), // Generic reset #ifdef USE_FTC532 AGPIO(GPIO_FTC532), // FTC532 touch input #endif diff --git a/tasmota/xnrg_23_ade7880.ino b/tasmota/xnrg_23_ade7880.ino index 83a021bf7..56e7a5a22 100644 --- a/tasmota/xnrg_23_ade7880.ino +++ b/tasmota/xnrg_23_ade7880.ino @@ -12,7 +12,7 @@ /*********************************************************************************************\ * ADE7880 - Energy used in Shelly 3EM * - * {"NAME":"Shelly 3EM","GPIO":[1,1,544,1,32,8065,0,0,640,8064,608,224,0,0],"FLAG":0,"BASE":18} + * {"NAME":"Shelly 3EM","GPIO":[1,1,544,1,32,8065,0,0,640,8064,608,224,8096,0],"FLAG":0,"BASE":18} * * Based on datasheet from https://www.analog.com/en/products/ade7880.html * @@ -37,6 +37,7 @@ #define ADE7880_APHCAL_INIT 0xD895 // = 55445 (149) #define ADE7880_BPHCAL_INIT 0xD8A9 // = 55456 (169) #define ADE7880_CPHCAL_INIT 0xD89D // = 55453 (157) +//#define ADE7880_COMPMODE_FREQ 0x4000 // Connected to networks with fundamental frequencies between 55 Hz and 66 Hz. Default 45 Hz to 55 Hz enum Ade7880DspRegisters { ADE7880_AIGAIN = 0x4380, // 0x4380 R/W 24 32 ZPSE S 0x000000 Phase A current gain adjust. @@ -332,13 +333,13 @@ bool Ade7880Init(void) { if (bitSet(status1, 15)) { // RSTDONE // Power on or Reset Ade7880WriteVerify(ADE7880_CONFIG2, 0x02); // ADE7880_I2C_LOCK - Ade7880WriteVerify(ADE7880_STATUS1, 0x3FFE8930); // Acknowledge RSTDONE + Ade7880WriteVerify(ADE7880_STATUS1, 0x3FFE8930); // Acknowledge RSTDONE - Reset IRQ1 line status1 = Ade7880ReadVerify(ADE7880_STATUS1); // 0x01A00007 uint8_t version = Ade7880ReadVerify(ADE7880_Version); // 0x01 } - delayMicroseconds(240); + delayMicroseconds(240); // Grab parameters from flash/filesystem Ade7880WriteVerify(ADE7880_Gain, 0x0000); // Gain register set to 1 for current, and voltage Ade7880WriteVerify(ADE7880_APGAIN, ADE7880_APGAIN_INIT); @@ -354,20 +355,26 @@ bool Ade7880Init(void) { Ade7880WriteVerify(ADE7880_APHCAL, ADE7880_APHCAL_INIT); Ade7880WriteVerify(ADE7880_BPHCAL, ADE7880_BPHCAL_INIT); Ade7880WriteVerify(ADE7880_CPHCAL, ADE7880_CPHCAL_INIT); +#ifdef ADE7880_COMPMODE_FREQ + Ade7880WriteVerify(ADE7880_COMPMODE, 0x01FF | ADE7880_COMPMODE_FREQ); // Connected to networks with fundamental frequencies between 55 Hz and 66 Hz. Default is 45 Hz and 55 Hz. +#endif bool error = false; if (ADE7880_AVGAIN_INIT != Ade7880ReadVerify(ADE7880_AVGAIN)) { error = true; } - if (ADE7880_BVGAIN_INIT != Ade7880ReadVerify(ADE7880_BVGAIN)) { error = true; } - if (ADE7880_CVGAIN_INIT != Ade7880ReadVerify(ADE7880_CVGAIN)) { error = true; } - if (ADE7880_AIGAIN_INIT != Ade7880ReadVerify(ADE7880_AIGAIN)) { error = true; } - if (ADE7880_BIGAIN_INIT != Ade7880ReadVerify(ADE7880_BIGAIN)) { error = true; } - if (ADE7880_CIGAIN_INIT != Ade7880ReadVerify(ADE7880_CIGAIN)) { error = true; } - if (ADE7880_NIGAIN_INIT != Ade7880ReadVerify(ADE7880_NIGAIN)) { error = true; } - if (ADE7880_APGAIN_INIT != Ade7880ReadVerify(ADE7880_APGAIN)) { error = true; } - if (ADE7880_BPGAIN_INIT != Ade7880ReadVerify(ADE7880_BPGAIN)) { error = true; } - if (ADE7880_CPGAIN_INIT != Ade7880ReadVerify(ADE7880_CPGAIN)) { error = true; } - if (ADE7880_APHCAL_INIT != Ade7880ReadVerify(ADE7880_APHCAL)) { error = true; } - if (ADE7880_BPHCAL_INIT != Ade7880ReadVerify(ADE7880_BPHCAL)) { error = true; } - if (ADE7880_CPHCAL_INIT != Ade7880ReadVerify(ADE7880_CPHCAL)) { error = true; } + else if (ADE7880_BVGAIN_INIT != Ade7880ReadVerify(ADE7880_BVGAIN)) { error = true; } + else if (ADE7880_CVGAIN_INIT != Ade7880ReadVerify(ADE7880_CVGAIN)) { error = true; } + else if (ADE7880_AIGAIN_INIT != Ade7880ReadVerify(ADE7880_AIGAIN)) { error = true; } + else if (ADE7880_BIGAIN_INIT != Ade7880ReadVerify(ADE7880_BIGAIN)) { error = true; } + else if (ADE7880_CIGAIN_INIT != Ade7880ReadVerify(ADE7880_CIGAIN)) { error = true; } + else if (ADE7880_NIGAIN_INIT != Ade7880ReadVerify(ADE7880_NIGAIN)) { error = true; } + else if (ADE7880_APGAIN_INIT != Ade7880ReadVerify(ADE7880_APGAIN)) { error = true; } + else if (ADE7880_BPGAIN_INIT != Ade7880ReadVerify(ADE7880_BPGAIN)) { error = true; } + else if (ADE7880_CPGAIN_INIT != Ade7880ReadVerify(ADE7880_CPGAIN)) { error = true; } + else if (ADE7880_APHCAL_INIT != Ade7880ReadVerify(ADE7880_APHCAL)) { error = true; } + else if (ADE7880_BPHCAL_INIT != Ade7880ReadVerify(ADE7880_BPHCAL)) { error = true; } + else if (ADE7880_CPHCAL_INIT != Ade7880ReadVerify(ADE7880_CPHCAL)) { error = true; } +#ifdef ADE7880_COMPMODE_FREQ + else if ((0x01FF | ADE7880_COMPMODE_FREQ) != Ade7880ReadVerify(ADE7880_COMPMODE)) { error = true; } +#endif if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Error initializing parameters")); return false; @@ -400,16 +407,32 @@ bool Ade7880Init(void) { return true; } +bool Ade7880Service1(void) { + // Init sequence + SkipSleep(false); + bool result = Ade7880Init(); + Ade7880.irq1_state = 0; + return result; +} + +void IRAM_ATTR Ade7880Isr1(void) { + // Init sequence + if (!Ade7880.irq1_state) { + Ade7880.irq1_state = 1; + SkipSleep(true); + } +} + void Ade7880Cycle(void) { // Cycle sequence (takes 5ms) uint32_t status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0x000FEFE0 if (!bitSet(status0, 5)) { // LENERGY return; } else { - Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // Acknowledge LENERGY + Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // Acknowledge LENERGY - Reset IRQ0 line status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0x000FEFC0 } - if (Ade7880.cycle_count < 3) { + if (Ade7880.cycle_count < 2) { // Allow calibration stabilization Ade7880.cycle_count++; return; // Skip first two cycles } @@ -436,42 +459,30 @@ void Ade7880Cycle(void) { Ade7880.apparent_energy[1] = Ade7880ReadVerify(ADE7880_BVAHR); // 0xFFFFFFC7 Ade7880.apparent_energy[2] = Ade7880ReadVerify(ADE7880_CVAHR); // 0xFFFFFFC6 - uint16_t comp_mode = Ade7880ReadVerify(ADE7880_COMPMODE); // 0x01FF - - Ade7880.angle[0] = Ade7880ReadVerify(ADE7880_ANGLE0); // 0x13FD + uint16_t comp_mode = Ade7880ReadVerify(ADE7880_COMPMODE); // 0x01FF (or 0x41FF) = Angles between phase voltages and phase currents are measured + uint32_t fline = (bitSet(comp_mode, 14)) ? 60 : 50; // Line frequency in Hz + Ade7880.angle[0] = Ade7880ReadVerify(ADE7880_ANGLE0); // 0x13FD = cos(5117 * 360 * fline / 256000) = cos_phi Ade7880.angle[1] = Ade7880ReadVerify(ADE7880_ANGLE1); // 0x0706 Ade7880.angle[2] = Ade7880ReadVerify(ADE7880_ANGLE2); // 0x0859 -} -void Ade7880Reset(void) { - pinMode(16, OUTPUT); // Reset pin ADE7880 - digitalWrite(16, 0); - delay(1); - digitalWrite(16, 1); - pinMode(16, INPUT); -} - -void IRAM_ATTR Ade7880Isr0(void) { - // Poll sequence - if (!Ade7880.irq0_state) { Ade7880.irq0_state = 1; } + Energy.frequency[0] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD); // Page 34 and based on ADE7880_COMPMODE_FREQ + Energy.frequency[1] = 256000.0f / Ade7880ReadVerify(ADE7880_BPERIOD); + Energy.frequency[2] = 256000.0f / Ade7880ReadVerify(ADE7880_CPERIOD); } void Ade7880Service0(void) { // Poll sequence + SkipSleep(false); Ade7880Cycle(); Ade7880.irq0_state = 0; } -void IRAM_ATTR Ade7880Isr1(void) { - // Init sequence - if (!Ade7880.irq1_state) { Ade7880.irq1_state = 1; } -} - -bool Ade7880Service1(void) { - // Init sequence - bool result = Ade7880Init(); - Ade7880.irq1_state = 0; - return result; +void IRAM_ATTR Ade7880Isr0(void) { + // Poll sequence + if (!Ade7880.irq0_state) { + Ade7880.irq0_state = 1; + SkipSleep(true); + } } void Ade7880EnergyEverySecond(void) { @@ -490,7 +501,13 @@ void Ade7880DrvInit(void) { pinMode(Pin(GPIO_ADE7880_IRQ, 1), INPUT); attachInterrupt(Pin(GPIO_ADE7880_IRQ, 1), Ade7880Isr1, FALLING); - Ade7880Reset(); + int reset = Pin(GPIO_RESET); + if (-1 == reset) { reset = 16; } // Reset pin ADE7880 in Shelly 3EM + pinMode(reset, OUTPUT); + digitalWrite(reset, 0); + delay(1); + digitalWrite(reset, 1); + pinMode(reset, INPUT); uint32_t timeout = millis() + 400; while (!TimeReached(timeout)) { // Wait up to 400 mSec