-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBinaryDistanceNode.cpp
More file actions
89 lines (76 loc) · 2.21 KB
/
BinaryDistanceNode.cpp
File metadata and controls
89 lines (76 loc) · 2.21 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "BinaryDistanceNode.hpp"
BinaryDistanceNode::BinaryDistanceNode(const char* name)
:
m_name(name),
m_lastTimeMeasure(0),
m_lastDistance(0),
m_measureInterval(0),
m_state(UNKNOWN),
m_availHysteresis(0),
m_availHysteresisDone(0),
m_unavailHysteresis(0),
m_unavailHysteresisDone(0),
m_unavailableThreshold(0)
{
m_statusNode = new HomieNode(name, "status");
}
void BinaryDistanceNode::begin(uint8_t triggerPin, uint8_t echoPin, long unavailableThreshold, long measureInterval, long measureHysteresis)
{
m_pPing = new NewPing(triggerPin, echoPin, 200);
m_unavailableThreshold = unavailableThreshold;
m_measureInterval = measureInterval;
m_availHysteresis = measureHysteresis;
m_unavailHysteresis = measureHysteresis;
}
void BinaryDistanceNode::setup()
{
m_statusNode->setProperty("distance").send(String(0));
m_statusNode->setProperty("state").send("unknown");
}
void BinaryDistanceNode::loop()
{
unsigned long now = millis();
if(now - m_lastTimeMeasure >= m_measureInterval * 1000UL || m_lastTimeMeasure == 0)
{
// ping 10 times and build median to filter out errors
unsigned long us = m_pPing->ping_median(10, 200);
unsigned long distance = m_pPing->convert_cm(us);
Homie.getLogger() << m_name << ": Distance is " << distance << "cm" << endl;
m_lastTimeMeasure = millis();
if(distance != m_lastDistance)
{
m_statusNode->setProperty("distance").send(String(distance));
m_lastDistance = distance;
}
if( (distance >= m_unavailableThreshold) || (distance == 0) )
{
// unavailable
m_unavailHysteresisDone++;
m_availHysteresisDone = 0;
}
else
{
// available
m_availHysteresisDone++;
m_unavailHysteresisDone = 0;
}
if(m_availHysteresisDone >= m_availHysteresis)
{
m_availHysteresisDone = 0;
if(m_state != AVAILABLE)
{
m_state = AVAILABLE;
m_statusNode->setProperty("state").send("available");
}
}
else if(m_unavailHysteresisDone >= m_unavailHysteresis)
{
m_unavailHysteresisDone = 0;
if(m_state != UNAVAILABLE)
{
m_state = UNAVAILABLE;
m_statusNode->setProperty("state").send("unavailable");
}
}
}
}