From d2ff52215c558f7310470d4a010a1353840f4e8d Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sun, 20 Oct 2019 08:23:27 +0200 Subject: [PATCH] sml counter debounce on both edges --- sonoff/xsns_53_sml.ino | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/sonoff/xsns_53_sml.ino b/sonoff/xsns_53_sml.ino index 4b74e7d73..158296e14 100644 --- a/sonoff/xsns_53_sml.ino +++ b/sonoff/xsns_53_sml.ino @@ -539,6 +539,9 @@ double buffer[MEDIAN_SIZE]; int8_t index; } sml_mf[MAX_VARS]; +#ifndef FLT_MAX +#define FLT_MAX 99999999 +#endif double sml_median_array(double *array,uint8_t len) { uint8_t ind[len]; @@ -1802,11 +1805,19 @@ void SML_CounterUpd4(void) ICACHE_RAM_ATTR; #endif // ARDUINO_ESP8266_RELEASE_2_3_0 void SML_CounterUpd(uint8_t index) { - uint32_t ltime=millis()-sml_counters[index].sml_counter_ltime; - sml_counters[index].sml_counter_ltime=millis(); - if (ltime>sml_counters[index].sml_debounce) { - RtcSettings.pulse_counter[index]++; - InjektCounterValue(sml_counters[index].sml_cnt_old_state,RtcSettings.pulse_counter[index]); + + uint8_t level=digitalRead(meter_desc_p[sml_counters[index].sml_cnt_old_state].srcpin); + if (!level) { + // falling edge + uint32_t ltime=millis()-sml_counters[index].sml_counter_ltime; + sml_counters[index].sml_counter_ltime=millis(); + if (ltime>sml_counters[index].sml_debounce) { + RtcSettings.pulse_counter[index]++; + InjektCounterValue(sml_counters[index].sml_cnt_old_state,RtcSettings.pulse_counter[index]); + } + } else { + // rising edge + sml_counters[index].sml_counter_ltime=millis(); } } @@ -2040,7 +2051,7 @@ init10: // check for irq mode if (meter_desc_p[meters].params<=0) { // init irq mode - attachInterrupt(meter_desc_p[meters].srcpin, counter_callbacks[cindex], FALLING); + attachInterrupt(meter_desc_p[meters].srcpin, counter_callbacks[cindex], CHANGE); sml_counters[cindex].sml_cnt_old_state=meters; sml_counters[cindex].sml_debounce=-meter_desc_p[meters].params; } @@ -2232,6 +2243,11 @@ void SML_Send_Seq(uint32_t meter,char *seq) { *ucp++=highByte(crc); slen+=4; } + if (script_meter_desc[meter].type=='o') { + for (uint32_t cnt=0;cntmeters_used) index=1; + if (index>0 && meter_desc_p[(index&7)-1].type=='c') { + index=0; + } + dump2log=index; ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"dump: %d\"}}"),dump2log); } else if (*cp=='c') { // set ounter