Compare commits

...

9 Commits
V0.1.8 ... main

1 changed files with 121 additions and 48 deletions

View File

@ -2,7 +2,15 @@
#define HW_PROTO_PAPER 1
#define HW_PROTO_V1 2
#include <WiFiManager.h> // https://github.com/admarschoonen/WiFiManager
#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif
#ifndef BUTTON_BUILTIN
#define BUTTON_BUILTIN 0
#endif
#include <WiFiManager-esp32.h> // https://github.com/admarschoonen/WiFiManager
#include <dESPatch.h>
#include <WiFi.h>
@ -12,6 +20,13 @@
#include <Adafruit_NeoPixel.h>
#include "bsec.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif
#define NUM_LEDS_PROTO_PAPER 93
#define DATA_PIN_PROTO_PAPER 5
#define CONNECT_SW_PIN_PROTO_PAPER BUTTON_BUILTIN
@ -30,6 +45,7 @@ static int AQI_LED = 0;
static int POLLEN_LED = 0;
static int IAQI_LED = 0;
static int CONNECT_SW_PIN = 0;
static int LIGHT_PIN = 0;
#define SHOW_AQI_LED
#define SHOW_POLLEN_LED
@ -40,6 +56,10 @@ static int CONNECT_SW_PIN = 0;
Adafruit_NeoPixel leds_rgb_proto_paper(NUM_LEDS_PROTO_PAPER, DATA_PIN_PROTO_PAPER, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel leds_rgbw_proto_v1(NUM_LEDS_PROTO_V1, DATA_PIN_PROTO_V1, NEO_RGBW + NEO_KHZ800);
const uint8_t bsec_config_iaq[] = {
#include "config/generic_33v_3s_4d/bsec_iaq.txt"
};
static int ledMapPrecipitation[12] = {0};
static int ledMapPAQI[12] = {0};
static int ledMapUVI = 0;
@ -53,8 +73,8 @@ String output;
Bsec iaqSensor;
static HTTPClient http;
static const String baseUrlAQI = "http://target.luon.net:2356//forecast?&metrics=PAQI&metrics=AQI&metrics=pollen&metrics=UVI";
static const String baseUrlPrecipitation = "http://target.luon.net:2356//forecast?metrics=precipitation";
static const String baseUrlAQI = "https://sinoptik.luon.net/forecast?metrics=PAQI&metrics=AQI&metrics=pollen&metrics=UVI";
static const String baseUrlPrecipitation = "https://sinoptik.luon.net/forecast?metrics=precipitation";
static int hw_variant = 0;
@ -62,26 +82,39 @@ WiFiManager wifiManager;
DESPatch dESPatch;
const char* root_ca = \
"-----BEGIN CERTIFICATE-----\n" \
"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\n" \
"-----END CERTIFICATE-----\n";
const float location[] = {51.445466493287434, 5.515445691496135}; // Telefoonstraat, Eindhoven
const String address = "Telefoonstraat 18, Eindhoven";
@ -263,6 +296,10 @@ static void setup_pins_proto_v1(void)
ledMapUVI = UVI_LED;
ledMapPollen = POLLEN_LED;
ledMapIAQI = IAQI_LED;
LIGHT_PIN = 34;
analogSetPinAttenuation(LIGHT_PIN, ADC_0db);
analogReadResolution(12);
}
void leds_clear(void) {
@ -277,29 +314,29 @@ void leds_clear(void) {
int checkIaqSensorStatus(void)
{
if (iaqSensor.status != BSEC_OK) {
if (iaqSensor.status < BSEC_OK) {
output = "BSEC error code : " + String(iaqSensor.status);
if (iaqSensor.bsecStatus != BSEC_OK) {
if (iaqSensor.bsecStatus < BSEC_OK) {
output = "BSEC error code : " + String(iaqSensor.bsecStatus);
Serial.println(output);
//for (;;);
} else {
output = "BSEC warning code : " + String(iaqSensor.status);
output = "BSEC warning code : " + String(iaqSensor.bsecStatus);
Serial.println(output);
}
}
if (iaqSensor.bme680Status != BME680_OK) {
if (iaqSensor.bme680Status < BME680_OK) {
output = "BME680 error code : " + String(iaqSensor.bme680Status);
if (iaqSensor.bme68xStatus != BME68X_OK) {
if (iaqSensor.bme68xStatus < BME68X_OK) {
output = "BME680 error code : " + String(iaqSensor.bme68xStatus);
Serial.println(output);
//for (;;);
} else {
output = "BME680 warning code : " + String(iaqSensor.bme680Status);
output = "BME680 warning code : " + String(iaqSensor.bme68xStatus);
Serial.println(output);
}
}
return iaqSensor.bme680Status;
return iaqSensor.bme68xStatus;
}
void readSensors(void) {
@ -313,18 +350,25 @@ void readSensors(void) {
unsigned long time_trigger = millis();
if (iaqSensor.run()) { // If new data is available
output = String(time_trigger);
output += " ms, Traw: " + String(iaqSensor.rawTemperature);
output += " Sensor data: Traw: " + String(iaqSensor.rawTemperature);
output += " *C , P: " + String(iaqSensor.pressure);
output += " hPa, RHraw: " + String(iaqSensor.rawHumidity);
output += " %, Rgas: " + String(iaqSensor.gasResistance);
output += " Ohm, IAQ: " + String(iaqSensor.iaq);
output += ", accuracy: " + String(iaqSensor.iaqAccuracy);
output += ", Tcorr: " + String(iaqSensor.temperature);
output += " *C, RHcorr" + String(iaqSensor.humidity);
output += " %, IAQ static" + String(iaqSensor.staticIaq);
output += " *C, RHcorr: " + String(iaqSensor.humidity);
output += " %, IAQstatic: " + String(iaqSensor.staticIaq);
output += ", eCO2: " + String(iaqSensor.co2Equivalent);
output += " ppm, eVOC: " + String(iaqSensor.breathVocEquivalent);
output += " ppm";
int light = 0;
for (int n = 0; n < 256; n++) {
light += analogRead(LIGHT_PIN);
}
light = (light + 128) >> 8;
output += ", light: " + String(light);
Serial.println(output);
} else {
checkIaqSensorStatus();
@ -351,25 +395,33 @@ void setup() {
unsigned long interval = 60; // By default check for updates every 60 seconds
int x;
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Disable brownout; needed for some dev kits
// sanity check delay - allows reprogramming if accidently blowing power w/leds
delay(2000);
Serial.begin(115200);
Serial.println("buienradarklok starting");
http.setReuse(false);
SPI.begin();
iaqSensor.begin(BME_CS, SPI);
String output = "\nBSEC library version " + String(iaqSensor.version.major) + "." + String(iaqSensor.version.minor) + "." + String(iaqSensor.version.major_bugfix) + "." + String(iaqSensor.version.minor_bugfix);
Serial.println(output);
x = checkIaqSensorStatus();
if (x != BME680_OK) {
if (x != BME68X_OK) {
Serial.println(F("Could not find a valid BME680 sensor; assuming hw variant \"paper prototype\"!"));
hw_variant = HW_PROTO_PAPER;
setup_pins_proto_paper();
leds_rgb_proto_paper.begin(); // INITIALIZE NeoPixel strip object
} else {
Serial.println(F("BME680 found; assuming hw variant \"proto v1\""));
iaqSensor.setConfig(bsec_config_iaq);
iaqSensor.setTemperatureOffset(13.5f);
checkIaqSensorStatus();
hw_variant = HW_PROTO_V1;
setup_pins_proto_v1();
@ -401,7 +453,7 @@ void setup() {
#ifndef DISABLE_WIFI
//wifiManager.resetSettings();
wifiManager.configure("Claire-", true, LED_BUILTIN, true, CONNECT_SW_PIN, false);
//fetches ssid and pass and tries to connect
//if it does not connect it starts an access point
//and goes into a blocking loop awaiting configuration
@ -482,17 +534,19 @@ void getPrecipitation(const float * location) {
url = baseUrlPrecipitation + "&lat=" + latS + "&lon=" + lonS;
Serial.print(millis());
Serial.print(" Retrieving precipitation from ");
Serial.println(url);
http.begin(url);
http.begin(url, root_ca);
httpCode = http.GET();
if (httpCode > 0) {
payload = http.getString();
parseJson(&payload);
} else {
Serial.print(__func__);
Serial.print("(): got http code ");
Serial.print(millis());
Serial.print(" Got http code ");
Serial.println(httpCode);
}
http.end();
@ -508,17 +562,19 @@ void getPrecipitation(const String address) {
url = baseUrlPrecipitation + "&address=" + a;
Serial.print(millis());
Serial.print(" Retrieving precipitation from ");
Serial.println(url);
http.begin(url);
http.begin(url, root_ca);
httpCode = http.GET();
if (httpCode > 0) {
payload = http.getString();
parseJson(&payload);
} else {
Serial.print(__func__);
Serial.print("(): got http code ");
Serial.print(millis());
Serial.print(" Got http code ");
Serial.println(httpCode);
}
http.end();
@ -540,17 +596,19 @@ void getAQI(const float * location) {
url = baseUrlAQI + "&lat=" + latS + "&lon=" + lonS;
Serial.print(millis());
Serial.print(" Retrieving AQI from ");
Serial.println(url);
http.begin(url);
http.begin(url, root_ca);
httpCode = http.GET();
if (httpCode > 0) {
payload = http.getString();
parseJson(&payload);
} else {
Serial.print(__func__);
Serial.print("(): got http code ");
Serial.print(millis());
Serial.print(" Got http code ");
Serial.println(httpCode);
}
http.end();
@ -566,17 +624,19 @@ void getAQI(const String address) {
url = baseUrlAQI + "&address=" + a;
Serial.print(millis());
Serial.print(" Retrieving AQI from ");
Serial.println(url);
http.begin(url);
http.begin(url, root_ca);
httpCode = http.GET();
if (httpCode > 0) {
payload = http.getString();
parseJson(&payload);
} else {
Serial.print(__func__);
Serial.print("(): got http code ");
Serial.print(millis());
Serial.print(" Got http code ");
Serial.println(httpCode);
}
http.end();
@ -631,7 +691,7 @@ static int colormap(float x) {
float colormapIaqi(void)
{
float x = 0.0f;
float iaqi = iaqSensor.iaq;
float iaqi = iaqSensor.staticIaq;
if (iaqi <= 50.0f) {
x = 1.0f; // Excellent
@ -952,6 +1012,19 @@ void loop(void) {
firstTime = false;
#ifndef DISABLE_WIFI
if (WiFi.status() != WL_CONNECTED) {
Serial.print(millis());
Serial.print(" wifi status error: ");
Serial.print(WiFi.status());
Serial.print("; expected: ");
Serial.println(WL_CONNECTED);
bool result = WiFi.reconnect();
Serial.print(millis());
Serial.print(" reconnecting result: ");
Serial.print(result);
Serial.print("; expected: ");
Serial.println(ESP_OK);
}
getPrecipitation(address);
if (counter == 0) {