CO2-Ampel kalibrieren

Hallo,
mein CO2-Sensor hat leider Fantasiewerte angezeigt (>950 ppm im Freien). Wenn ich die Bibliothek und das Datenblatt richtig verstanden habe, kann ich ihn mit dem Befehl
airSensor.setForcedRecalibrationFactor(450);
neu kalibrieren.

Ich habe ein kleines Programm dazu geschrieben, falls sonst noch jemand Probleme mit dem Sensor hat (siehe unten).

Das Programm mit der Arduino IDE aufspielen und den Sensor ins Freie bringen. Der Sensor muss sich vorher an die Umweltbedingungen im Freien angepasst haben. Laut Datenblatt mindestens 2 min. In meinem Programm gebe ich ihm 4 min Zeit, was gestern, vermutlich wegen der großen Temperaturdifferenz zwischen drinnen und draußen, aber auch noch nicht gereicht hat. Den Erfolg kann man überprüfen, indem man das Programm einfach neu startet, da es die Messwerte bis zum Kalibrierungszeitpunkt nach 4 min anzeigt. Bei mir war der Klimawandel dann kein Problem mehr, da ich nur noch 300 ppm CO2 hatte :wink: Ich habe dann noch ein paar Minuten gewartet und das Programm noch mal gestartet. Dann waren die Messwerte gut.

Wenn man sein altes Programm wieder auf die Ampel spielen möchte, hat man dazu in der Wohnung nach Anschluss des USB-Kabels an den Computer 4 Minuten Zeit. Ansonsten wird mit den CO2-Werte in der Wohnung neu bzw. falsch kalibriert.

Keine Garantie :wink:

Viele Grüße
Philipp

/*
 * Arduino ins Freie bringen.
 * Nach 4 Minuten erfolgt die Kalibrierung auf 450 ppm
 * Er benötigt konstante Bedingungen und sollte schon etwas warmgelaufen sein. 
 * Wenn man ihn von einem warmen Raum ins kalte nach draußen bringt, sind die vier Minuten u. U. nicht ausreichend.
*/


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SenseBoxMCU.h"
#include "SparkFun_SCD30_Arduino_Library.h"

boolean unkalibriert;
long laufzeit;

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
SCD30 airSensor;

void setup() {
  senseBoxIO.powerI2C(true);
  delay(2000);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display.display();
  delay(100);
  display.clearDisplay();
   Wire.begin();
   Wire.setClock(50000); //50kHz

  if (airSensor.begin() == false)
  {
    while (1)
      ;
  }

  unkalibriert = true;
  display.setCursor(0,0);
  display.setTextSize(1);
  display.setTextColor(WHITE,BLACK);
  display.println("Zur Kalibrierung den Sensor nach draussen bringen");
  display.display();
  delay(60000);

}

void loop() {

if (unkalibriert) {
    display.clearDisplay();
      display.setCursor(0,0);
      display.setTextSize(1);
      display.setTextColor(WHITE,BLACK);
      display.println("Kalibrierung laeuft");
    display.display();
  } else {
    display.clearDisplay();
      display.setCursor(0,0);
      display.setTextSize(1);
      display.setTextColor(WHITE,BLACK);
      display.println("Kalibrierung abgeschlossen");
    display.display();
  }
  delay(1000);
  display.clearDisplay();
    display.setCursor(0,0);
    display.setTextSize(2);
    display.setTextColor(WHITE,BLACK);
    display.println(airSensor.getCO2());
  display.display();
  delay(1000);
  laufzeit = millis();
  if (unkalibriert && laufzeit > 240000) {    //nach 4 min erfolgt Kalibrierung
    airSensor.setForcedRecalibrationFactor(450);
    unkalibriert = false;
  }

}