Files
AQS-FW/sensor.h

139 lines
2.9 KiB
C++

#pragma once
#include "Arduino.h"
#include "mqtt.h"
enum sensor_e
{
//PMS sensors
SP_1P0,
SP_2P5,
SP_10P0,
AE_1P0,
AE_2P5,
AE_10P0,
PPD_0P3,
PPD_0P5,
PPD_1P0,
PPD_2P5,
PPD_5P0,
PPD_10P0,
SCD30_temp,
SCD30_hum,
SCD30_co2,
SGP30_TVOC,
SGP30_eCO2,
SGP30_rawH2,
SGP30_rawEthanol,
sensor_last
};
class AQSSensor
{
char _topic[50];
char _topic_1h[50];
char _topic_24h[255];
const String _name;
const sensor_e _sensor;
const String _unit;
uint32_t _value;
RunningMedian _average1h;
RunningMedian _average24h;
bool _publish = false;
const uint32_t _scaleMin;
const uint32_t _scaleMax;
bool _valid;
public:
AQSSensor(String name, sensor_e sensor, String unit,
String deviceID, uint8_t avgSamples,
uint32_t scaleMin, uint32_t scaleMax)
: _name(name),
_sensor(sensor),
_unit(unit),
_average1h(avgSamples),
_average24h(avgSamples * 24),
_scaleMin(scaleMin),
_scaleMax(scaleMax)
{
sprintf(_topic, "Sensors/%s/%s", deviceID.c_str(), name.c_str());
sprintf(_topic_1h, "Sensors/%s/%s/1h/", deviceID.c_str(), name.c_str());
sprintf(_topic_24h, "Sensors/%s/%s/24h/", deviceID.c_str(), name.c_str());
_valid = false;
}
void publish(void)
{
if (_valid)
{
_publish = true;
}
else
{
Serial.printf("Sensor %s : Not published (invalid)\n", _name.c_str());
}
}
String
getName(void)
{
return _name;
}
void published(void)
{
_publish = false;
}
void publishMQTT(void)
{
if (_publish == true)
{
publishSingle(_value, _topic);
publishSingle(_average1h.getMedian(), _topic_1h);
publishSingle(_average24h.getMedian(), _topic_24h);
_publish = false;
}
}
virtual void set(uint32_t value)
{
if ((value > _scaleMin) && (value < _scaleMax))
{
_value = value;
_average1h.add(_value);
_average24h.add(_value);
_valid = true;
}
else
{
Serial.printf("Sensor %s set(%d): value out of bounds\n", _name.c_str(), _value);
_valid = false;
}
}
uint32_t value() { return _value; }
void print(void)
{
if (_publish)
{
Serial.printf("sensor: report: %s = %d\n", _name.c_str(), _value);
}
}
sensor_e getSensor(void) { return _sensor; }
String getUnit(void) { return _unit; }
uint32_t getMin(void) { return _scaleMin; }
uint32_t getMax(void) { return _scaleMax; }
};
void addSensorToList(AQSSensor *sensor);
void reportToSerial(void);
AQSSensor *getSensor(sensor_e sensor);
uint32_t getSensorValue(sensor_e sensor);
void initSensor(void);
void handleSensor(void);