#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