-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathwatermeter.cpp
71 lines (64 loc) · 1.93 KB
/
watermeter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "espMQTT.h"
#include "watermeter.h"
uint32_t _watermeter_liters = 0;
double _watermeter_lmin = 0;
uint8_t _watermeter_pulsepin = 0;
uint8_t _watermeter_ledpin = 0;
uint32_t watermeter_getliters()
{
return _watermeter_liters;
}
void watermeter_setliters(uint32_t liters)
{
_watermeter_liters = liters;
}
double watermeter_getflow()
{
if (_watermeter_lmin <= 0.5)
{
_watermeter_lmin = 0;
}
return _watermeter_lmin;
}
void watermeter_init(uint8_t watermeter_pulsepin, uint8_t watermeter_ledpin, uint32_t watermeter_liters)
{
_watermeter_pulsepin = watermeter_pulsepin;
_watermeter_ledpin = watermeter_ledpin;
_watermeter_liters = watermeter_liters;
pinMode(_watermeter_pulsepin, INPUT);
pinMode(_watermeter_ledpin, OUTPUT);
digitalWrite(_watermeter_ledpin, digitalRead(_watermeter_pulsepin) ? 0 : 1);
}
bool watermeter_handle()
{
static long long lmincountdownmillis = 0;
static long long last_pulse_time = 0;
static bool oldinputpinstate = digitalRead(_watermeter_pulsepin);
bool inputpinstate = digitalRead(_watermeter_pulsepin);
bool returnvalue = false;
digitalWrite(_watermeter_ledpin, !inputpinstate);
if ((inputpinstate != oldinputpinstate) && (inputpinstate == 0))
{
long long pulse_time = millis() - last_pulse_time;
last_pulse_time = millis();
if (pulse_time > 1200) // Filter pulses less than 1200 ms which is more than 50l/min which is bouncing
{
_watermeter_lmin = double(60000) / pulse_time;
_watermeter_liters++;
lmincountdownmillis = millis() + (pulse_time * 2);
returnvalue = true;
}
}
oldinputpinstate = inputpinstate;
if ((_watermeter_lmin > 0.0) && (lmincountdownmillis < millis()))
{
_watermeter_lmin = _watermeter_lmin / 2;
lmincountdownmillis = millis() + (60000.0 / _watermeter_lmin) + 1000;
if (_watermeter_lmin <= 0.5)
{
_watermeter_lmin = 0;
}
returnvalue = true;
}
return returnvalue;
}