62 String RainAD_VERSION =
"0.1.0";
70 unsigned long basePollRate = 500000L;
71 uint32_t pollRateMs = 2000;
72 uint32_t lastPollMs = 0;
75 double adRange = 4096.0;
77 double adRange = 1024.0;
81 enum FilterMode { FAST,
84 FilterMode filterMode;
85 ustd::sensorprocessor rainSensor = ustd::sensorprocessor(4, 600, 0.005);
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);
108 void begin(Scheduler *_pSched, uint32_t _pollRateMs = 2000) {
111 pollRateMs = _pollRateMs;
113 auto ft = [=]() { this->loop(); };
114 tID = pSched->add(ft, name, basePollRate);
116 pinMode(digitalPort, INPUT_PULLUP);
117 digitalState = digitalRead(digitalPort);
119 auto fnall = [=](String topic, String msg, String originator) {
120 this->subsMsg(topic, msg, originator);
122 pSched->subscribe(tID, name +
"/sensor/#", fnall);
126 void setFilterMode(FilterMode mode,
bool silent =
false) {
130 rainSensor.update(1, 15, 0.001);
134 rainSensor.update(4, 300, 0.005);
138 filterMode = LONGTERM;
139 rainSensor.update(50, 600, 0.01);
149 sprintf(buf,
"%5.3f", RainADvalue);
150 pSched->publish(name +
"/sensor/unitrain", buf);
156 pSched->publish(name +
"/binary_sensor/rain", buf);
159 void publishFilterMode() {
160 switch (filterMode) {
161 case FilterMode::FAST:
162 pSched->publish(name +
"/sensor/mode",
"FAST");
164 case FilterMode::MEDIUM:
165 pSched->publish(name +
"/sensor/mode",
"MEDIUM");
167 case FilterMode::LONGTERM:
168 pSched->publish(name +
"/sensor/mode",
"LONGTERM");
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)) {
183 bool st = !digitalRead(digitalPort);
184 if (st != digitalState) {
188 if (hasChanged) publishRain();
193 void subsMsg(String topic, String msg, String originator) {
194 if (topic == name +
"/sensor/unitrain/get" || topic == name +
"/sensor/rain/get") {
196 }
else if (topic == name +
"/sensor/mode/get") {
198 }
else if (topic == name +
"/sensor/mode/set") {
199 if (msg ==
"fast" || msg ==
"FAST") {
200 setFilterMode(FilterMode::FAST);
202 if (msg ==
"medium" || msg ==
"MEDIUM") {
203 setFilterMode(FilterMode::MEDIUM);
205 setFilterMode(FilterMode::LONGTERM);
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