diff --git a/main/peripherals/sensors/bme280.cpp b/main/peripherals/sensors/bme280.cpp index d27e4a4f5b66cd988a0db804df7bf3387271d3aa..b3722227d50bc52de8a620936e6e167672ac09b7 100644 --- a/main/peripherals/sensors/bme280.cpp +++ b/main/peripherals/sensors/bme280.cpp @@ -8,21 +8,47 @@ typedef struct { qthing::bme280_measure_callback_t callback; } bme280_config_t; -static bme280_config_t cfg; +static std::vector<bme280_config_t> cfgs; #include "esp_log.h" static void measured(void *ignored) { + std::string topic; + while (true) { + vTaskDelay(1000 / portTICK_PERIOD_MS); - bme280_reading_data data = cfg.bme280.readSensorData(); + for (std::vector<bme280_config_t>::iterator it = cfgs.begin(); it != cfgs.end(); ++it) { + bme280_config_t cfg = *it; - ESP_LOGE("BME280", "Temperature: %.2f°C, Humidity: %.2f%%, Pressure: %.2fPa\n", - (double) data.temperature, - (double) data.humidity, - (double) data.pressure - ); + bme280_reading_data _data = cfg.bme280.readSensorData(); + qthing::bme280_data_t data = {_data.temperature, _data.humidity, _data.pressure}; - vTaskDelay(1000 / portTICK_PERIOD_MS); + if (is_mqtt_connected()) { + char tmp[16]; + + sprintf(tmp, "%0.2f", data.temperature); + topic = std::string(DEVICE_NAMESPACE) + cfg.topic + std::string("/temperature"); + publish_message(topic, tmp); + + sprintf(tmp, "%0.2f", data.humidity); + topic = std::string(DEVICE_NAMESPACE) + cfg.topic + std::string("/humidity"); + publish_message(topic, tmp); + + sprintf(tmp, "%0.2f", data.pressure); + topic = std::string(DEVICE_NAMESPACE) + cfg.topic + std::string("/pressure"); + publish_message(topic, tmp); + } + + if (cfg.callback != NULL) { + cfg.callback(data); + } + + ESP_LOGI((std::string("BME280[") + cfg.topic + std::string("]")).c_str(), "T: %.2f°C RH: %.2f%% P: %.2fPa", + data.temperature, + data.humidity, + data.pressure + ); + } } } @@ -33,15 +59,21 @@ namespace qthing { bme280.setDebug(false); bme280.init(sda, scl); - cfg = { + bme280_config_t cfg = { topic, bme280, callback }; + cfgs.push_back(cfg); + if (!measured_started) { measured_started = true; xTaskCreate(measured, "bme280_measured", 10000, NULL, 1, NULL); } } + + void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, uint8_t address) { + add_bme280(sda, scl, topic, NULL, address); + } } diff --git a/main/peripherals/sensors/bme280.h b/main/peripherals/sensors/bme280.h index 6f2e0a937a40bcff0c29690726d0eec168d4785a..6d9265f5a5561346308cd6c87a9a4ba32e304e2a 100644 --- a/main/peripherals/sensors/bme280.h +++ b/main/peripherals/sensors/bme280.h @@ -1,6 +1,9 @@ # pragma once #include <qthing.h> +#include "mqtt_common.h" + +#include <vector> #include <string> #include "freertos/FreeRTOS.h" diff --git a/main/qthing.h b/main/qthing.h index a4e3b86baeec3fd9de5dd1db439e6d042371a5e0..ed07bc82ddc9cdb9f22bbc5f24cdcb1806d4d875 100644 --- a/main/qthing.h +++ b/main/qthing.h @@ -105,7 +105,7 @@ namespace qthing { typedef std::function<void(bme280_data_t)> bme280_measure_callback_t; - void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, qthing::bme280_measure_callback_t callback, uint8_t address = 0x76); + void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, qthing::bme280_measure_callback_t callback = NULL, uint8_t address = 0x76); } // utility