CO2 - Sensor

Aufgrund der Corona-Krise und der damit verbunden Knappheit von CO2-Sensoren, kam die Idee auf einen selber zu bauen. Im Internet gibt dazu zahlreiche Anleitungen, die ich zu einer mir passenden zusammengestellt habe.

Folgende Teile werden dafür benötigt:
Arduino nano (hier ein Clon von AZ-Delivery):

Ein CO2-Sensor (hier der MH-Z19B):

Ein I2C OLED-Display 0,96 Zoll 128x64 Pixel
(Hier schon in den passenden Rahmen gesetzt und mit Heißkleber fixiert)

Für die Stromversorgung ein altes USB-Kabel
(Sensor und OLED brauchen eigene Stromversorgung, die vom Arduino reicht leider nicht). Diese sollte wie im Bild gezeigt gerlötet werden:

Die Hülle besteht aus drei Teilen:

Front (mit Rahmen für Display, so dass es mit Heiskleber fixiert werden kann.
!!Der Rahmen passt nicht exakt und muss aus Sicherheitsgründen mit Messer oder Feile noch vergrössert werden (nur ein wenig) man kann zwar das Display reindrücken dabei bricht aber im unteren Teil immer ein Stück Glas ab und das beenträchtigt die Funktion des Displays!!!,
Rückteil und Korpus, der Korpus hat an der passenden Stellen Fenster für den Gasaustausch und im Inneren eine Halterung für den CO2-Sensor.

Hier gibt es die stl. und Fusion360-Dateien zum Download: https://www.thingiverse.com/thing:4583703

Die Verkabelung muss folgendermaßen erfolgen:
Display SDA -> Arduino A4
Display SCK -> Arduino A5
Display GND -> GND-USB-Kabel
Display VCC -> VCC USB-Kabel

Sensor PWM -> Arduino D7
Sensor GND -> GND-USB-Kabel
Sensor Vin -> VCC USB-Kabel

Arduino Vin -> VCC-USB-Kabel
Arduino GND -> GND-USB-Kabel

Das USB-Kabel würde ich noch mit Heißkleber fixieren, bevor das Rückteil reingedrückt wird.

Kalibrierung des CO2-Sensors:
Habe zwei nebeneinander getestet, wie man sieht gibt es keine Kalibrierung am Anfang, den Nullwert von 400ppm betreffend.
Laut Betriebsanleitung sollte man den Sensor in regelmäßgen Abständen kalibrieren. Die Kalibrierung kann auf unterschiedliche Arten und Weisen erfolgen:

  1. Weg: Man stellt den Sensor (eingeschaltet) für 24 Stunden an die frische Luft, er kalibriert sich alle 24 Stunden automatisch.
    (2. Weg: Dazu verbindet man den HD-PIN 7 Sekunden mit GND und stellt den Sensor an das offene Fenster für 20 min. Wird auf einigen Foren allerdings nicht empfohlen bzw. sogar dringend davon abgeraten, da man einiges falsch machen kann.)


Der CODE:

 #include <SPI.h>
 #include <Wire.h>
 #include <Adafruit_GFX.h>
 #include <Adafruit_SSD1306.h>

 #define SCREEN_WIDTH 128 
 #define SCREEN_HEIGHT 64 
 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

 const int pwmpin = 7;
 const int range = 5000;

void setup() {

   pinMode(pwmpin, INPUT);
   Serial.begin(9600); 
   display.clearDisplay();
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64) 

   display.clearDisplay();
   display.setCursor(5, 30);
   display.setTextColor(WHITE);
   display.setTextSize(2);
   //display.write(24) ;   
   display.println("Heating...");
   display.display();

delay(180000);

}

 void loop() {

 int ppm_pwm = readCO2PWM();// Messung der PWM-Länge mittels einer eigenen Funktion

  display.clearDisplay();
  display.setCursor(0, 10);
  display.setTextColor(WHITE);
  display.setTextSize(2);    
  display.println("CO");
  display.setCursor(23, 20);
  display.setTextSize(1); 
  display.println("2");
  display.setTextSize(2);
  display.setCursor(32, 10);    
  display.println("Messung:");

  display.setCursor(0, 40);
  display.setTextSize(3);
  display.print(ppm_pwm);
  display.setTextSize(2);
  display.print(" ");
  display.print("ppm");
  display.display();

  Serial.print("PPM PWM: ");
  Serial.println(ppm_pwm);
  delay(1000); 

}

int readCO2PWM() {

  unsigned long th;
  int ppm_pwm = 0;
 float pulsepercent;

    do {

    th = pulseIn(pwmpin, HIGH, 1004000) / 1000;
    float pulsepercent = th / 1004.0;
    ppm_pwm = range * pulsepercent;

     } while (th == 0);

  return ppm_pwm; 
}

Der Code ist nicht von mir. Habe mir die Einzeteile aus anderen Codes, die im Internet veröffentlicht wurden zusammengestellt, so dass es für meinen Bedarf funktioniert. "delay(180000)" sind 3 Minuten für die Zeit die der Sender braucht um die Betriebstemperatur (50°C) zu erreichen. Wen das nervt der verkürtzt die Zeit einfach nach eigenen Wünschen.

Quellen: