103 String LDR_VERSION =
"0.1.0";
109 unsigned long basePollRate = 500000L;
110 uint32_t pollRateMs = 2000;
111 uint32_t lastPollMs = 0;
112 bool bActive =
false;
114 double adRange = 4096.0;
116 double adRange = 1024.0;
120 enum FilterMode { FAST,
123 FilterMode filterMode;
124 ustd::sensorprocessor illuminanceSensor = ustd::sensorprocessor(4, 600, 0.005);
126 IlluminanceLdr(String name, uint8_t port, FilterMode filterMode = FilterMode::MEDIUM)
127 : name(name), port(port), filterMode(filterMode) {
133 setFilterMode(filterMode,
true);
146 void begin(Scheduler *_pSched, uint32_t _pollRateMs = 2000) {
149 pollRateMs = _pollRateMs;
151 auto ft = [=]() { this->loop(); };
152 tID = pSched->add(ft, name, basePollRate);
154 auto fnall = [=](String topic, String msg, String originator) {
155 this->subsMsg(topic, msg, originator);
157 pSched->subscribe(tID, name +
"/sensor/#", fnall);
161 void setFilterMode(FilterMode mode,
bool silent =
false) {
165 illuminanceSensor.update(1, 15, 0.001);
169 illuminanceSensor.update(4, 300, 0.005);
173 filterMode = LONGTERM;
174 illuminanceSensor.update(50, 600, 0.01);
182 void publishIlluminance() {
184 sprintf(buf,
"%5.3f", ldrvalue);
185 pSched->publish(name +
"/sensor/unitilluminance", buf);
188 void publishFilterMode() {
189 switch (filterMode) {
190 case FilterMode::FAST:
191 pSched->publish(name +
"/sensor/mode",
"FAST");
193 case FilterMode::MEDIUM:
194 pSched->publish(name +
"/sensor/mode",
"MEDIUM");
196 case FilterMode::LONGTERM:
197 pSched->publish(name +
"/sensor/mode",
"LONGTERM");
204 if (timeDiff(lastPollMs, millis()) >= pollRateMs) {
205 lastPollMs = millis();
206 double val = 1.0 - (analogRead(port) / (adRange - 1.0));
207 if (illuminanceSensor.filter(&val)) {
209 publishIlluminance();
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") {
220 }
else if (topic == name +
"/sensor/mode/set") {
221 if (msg ==
"fast" || msg ==
"FAST") {
222 setFilterMode(FilterMode::FAST);
224 if (msg ==
"medium" || msg ==
"MEDIUM") {
225 setFilterMode(FilterMode::MEDIUM);
227 setFilterMode(FilterMode::LONGTERM);
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