From ca59d233a605104d7509ded807a9f9d0365b1ab3 Mon Sep 17 00:00:00 2001 From: Jack Wilsdon Date: Wed, 5 Dec 2018 01:38:39 +0000 Subject: [PATCH] Add debouncing to pulse meter sensor --- code/espurna/config/sensors.h | 2 ++ code/espurna/sensor.ino | 1 + code/espurna/sensors/PulseMeterSensor.h | 14 +++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/code/espurna/config/sensors.h b/code/espurna/config/sensors.h index 02f0322e..518b43b9 100644 --- a/code/espurna/config/sensors.h +++ b/code/espurna/config/sensors.h @@ -601,6 +601,8 @@ #define PULSEMETER_INTERRUPT_ON FALLING #endif +#define PULSEMETER_DEBOUNCE 50 // Do not register pulses within less than 50 millis + //------------------------------------------------------------------------------ // PZEM004T based power monitor // Enable support by passing PZEM004T_SUPPORT=1 build flag diff --git a/code/espurna/sensor.ino b/code/espurna/sensor.ino index d38d37de..74b02ac0 100644 --- a/code/espurna/sensor.ino +++ b/code/espurna/sensor.ino @@ -645,6 +645,7 @@ void _sensorLoad() { PulseMeterSensor * sensor = new PulseMeterSensor(); sensor->setGPIO(PULSEMETER_PIN); sensor->setEnergyRatio(PULSEMETER_ENERGY_RATIO); + sensor->setDebounceTime(PULSEMETER_DEBOUNCE); _sensors.push_back(sensor); } #endif diff --git a/code/espurna/sensors/PulseMeterSensor.h b/code/espurna/sensors/PulseMeterSensor.h index f07e40ad..e8405cc1 100644 --- a/code/espurna/sensors/PulseMeterSensor.h +++ b/code/espurna/sensors/PulseMeterSensor.h @@ -43,6 +43,10 @@ class PulseMeterSensor : public BaseSensor { if (ratio > 0) _ratio = ratio; } + void setDebounceTime(unsigned long debounce) { + _debounce = debounce; + } + // --------------------------------------------------------------------- unsigned char getGPIO() { @@ -53,6 +57,10 @@ class PulseMeterSensor : public BaseSensor { return _ratio; } + unsigned long getDebounceTime() { + return _debounce; + } + // --------------------------------------------------------------------- // Sensors API // --------------------------------------------------------------------- @@ -113,7 +121,10 @@ class PulseMeterSensor : public BaseSensor { // Handle interrupt calls void ICACHE_RAM_ATTR handleInterrupt(unsigned char gpio) { - if (gpio == _gpio) { + static unsigned long last = 0; + + if (millis() - last > _debounce) { + last = millis(); _pulses++; } } @@ -151,6 +162,7 @@ class PulseMeterSensor : public BaseSensor { unsigned char _previous = GPIO_NONE; unsigned char _gpio = GPIO_NONE; unsigned long _ratio = PULSEMETER_ENERGY_RATIO; + unsigned long _debounce = PULSEMETER_DEBOUNCE; double _active = 0; double _energy = 0;