95 lines
2.2 KiB
C++
95 lines
2.2 KiB
C++
#ifndef BMP280_H
|
|
#define BMP280_H
|
|
|
|
#include "Adafruit_BMP280.h"
|
|
#include "Adafruit_AHTX0.h"
|
|
#include "humidityRelative.h"
|
|
#include "mqtt.h"
|
|
|
|
class BMP280_AHT20 {
|
|
|
|
Adafruit_BMP280 sensor;
|
|
|
|
Adafruit_AHTX0 aht20;
|
|
|
|
unsigned long last = 0UL;
|
|
|
|
public:
|
|
|
|
const String name;
|
|
|
|
unsigned long intervalMs;
|
|
|
|
explicit BMP280_AHT20(String name, const unsigned long interval_ms = 5000) : name(std::move(name)), intervalMs(interval_ms) {
|
|
//
|
|
}
|
|
|
|
void setup() {
|
|
bmp280Setup();
|
|
aht20Setup();
|
|
}
|
|
|
|
void bmp280Setup() {
|
|
if (sensor.begin()) {
|
|
Log.info("BMP280 \"%s\": Initialized.", name.c_str());
|
|
sensor.setSampling(
|
|
Adafruit_BMP280::MODE_NORMAL,
|
|
Adafruit_BMP280::SAMPLING_X16,
|
|
Adafruit_BMP280::SAMPLING_X16,
|
|
Adafruit_BMP280::FILTER_X16,
|
|
Adafruit_BMP280::STANDBY_MS_500
|
|
);
|
|
} else {
|
|
Log.error("BMP280 \"%s\": Failed to initialize.", name.c_str());
|
|
}
|
|
}
|
|
|
|
void aht20Setup() {
|
|
if (aht20.begin()) {
|
|
Log.info("AHT20 \"%s\": Initialized.", name.c_str());
|
|
} else {
|
|
Log.error("AHT20 \"%s\": Failed to initialize.", name.c_str());
|
|
}
|
|
}
|
|
|
|
void loop() {
|
|
const auto now = max(1UL, millis());
|
|
if (last != 0 && now - last < intervalMs) {
|
|
return;
|
|
}
|
|
|
|
last = now;
|
|
bmp280Read();
|
|
aht20Read();
|
|
}
|
|
|
|
void bmp280Read() {
|
|
const auto pressure = sensor.readPressure();
|
|
if (isnan(pressure)) {
|
|
Log.error("BMP280 \"%s\": Failed to read", name.c_str());
|
|
bmp280Setup();
|
|
return;
|
|
}
|
|
|
|
mqttPublishValue(name + "/pressure", pressure / 100.0, "PRESSURE_HPA");
|
|
}
|
|
|
|
void aht20Read() {
|
|
sensors_event_t temperature{};
|
|
sensors_event_t relative{};
|
|
if (!aht20.getEvent(&relative, &temperature)) {
|
|
Log.error("AHT20 \"%s\": Failed to read", name.c_str());
|
|
aht20Setup();
|
|
return;
|
|
}
|
|
|
|
const auto absolute = calculateHumidityAbsolute(temperature.temperature, relative.relative_humidity);
|
|
mqttPublishValue(name + "/temperature", temperature.temperature, "TEMPERATURE_C");
|
|
mqttPublishValue(name + "/relative", relative.relative_humidity, "HUMIDITY_RELATIVE_PERCENT");
|
|
mqttPublishValue(name + "/absolute", absolute, "HUMIDITY_ABSOLUTE_GM3");
|
|
}
|
|
|
|
};
|
|
|
|
#endif
|