Release v0.4.0: complete rewrite #1
9 changed files with 209 additions and 9 deletions
10
.vscode/c_cpp_properties.json
vendored
10
.vscode/c_cpp_properties.json
vendored
|
@ -11,6 +11,9 @@
|
||||||
"/home/admar/Documents/Arduino/buienradarklok/Claire/include",
|
"/home/admar/Documents/Arduino/buienradarklok/Claire/include",
|
||||||
"/home/admar/Documents/Arduino/buienradarklok/Claire/src",
|
"/home/admar/Documents/Arduino/buienradarklok/Claire/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/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/Adafruit NeoPixel",
|
||||||
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/dESPatch",
|
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/dESPatch",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
|
"/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/RainMaker/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SD/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/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/SPIFFS/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/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/USB/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src",
|
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
|
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"browse": {
|
"browse": {
|
||||||
|
@ -251,6 +252,9 @@
|
||||||
"/home/admar/Documents/Arduino/buienradarklok/Claire/include",
|
"/home/admar/Documents/Arduino/buienradarklok/Claire/include",
|
||||||
"/home/admar/Documents/Arduino/buienradarklok/Claire/src",
|
"/home/admar/Documents/Arduino/buienradarklok/Claire/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/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/Adafruit NeoPixel",
|
||||||
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/dESPatch",
|
"/home/admar/Documents/Arduino/buienradarklok/Claire/.pio/libdeps/esp32dev/dESPatch",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
|
"/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/RainMaker/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SD/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/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/SPIFFS/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/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/USB/src",
|
||||||
"/home/admar/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/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
5
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"string_view": "cpp"
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,7 +16,7 @@ class Display {
|
||||||
ArduinoJson::V710PB22::JsonArray p_aqi);
|
ArduinoJson::V710PB22::JsonArray p_aqi);
|
||||||
void setPrecipitationForecastLeds(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_precipitation);
|
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 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 setWifiStatusLed(bool p_is_connected);
|
||||||
void setErrorLed(bool p_is_error);
|
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);
|
void setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white);
|
||||||
|
|
55
include/sensor_manager.hpp
Normal file
55
include/sensor_manager.hpp
Normal 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__
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef __WIFIHANDLER_HPP__
|
#ifndef __WIFI_HANDLER_HPP__
|
||||||
#define __WIFIHANDLER_HPP__
|
#define __WIFI_HANDLER_HPP__
|
||||||
|
|
||||||
#include <WiFiManager-esp32.h> // https://github.com/admarschoonen/WiFiManager
|
#include <WiFiManager-esp32.h> // https://github.com/admarschoonen/WiFiManager
|
||||||
|
|
||||||
|
@ -30,4 +30,4 @@ class WifiHandler {
|
||||||
WiFiManager m_wifiManager;
|
WiFiManager m_wifiManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __WIFIHANDLER_HPP__
|
#endif // __WIFI_HANDLER_HPP__
|
|
@ -19,3 +19,4 @@ lib_deps =
|
||||||
https://github.com/admarschoonen/dESPatch.git#v0.9.5
|
https://github.com/admarschoonen/dESPatch.git#v0.9.5
|
||||||
bblanchon/ArduinoJson@^7.1.0
|
bblanchon/ArduinoJson@^7.1.0
|
||||||
adafruit/Adafruit NeoPixel@^1.12.3
|
adafruit/Adafruit NeoPixel@^1.12.3
|
||||||
|
boschsensortec/BSEC Software Library@^1.8.1492
|
||||||
|
|
|
@ -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) {
|
void Display::setWifiStatusLed(bool p_is_connected) {
|
||||||
if (p_is_connected) {
|
if (p_is_connected) {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "../include/backend_communication.hpp"
|
#include "../include/backend_communication.hpp"
|
||||||
#include "../include/display.hpp"
|
#include "../include/display.hpp"
|
||||||
|
#include "../include/sensor_manager.hpp"
|
||||||
#include "../include/wifi_handler.hpp"
|
#include "../include/wifi_handler.hpp"
|
||||||
|
|
||||||
#ifndef LED_BUILTIN
|
#ifndef LED_BUILTIN
|
||||||
|
@ -28,6 +29,8 @@ WifiHandler wifi_handler(wifiHandlerFeedbackCb);
|
||||||
|
|
||||||
BackendCommunication backend_communication(wifi_handler);
|
BackendCommunication backend_communication(wifi_handler);
|
||||||
|
|
||||||
|
SensorManager sensor_manager;
|
||||||
|
|
||||||
void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status) {
|
void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status) {
|
||||||
static bool state = false;
|
static bool state = false;
|
||||||
|
|
||||||
|
@ -75,6 +78,8 @@ void setup() {
|
||||||
int x = dESPatch.configure(url, true, false, interval, false, root_ca);
|
int x = dESPatch.configure(url, true, false, interval, false, root_ca);
|
||||||
|
|
||||||
Serial.println(String(millis()) + " dESPatch.configure() returned with code " + String(x));
|
Serial.println(String(millis()) + " dESPatch.configure() returned with code " + String(x));
|
||||||
|
|
||||||
|
sensor_manager.setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop(void) {
|
void loop(void) {
|
||||||
|
@ -99,9 +104,13 @@ void loop(void) {
|
||||||
|
|
||||||
display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as<JsonArray>());
|
display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as<JsonArray>());
|
||||||
|
|
||||||
|
display.setLocalAirQualityLed(sensor_manager.data.staticIaq);
|
||||||
|
|
||||||
display.setWifiStatusLed(false);
|
display.setWifiStatusLed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sensor_manager.read();
|
||||||
|
|
||||||
display.show();
|
display.show();
|
||||||
dESPatch.checkForUpdate(true);
|
dESPatch.checkForUpdate(true);
|
||||||
|
|
||||||
|
|
100
src/sensor_manager.cpp
Normal file
100
src/sensor_manager.cpp
Normal 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;
|
||||||
|
}
|
Loading…
Reference in a new issue