Release v0.4.0: complete rewrite #1

Merged
admar merged 13 commits from Plus-Claire into main 2024-09-24 21:54:12 +02:00
9 changed files with 209 additions and 9 deletions
Showing only changes of commit 09dc9805bc - Show all commits

View file

@ -11,6 +11,9 @@
"/home/admar/Documents/Arduino/buienradarklok/Claire/include",
"/home/admar/Documents/Arduino/buienradarklok/Claire/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src",
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/BSEC Software Library/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/Adafruit NeoPixel",
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/dESPatch",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
@ -237,12 +240,10 @@
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SD/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/USB/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
""
],
"browse": {
@ -251,6 +252,9 @@
"/home/admar/Documents/Arduino/buienradarklok/Claire/include",
"/home/admar/Documents/Arduino/buienradarklok/Claire/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src",
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/BSEC Software Library/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/Adafruit NeoPixel",
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/dESPatch",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
@ -477,12 +481,10 @@
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SD/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/USB/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src",
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
""
]
},

5
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,5 @@
{
"files.associations": {
"string_view": "cpp"
}
}

View file

@ -16,7 +16,7 @@ class Display {
ArduinoJson::V710PB22::JsonArray p_aqi);
void setPrecipitationForecastLeds(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_precipitation);
void setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_uvi);
void setLocalAirQualityLed();
void setLocalAirQualityLed(float p_iaq);
void setWifiStatusLed(bool p_is_connected);
void setErrorLed(bool p_is_error);
void setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white);

View file

@ -0,0 +1,55 @@
#ifndef __SENSOR_MANAGER_HPP__
#define __SENSOR_MANAGER_HPP__
#include "bsec.h"
class SensorManager {
public:
// Public types
struct SensorData {
__typeof__(Bsec::iaq) iaq;
__typeof__(Bsec::iaqAccuracy) iaqAccuracy;
__typeof__(Bsec::staticIaq) staticIaq;
__typeof__(Bsec::co2Equivalent) co2Equivalent;
__typeof__(Bsec::breathVocEquivalent) breathVocEquivalent;
__typeof__(Bsec::rawTemperature) rawTemperature;
__typeof__(Bsec::pressure) pressure;
__typeof__(Bsec::rawHumidity) rawHumidity;
__typeof__(Bsec::gasResistance) gasResistance;
__typeof__(Bsec::stabStatus) stabStatus;
__typeof__(Bsec::runInStatus) runInStatus;
__typeof__(Bsec::temperature) temperature;
__typeof__(Bsec::humidity) humidity;
__typeof__(Bsec::gasPercentage) gasPercentage;
};
public:
// Constructor
SensorManager();
bool setup();
bool read();
public:
// Public members
SensorData data;
private:
bool checkIaqSensorStatus();
private:
// Private static members
constexpr static uint16_t m_NUM_LEDS_PROTO_V1 = 29U;
constexpr static int16_t m_DATA_PIN_PROTO_V1 = 14;
constexpr static uint8_t m_BME_CS = 5U;
constexpr static uint8_t m_BSEC_CONFIG_IAQ[] = {
#include "config/generic_33v_3s_4d/bsec_iaq.txt"
};
private:
// Private members
Bsec m_iaqSensor;
};
#endif // __SENSOR_MANAGER_HPP__

View file

@ -1,5 +1,5 @@
#ifndef __WIFIHANDLER_HPP__
#define __WIFIHANDLER_HPP__
#ifndef __WIFI_HANDLER_HPP__
#define __WIFI_HANDLER_HPP__
#include <WiFiManager-esp32.h> // https://github.com/admarschoonen/WiFiManager
@ -30,4 +30,4 @@ class WifiHandler {
WiFiManager m_wifiManager;
};
#endif // __WIFIHANDLER_HPP__
#endif // __WIFI_HANDLER_HPP__

View file

@ -19,3 +19,4 @@ lib_deps =
https://github.com/admarschoonen/dESPatch.git#v0.9.5
bblanchon/ArduinoJson@^7.1.0
adafruit/Adafruit NeoPixel@^1.12.3
boschsensortec/BSEC Software Library@^1.8.1492

View file

@ -72,7 +72,35 @@ void Display::setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::
}
}
void Display::setLocalAirQualityLed() {}
void Display::setLocalAirQualityLed(float p_iaq) {
float value = 0.0f;
if (p_iaq <= 50.0f) {
value = 1.0f; // Excellent
} else if (p_iaq <= 100.0f) {
value = 2.0f; // Good
} else if (p_iaq <= 125.0f) {
value = 4.0f;
} else if (p_iaq <= 150.0f) {
value = 4.0f; // Lightly polluted
} else if (p_iaq <= 175.0f) {
value = 5.0f;
} else if (p_iaq <= 200.0f) {
value = 6.0f; // Moderately polluted
} else if (p_iaq <= 225.0f) {
value = 7.0f;
} else if (p_iaq <= 250.0f) {
value = 8.0f; // Heavily polluted
} else if (p_iaq <= 300.0f) {
value = 9.0f;
} else if (p_iaq <= 350.0f) {
value = 10.0f; // Severely polluted
} else {
value = 11.0f; // Extremely polluted
}
setPixelToColorMappedValue(m_local_air_quality_map, value);
}
void Display::setWifiStatusLed(bool p_is_connected) {
if (p_is_connected) {

View file

@ -3,6 +3,7 @@
#include "../include/backend_communication.hpp"
#include "../include/display.hpp"
#include "../include/sensor_manager.hpp"
#include "../include/wifi_handler.hpp"
#ifndef LED_BUILTIN
@ -28,6 +29,8 @@ WifiHandler wifi_handler(wifiHandlerFeedbackCb);
BackendCommunication backend_communication(wifi_handler);
SensorManager sensor_manager;
void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status) {
static bool state = false;
@ -75,6 +78,8 @@ void setup() {
int x = dESPatch.configure(url, true, false, interval, false, root_ca);
Serial.println(String(millis()) + " dESPatch.configure() returned with code " + String(x));
sensor_manager.setup();
}
void loop(void) {
@ -99,9 +104,13 @@ void loop(void) {
display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as<JsonArray>());
display.setLocalAirQualityLed(sensor_manager.data.staticIaq);
display.setWifiStatusLed(false);
}
sensor_manager.read();
display.show();
dESPatch.checkForUpdate(true);

100
src/sensor_manager.cpp Normal file
View file

@ -0,0 +1,100 @@
#include <cstdint>
#include "../include/sensor_manager.hpp"
SensorManager::SensorManager() {
data = {};
return;
}
bool SensorManager::setup() {
SPI.begin();
m_iaqSensor.begin(m_BME_CS, SPI);
String output = "BSEC library version " + String(m_iaqSensor.version.major) + "." +
String(m_iaqSensor.version.minor) + "." + String(m_iaqSensor.version.major_bugfix) + "." +
String(m_iaqSensor.version.minor_bugfix);
Serial.println(output);
if (not checkIaqSensorStatus()) {
return false;
}
m_iaqSensor.setConfig(m_BSEC_CONFIG_IAQ);
m_iaqSensor.setTemperatureOffset(13.5f);
if (not checkIaqSensorStatus()) {
return false;
}
bsec_virtual_sensor_t sensorList[13] = {BSEC_OUTPUT_IAQ,
BSEC_OUTPUT_STATIC_IAQ,
BSEC_OUTPUT_CO2_EQUIVALENT,
BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
BSEC_OUTPUT_RAW_TEMPERATURE,
BSEC_OUTPUT_RAW_PRESSURE,
BSEC_OUTPUT_RAW_HUMIDITY,
BSEC_OUTPUT_RAW_GAS,
BSEC_OUTPUT_STABILIZATION_STATUS,
BSEC_OUTPUT_RUN_IN_STATUS,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
BSEC_OUTPUT_GAS_PERCENTAGE};
m_iaqSensor.updateSubscription(sensorList, 13, BSEC_SAMPLE_RATE_LP);
if (checkIaqSensorStatus()) {
return false;
}
return true;
}
bool SensorManager::read() {
if (m_iaqSensor.run()) { // If new data is available
data.iaq = m_iaqSensor.iaq;
data.iaqAccuracy = m_iaqSensor.iaqAccuracy;
data.staticIaq = m_iaqSensor.staticIaq;
data.co2Equivalent = m_iaqSensor.co2Equivalent;
data.breathVocEquivalent = m_iaqSensor.breathVocEquivalent;
data.rawTemperature = m_iaqSensor.rawTemperature;
data.pressure = m_iaqSensor.pressure;
data.rawHumidity = m_iaqSensor.rawHumidity;
data.gasResistance = m_iaqSensor.gasResistance;
data.stabStatus = m_iaqSensor.stabStatus;
data.runInStatus = m_iaqSensor.runInStatus;
data.temperature = m_iaqSensor.temperature;
data.humidity = m_iaqSensor.humidity;
data.gasPercentage = m_iaqSensor.gasPercentage;
} else {
Serial.println("sensor status: " + String(checkIaqSensorStatus()));
}
return true;
}
bool SensorManager::checkIaqSensorStatus() {
if (m_iaqSensor.bsecStatus != BSEC_OK) {
if (m_iaqSensor.bsecStatus < BSEC_OK) {
Serial.println("BSEC error code: " + String(m_iaqSensor.bsecStatus));
return false;
} else {
Serial.println("BSEC warning code: " + String(m_iaqSensor.bsecStatus));
return false;
}
}
if (m_iaqSensor.bme68xStatus != BME68X_OK) {
if (m_iaqSensor.bme68xStatus < BME68X_OK) {
Serial.println("BME68X error code: " + String(m_iaqSensor.bme68xStatus));
return false;
} else {
Serial.println("BME68X warning code: " + String(m_iaqSensor.bme68xStatus));
return false;
}
}
return true;
}