muwerk mupplet Sensor Library
muwerk applets; mupplets: functional units that support specific hardware or reusable applications for sensors
Loading...
Searching...
No Matches
mup_rain_ad.h
1// mup_rain_ad.h
2#pragma once
3
4#include "scheduler.h"
5#include "sensors.h"
6
7namespace ustd {
8
9// clang-format off
59// clang-format on
60class RainAD {
61 private:
62 String RainAD_VERSION = "0.1.0";
63 Scheduler *pSched;
64 int tID;
65 String name;
66 uint8_t analogPort;
67 uint8_t digitalPort;
68 bool digitalState;
69 double RainADvalue;
70 unsigned long basePollRate = 500000L;
71 uint32_t pollRateMs = 2000;
72 uint32_t lastPollMs = 0;
73 bool bActive = false;
74#ifdef __ESP32__
75 double adRange = 4096.0; // 12 bit default
76#else
77 double adRange = 1024.0; // 10 bit default
78#endif
79
80 public:
81 enum FilterMode { FAST,
82 MEDIUM,
83 LONGTERM };
84 FilterMode filterMode;
85 ustd::sensorprocessor rainSensor = ustd::sensorprocessor(4, 600, 0.005);
86
87 RainAD(String name, uint8_t analogPort, uint8_t digitalPort, FilterMode filterMode = FilterMode::MEDIUM)
88 : name(name), analogPort(analogPort), digitalPort(digitalPort), filterMode(filterMode) {
95 setFilterMode(filterMode, true);
96 }
97
98 ~RainAD() {
99 }
100
101 double getUnitRain() {
105 return RainADvalue;
106 }
107
108 void begin(Scheduler *_pSched, uint32_t _pollRateMs = 2000) {
110 pSched = _pSched;
111 pollRateMs = _pollRateMs;
112
113 auto ft = [=]() { this->loop(); };
114 tID = pSched->add(ft, name, basePollRate);
115
116 pinMode(digitalPort, INPUT_PULLUP);
117 digitalState = digitalRead(digitalPort); // this is inverse logic, but we initialise with the opposite value to cause an initial publish...
118
119 auto fnall = [=](String topic, String msg, String originator) {
120 this->subsMsg(topic, msg, originator);
121 };
122 pSched->subscribe(tID, name + "/sensor/#", fnall);
123 bActive = true;
124 }
125
126 void setFilterMode(FilterMode mode, bool silent = false) {
127 switch (mode) {
128 case FAST:
129 filterMode = FAST;
130 rainSensor.update(1, 15, 0.001);
131 break;
132 case MEDIUM:
133 filterMode = MEDIUM;
134 rainSensor.update(4, 300, 0.005);
135 break;
136 case LONGTERM:
137 default:
138 filterMode = LONGTERM;
139 rainSensor.update(50, 600, 0.01);
140 break;
141 }
142 if (!silent)
143 publishFilterMode();
144 }
145
146 private:
147 void publishRain() {
148 char buf[32];
149 sprintf(buf, "%5.3f", RainADvalue);
150 pSched->publish(name + "/sensor/unitrain", buf);
151 if (digitalState) {
152 strcpy(buf, "ON");
153 } else {
154 strcpy(buf, "OFF");
155 }
156 pSched->publish(name + "/binary_sensor/rain", buf);
157 }
158
159 void publishFilterMode() {
160 switch (filterMode) {
161 case FilterMode::FAST:
162 pSched->publish(name + "/sensor/mode", "FAST");
163 break;
164 case FilterMode::MEDIUM:
165 pSched->publish(name + "/sensor/mode", "MEDIUM");
166 break;
167 case FilterMode::LONGTERM:
168 pSched->publish(name + "/sensor/mode", "LONGTERM");
169 break;
170 }
171 }
172
173 void loop() {
174 if (bActive) {
175 if (timeDiff(lastPollMs, millis()) >= pollRateMs) {
176 bool hasChanged = false;
177 lastPollMs = millis();
178 double val = 1.0 - (analogRead(analogPort) / (adRange - 1.0));
179 if (rainSensor.filter(&val)) {
180 RainADvalue = val;
181 hasChanged = true;
182 }
183 bool st = !digitalRead(digitalPort); // inverse logic.
184 if (st != digitalState) {
185 digitalState = st;
186 hasChanged = true;
187 }
188 if (hasChanged) publishRain();
189 }
190 }
191 }
192
193 void subsMsg(String topic, String msg, String originator) {
194 if (topic == name + "/sensor/unitrain/get" || topic == name + "/sensor/rain/get") {
195 publishRain();
196 } else if (topic == name + "/sensor/mode/get") {
197 publishFilterMode();
198 } else if (topic == name + "/sensor/mode/set") {
199 if (msg == "fast" || msg == "FAST") {
200 setFilterMode(FilterMode::FAST);
201 } else {
202 if (msg == "medium" || msg == "MEDIUM") {
203 setFilterMode(FilterMode::MEDIUM);
204 } else {
205 setFilterMode(FilterMode::LONGTERM);
206 }
207 }
208 }
209 };
210}; // rainAD
211
212} // namespace ustd
mupplet-sensor analog, digital rain sensor
Definition: mup_rain_ad.h:60
void begin(Scheduler *_pSched, uint32_t _pollRateMs=2000)
Definition: mup_rain_ad.h:108
RainAD(String name, uint8_t analogPort, uint8_t digitalPort, FilterMode filterMode=FilterMode::MEDIUM)
Definition: mup_rain_ad.h:87
double getUnitRain()
Definition: mup_rain_ad.h:101