diff --git a/WifiControlSensor/BME680.h b/WifiControlSensor/BME680.h index 833121e..73eb213 100644 --- a/WifiControlSensor/BME680.h +++ b/WifiControlSensor/BME680.h @@ -14,8 +14,6 @@ //Use Default i2c pin GPIO4(D2): SDA, GPIO5(D1):SCL #define SEALEVELPRESSURE_HPA (1013.25) -#include -#include "debug_sketch.h" int BME680GetMeasure(float &t, float &p, float &h, float &g, float &a); int BME680Setup(); diff --git a/WifiControlSensor/MQTT.h b/WifiControlSensor/MQTT.h index ff56b21..ab4fc0d 100644 --- a/WifiControlSensor/MQTT.h +++ b/WifiControlSensor/MQTT.h @@ -21,6 +21,9 @@ #define TELEINFO_IINST_FEED_FORMAT "/feeds/%s/%s/teleinfo/iinst" #define TELEINFO_PAPP_FEED_FORMAT "/feeds/%s/%s/teleinfo/papp" #define TELEINFO_BASE_FEED_FORMAT "/feeds/%s/%s/teleinfo/base" +#define SCD4X_TEMPERATURE_FEED_FORMAT "/feeds/%s/%s/scd4x/temperature" +#define SCD4X_HUMIDITY_FEED_FORMAT "/feeds/%s/%s/scd4x/humidity" +#define SCD4X_CO2_FEED_FORMAT "/feeds/%s/%s/scd4x/co2" #ifndef CONFIG_DISABLE_MQTT #include "Adafruit_MQTT.h" diff --git a/WifiControlSensor/SCD4X.h b/WifiControlSensor/SCD4X.h new file mode 100644 index 0000000..b084c9a --- /dev/null +++ b/WifiControlSensor/SCD4X.h @@ -0,0 +1,23 @@ +#pragma once +#ifdef CONFIG_ENABLE_SCD4X +#include "debug_sketch.h" + +int SCD4XGetMeasure(float &t, float &h, uint16_t &co2); +int SCD4XSetup(); +bool SCD4XIsConnected(); + +#else +int SCD4XGetMeasure(float &, float &, uint16_t &) +{ + return -1; +}; +int SCD4XSetup() +{ + SKETCH_DEBUG_PRINTLN("SCD4X is disabled at build time"); + return -1; +}; +bool SCD4XIsConnected() +{ + return false; +}; +#endif diff --git a/WifiControlSensor/SCD4X.ino b/WifiControlSensor/SCD4X.ino new file mode 100644 index 0000000..b6fe3d6 --- /dev/null +++ b/WifiControlSensor/SCD4X.ino @@ -0,0 +1,61 @@ +#ifdef CONFIG_ENABLE_SCD4X +#include "SCD4X.h" +#include +#include +#include + +SensirionI2CScd4x scd4x; + +int SCD4XConnected = 0; + +int SCD4XSetup() +{ + Wire.begin(); + scd4x.begin(Wire); + + // Stop previous measurement + uint16_t error = scd4x.stopPeriodicMeasurement(); + if (error) { + SKETCH_DEBUG_PRINTLN("Cannot connect to SCD4X"); + return -1; + } + + // Start new measurement + error = scd4x.startPeriodicMeasurement(); + if (error) { + SKETCH_DEBUG_PRINTLN("Cannot start measurement for SCD4X"); + return -1; + } + SCD4XConnected = 1; + + return 0; +} +int SCD4XGetMeasure(float &temperature, float &humidity, uint16_t &co2) +{ + // Read Measurement + bool isDataReady = false; + + uint16_t error = scd4x.getDataReadyFlag(isDataReady); + if (error) { + SKETCH_DEBUG_PRINTLN("Error trying to execute getDataReadyFlag() for SCD4X "); + return -1; + } + if (!isDataReady) { + return -1; + } + error = scd4x.readMeasurement(co2, temperature, humidity); + if (error || co2 == 0) { + char errorMsg[256]; + SKETCH_DEBUG_PRINT("Error with reading measurement. Error : "); + errorToString(error, errorMsg, sizeof(errorMsg)); + SKETCH_DEBUG_PRINTF(" Co2: %d\n", co2); + + return -1; + } + return 0; +} +bool SCD4XIsConnected() +{ + return SCD4XConnected != 0; +} +#endif diff --git a/WifiControlSensor/WebServer.ino b/WifiControlSensor/WebServer.ino index de065ad..0416f72 100644 --- a/WifiControlSensor/WebServer.ino +++ b/WifiControlSensor/WebServer.ino @@ -37,6 +37,9 @@ void WebHandleRoot() { #ifdef CONFIG_ENABLE_DHT "" + (DHTIsConnected() ? "
DHT
Temperature " + String(dhtTemp, 0) + "C
Humidity " + String(dhtHumidity, 0) + "%
" : "DHT Disconnected" ) + "" #endif +#ifdef CONFIG_ENABLE_SCD4X + "" + (SCD4XIsConnected() ? "
SCD4X
Temperature " + String(SCD4xT, 0) + "C
Humidity " + String(SCD4xH, 0) + "%
CO2 " + String(SCD4xCo2) + "ppm
" : "SCD4X Disconnected" ) + "" +#endif #ifdef CONFIG_ENABLE_BME680 "" + (BME680IsConnected() ? "
BME680
Temperature " + String(bme680T, 2) + "C
Pressure " + String(bme680P, 2) + "hPa
Humidity " + String(bme680H, 2) + "%
Gaz " + String(bme680G, 2) + "kOhm
" : "BME680 Disconnected" ) + "" #endif diff --git a/WifiControlSensor/WifiControlSensor.ino b/WifiControlSensor/WifiControlSensor.ino index eab291f..12cb37f 100644 --- a/WifiControlSensor/WifiControlSensor.ino +++ b/WifiControlSensor/WifiControlSensor.ino @@ -53,6 +53,7 @@ #include "Adafruit_MQTT_Client.h" #include "EEPROM.h" #include "Teleinfo.h" +#include "SCD4X.h" extern "C" { #include @@ -68,6 +69,8 @@ float dhtTemp, dhtHumidity; float bme680T, bme680P, bme680H, bme680G, bme680A; float bme680BSECT, bme680BSECP, bme680BSECH, bme680BSECIaq, bme680BSECIaqAcc; float teleIinst, telePapp, teleBase; +float SCD4xT, SCD4xH; +uint16_t SCD4xCo2; int dryness; uint8_t mode; int reconfig = 0; @@ -296,6 +299,9 @@ void setup() if(!TeleinfoSetup()){ SKETCH_DEBUG_PRINTLN("Teleinfo init success"); } + if(!SCD4XSetup()){ + SKETCH_DEBUG_PRINTLN("SCD4X init success"); + } WebSetupServer(mode); } samplingPeriod = conf.samplingPeriod; @@ -334,6 +340,12 @@ void loop() { batchInfo.push_back({dhtTemp, TEMPERATURE_DHT_FEED_FORMAT, 0, 0}); batchInfo.push_back({dhtHumidity, HUMIDITY_DHT_FEED_FORMAT, 0, 0}); } + if (!SCD4XGetMeasure(SCD4xT, SCD4xH, SCD4xCo2)) { + SKETCH_DEBUG_PRINTF("Current %f°C %f Humidity, Current C02 %d\n", SCD4xT, SCD4xH, SCD4xCo2); + batchInfo.push_back({SCD4xT, SCD4X_TEMPERATURE_FEED_FORMAT, 0, 0}); + batchInfo.push_back({SCD4xH, SCD4X_HUMIDITY_FEED_FORMAT, 0, 0}); + batchInfo.push_back({(float)SCD4xCo2, SCD4X_CO2_FEED_FORMAT, 0, 0}); + } if (!DryGetMeasure(dryness)) { SKETCH_DEBUG_PRINTF("Current dryness %d %%\n", (dryness * 100) / 1024); batchInfo.push_back({(float)dryness, DRY_FEED_FORMAT, 0, 0}); diff --git a/WifiControlSensor/config_device.h b/WifiControlSensor/config_device.h index ae5dbd3..c30bc78 100644 --- a/WifiControlSensor/config_device.h +++ b/WifiControlSensor/config_device.h @@ -36,6 +36,9 @@ //If the dry sensor is powered by a GPIO, this GPIO could be defined here //#define CONFIG_DRY_POWER_PIN 13 +//Advised CONFIG_SAMPLING_PERIOD_MS is 5s for this sensor +//#define CONFIG_ENABLE_SCD4X + // Enable light sleep to save some power (http://bbs.espressif.com/viewtopic.php?f=6&t=133&p=485&hilit=sleep+modem#p485) #define CONFIG_ENABLE_POWER_SAVE