Moved calibration to same cycle as measuring

This commit is contained in:
Jens Noack 2021-05-10 18:42:08 +02:00
parent eacd7c9c5b
commit 9e0d11cc86
2 changed files with 24 additions and 12 deletions

View file

@ -24,6 +24,7 @@ namespace sensor {
int16_t stable_measurements = 0;
uint32_t waiting_color = color::blue;
bool should_calibrate = false;
unsigned long time_calaibration_started = millis();
void initialize() {
#if defined(ESP8266)
@ -100,10 +101,11 @@ namespace sensor {
* a measurement rate of 2s for at least two minutes before applying the FRC command and sending the reference value.
*/
Serial.println(F("Setting SCD30 timestep to 2s, prior to calibration."));
scd30.setMeasurementInterval(2); // [s] The change will only take effect after next measurement.
scd30.setMeasurementInterval(MEASUREMENT_TIMESTEP); // [s] The change will only take effect after next measurement.
Serial.println(F("Waiting until the measurements are stable for at least 2 minutes."));
Serial.println(F("It could take a very long time."));
should_calibrate = true;
time_calaibration_started = millis();
}
void calibrateAndRestart() {
@ -126,18 +128,22 @@ namespace sensor {
}
void displayCO2OnLedRing() {
if (co2 < 250) {
int16_t co2_int = co2;
if (co2_int < CALIBRATE_LEVEL) {
// Sensor should be calibrated.
led_effects::showWaitingLED(color::magenta);
return;
}
if(co2_int < 400) {
co2_int = 400;
}
/**
* Display data, even if it's "old" (with breathing).
* Those effects include a short delay.
*/
if (co2 < 2000) {
led_effects::displayCO2color(co2);
led_effects::breathe(co2);
if (co2_int < 2000) {
led_effects::displayCO2color(co2_int);
led_effects::breathe(co2_int);
} else {
// >= 2000: entire ring blinks red
led_effects::redAlert();
@ -170,8 +176,11 @@ namespace sensor {
*/
if (freshData) {
if (should_calibrate) {
if(millis() - time_calaibration_started > 60000)
{
countStableMeasurements();
}
}
logToSerial();
}

View file

@ -5,6 +5,10 @@
#define buttonPin 0
// This file is a config template, and can be copied to config.h. Please don't save any important password in this template.
// This is the level at which the magenta LED color signals need for calibration
// in some case it is irritating when this happens so you can lower this level if need - but use with care. Calibration shuld be done time to time
#define CALIBRATE_LEVEL 250
/**
* SERVICES
*/
@ -16,7 +20,6 @@
// # define AMPEL_CSV // Should data be logged as CSV, on the ESP flash memory?
// # define AMPEL_LORAWAN // Should data be sent over LoRaWAN? (Requires ESP32 + LoRa modem, and "MCCI LoRaWAN LMIC library")
/**
* WIFI
*/
@ -31,7 +34,7 @@
// How often should measurement be performed, and displayed?
//NOTE: SCD30 timer does not seem to be very precise. Variations may occur.
# define MEASUREMENT_TIMESTEP 10 // [s] Value between 2 and 1800 (range for SCD30 sensor)
# define MEASUREMENT_TIMESTEP 2 // [s] Value between 2 and 1800 (range for SCD30 sensor)
// How often should measurements be appended to CSV ?
// Probably a good idea to use a multiple of MEASUREMENT_TIMESTEP, so that averages can be calculated
@ -41,17 +44,17 @@
// Residual heat from CO2 sensor seems to be high enough to change the temperature reading. How much should it be offset?
// NOTE: Sign isn't relevant. The returned temperature will always be shifted down.
# define TEMPERATURE_OFFSET -3 // [K]
# define TEMPERATURE_OFFSET 0 // [K]
// Altitude above sea level
// Used for CO2 calibration
// here: Stuttgart, Schellingstr. 24. (Source: Google Earth)
# define ALTITUDE_ABOVE_SEA_LEVEL 680 // [m]
# define ALTITUDE_ABOVE_SEA_LEVEL 660 // [m]
// The reference CO2 concentration has to be within the range 400 ppm ≤ cref(CO2) ≤ 2000 ppm.
// Used for CO2 calibration
// here : measured concentration in Stuttgart
# define ATMOSPHERIC_CO2_CONCENTRATION 425 // [ppm]
# define ATMOSPHERIC_CO2_CONCENTRATION 430 // [ppm]
// Should the sensor try to calibrate itself?
// Sensirion recommends 7 days of continuous readings with at least 1 hour a day of 'fresh air' for self-calibration to complete.