53 String AnalogSensor_VERSION =
"0.1.0";
59 double analogSensorValue;
60 double linTransA = 1.0;
61 double linTransB = 0.0;
62 unsigned long basePollRate = 500000L;
63 uint32_t pollRateMs = 2000;
64 uint32_t lastPollMs = 0;
66 bool initialPublish =
false;
68 double adRange = 4096.0;
70 double adRange = 1024.0;
74 enum FilterMode { FAST,
77 FilterMode filterMode;
78 ustd::sensorprocessor analogSensor = ustd::sensorprocessor(4, 600, 0.005);
80 AnalogSensor(String name, uint8_t analogPort, FilterMode filterMode = FilterMode::MEDIUM, String topicName =
"")
81 : name(name), analogPort(analogPort), topicName(topicName), filterMode(filterMode) {
88 setFilterMode(filterMode,
true);
98 return analogSensorValue;
101 void begin(Scheduler *_pSched, uint32_t _pollRateMs = 2000,
double _linTransA = 1.0,
double _linTransB = 0.0) {
118 pollRateMs = _pollRateMs;
119 linTransA = _linTransA;
120 linTransB = _linTransB;
121 initialPublish =
false;
123 auto ft = [=]() { this->loop(); };
124 tID = pSched->add(ft, name, basePollRate);
126 auto fnall = [=](String topic, String msg, String originator) {
127 this->subsMsg(topic, msg, originator);
129 pSched->subscribe(tID, name +
"/sensor/#", fnall);
130 pSched->subscribe(tID, name +
"/mqtt/state", fnall);
134 void setFilterMode(FilterMode mode,
bool silent =
false) {
138 analogSensor.update(1, 15, 0.001);
142 analogSensor.update(4, 300, 0.005);
146 filterMode = LONGTERM;
147 analogSensor.update(50, 600, 0.01);
155 void publishAnalogSensor() {
157 sprintf(buf,
"%5.3f", analogSensorValue);
158 pSched->publish(name +
"/sensor/unitanalogsensor", buf);
159 if (topicName !=
"unitanalogsensor" && topicName !=
"") {
160 pSched->publish(name +
"/sensor/" + topicName, buf);
164 void publishFilterMode() {
165 switch (filterMode) {
166 case FilterMode::FAST:
167 pSched->publish(name +
"/sensor/mode",
"FAST");
169 case FilterMode::MEDIUM:
170 pSched->publish(name +
"/sensor/mode",
"MEDIUM");
172 case FilterMode::LONGTERM:
173 pSched->publish(name +
"/sensor/mode",
"LONGTERM");
180 if (timeDiff(lastPollMs, millis()) >= pollRateMs || !initialPublish) {
181 bool hasChanged =
false;
182 lastPollMs = millis();
183 double val = analogRead(analogPort) / (adRange - 1.0);
184 if (val < 0.0) val = 0.0;
185 if (val > 1.0) val = 1.0;
186 if (linTransA != 1.0 || linTransB != 0.0) {
187 val = linTransA * val + linTransB;
189 if (analogSensor.filter(&val) || !initialPublish) {
190 analogSensorValue = val;
194 publishAnalogSensor();
195 initialPublish =
true;
201 void subsMsg(String topic, String msg, String originator) {
202 if (topic == name +
"/sensor/unitanalogsensor/get" || topic == name +
"/sensor/" + topicName +
"/get") {
203 publishAnalogSensor();
204 }
else if (topic == name +
"/sensor/mode/get") {
206 }
else if (topic == name +
"/sensor/mode/set") {
207 if (msg ==
"fast" || msg ==
"FAST") {
208 setFilterMode(FilterMode::FAST);
210 if (msg ==
"medium" || msg ==
"MEDIUM") {
211 setFilterMode(FilterMode::MEDIUM);
213 setFilterMode(FilterMode::LONGTERM);
216 }
else if (topic == name +
"mqtt/state") {
217 if (msg ==
"connected") {
218 initialPublish =
false;
mupplet-sensor analog sensor sensor
Definition: mup_analog_sensor.h:51
double getUnitAnalogSensor()
Definition: mup_analog_sensor.h:94
AnalogSensor(String name, uint8_t analogPort, FilterMode filterMode=FilterMode::MEDIUM, String topicName="")
Definition: mup_analog_sensor.h:80
void begin(Scheduler *_pSched, uint32_t _pollRateMs=2000, double _linTransA=1.0, double _linTransB=0.0)
Definition: mup_analog_sensor.h:101