muwerk mupplet Sensor Library
muwerk applets; mupplets: functional units that support specific hardware or reusable applications for sensors
Loading...
Searching...
No Matches
mup_illuminance_ldr.h
1// mup_illuminance_ldr.h
2#pragma once
3
47#include "scheduler.h"
48#include "sensors.h"
49
50namespace ustd {
51
52// clang-format off
100// clang-format on
102 private:
103 String LDR_VERSION = "0.1.0";
104 Scheduler *pSched;
105 int tID;
106 String name;
107 uint8_t port;
108 double ldrvalue;
109 unsigned long basePollRate = 500000L;
110 uint32_t pollRateMs = 2000;
111 uint32_t lastPollMs = 0;
112 bool bActive = false;
113#ifdef __ESP32__
114 double adRange = 4096.0; // 12 bit default
115#else
116 double adRange = 1024.0; // 10 bit default
117#endif
118
119 public:
120 enum FilterMode { FAST,
121 MEDIUM,
122 LONGTERM };
123 FilterMode filterMode;
124 ustd::sensorprocessor illuminanceSensor = ustd::sensorprocessor(4, 600, 0.005);
125
126 IlluminanceLdr(String name, uint8_t port, FilterMode filterMode = FilterMode::MEDIUM)
127 : name(name), port(port), filterMode(filterMode) {
133 setFilterMode(filterMode, true);
134 }
135
137 }
138
143 return ldrvalue;
144 }
145
146 void begin(Scheduler *_pSched, uint32_t _pollRateMs = 2000) {
148 pSched = _pSched;
149 pollRateMs = _pollRateMs;
150
151 auto ft = [=]() { this->loop(); };
152 tID = pSched->add(ft, name, basePollRate);
153
154 auto fnall = [=](String topic, String msg, String originator) {
155 this->subsMsg(topic, msg, originator);
156 };
157 pSched->subscribe(tID, name + "/sensor/#", fnall);
158 bActive = true;
159 }
160
161 void setFilterMode(FilterMode mode, bool silent = false) {
162 switch (mode) {
163 case FAST:
164 filterMode = FAST;
165 illuminanceSensor.update(1, 15, 0.001);
166 break;
167 case MEDIUM:
168 filterMode = MEDIUM;
169 illuminanceSensor.update(4, 300, 0.005);
170 break;
171 case LONGTERM:
172 default:
173 filterMode = LONGTERM;
174 illuminanceSensor.update(50, 600, 0.01);
175 break;
176 }
177 if (!silent)
178 publishFilterMode();
179 }
180
181 private:
182 void publishIlluminance() {
183 char buf[32];
184 sprintf(buf, "%5.3f", ldrvalue);
185 pSched->publish(name + "/sensor/unitilluminance", buf);
186 }
187
188 void publishFilterMode() {
189 switch (filterMode) {
190 case FilterMode::FAST:
191 pSched->publish(name + "/sensor/mode", "FAST");
192 break;
193 case FilterMode::MEDIUM:
194 pSched->publish(name + "/sensor/mode", "MEDIUM");
195 break;
196 case FilterMode::LONGTERM:
197 pSched->publish(name + "/sensor/mode", "LONGTERM");
198 break;
199 }
200 }
201
202 void loop() {
203 if (bActive) {
204 if (timeDiff(lastPollMs, millis()) >= pollRateMs) {
205 lastPollMs = millis();
206 double val = 1.0 - (analogRead(port) / (adRange - 1.0));
207 if (illuminanceSensor.filter(&val)) {
208 ldrvalue = val;
209 publishIlluminance();
210 }
211 }
212 }
213 }
214
215 void subsMsg(String topic, String msg, String originator) {
216 if (topic == name + "/sensor/unitilluminance/get") {
217 publishIlluminance();
218 } else if (topic == name + "/sensor/mode/get") {
219 publishFilterMode();
220 } else if (topic == name + "/sensor/mode/set") {
221 if (msg == "fast" || msg == "FAST") {
222 setFilterMode(FilterMode::FAST);
223 } else {
224 if (msg == "medium" || msg == "MEDIUM") {
225 setFilterMode(FilterMode::MEDIUM);
226 } else {
227 setFilterMode(FilterMode::LONGTERM);
228 }
229 }
230 }
231 };
232}; // IlluminanceLdr
233
234} // namespace ustd
mupplet-sensor analog LDR illumance sensor
Definition: mup_illuminance_ldr.h:101
void begin(Scheduler *_pSched, uint32_t _pollRateMs=2000)
Definition: mup_illuminance_ldr.h:146
double getUnitIlluminance()
Definition: mup_illuminance_ldr.h:139
IlluminanceLdr(String name, uint8_t port, FilterMode filterMode=FilterMode::MEDIUM)
Definition: mup_illuminance_ldr.h:126