Wet­ter­sta­ti­on mit CO2-Messung

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Eine Wet­ter­sta­ti­on soll neben Tem­pe­ra­tur und Luft­feuch­tig­keit auch den CO2-Gehalt der Luft mes­sen und anzeigen.

Mess­prin­zip von CO2-Sen­so­ren

Der Sen­sor MH-Z19C misst nach dem NDIR-Prin­zip (Nicht­di­sper­si­ver Infra­rot­sen­sor). Er besteht aus einer Infra­rot-Lam­pe und einem Detek­tor. Dazwi­schen befin­det sich die zu mes­sen­de Luft. Je mehr CO2 sie ent­hält, des­to mehr Infra­rot Strah­lung wird absor­biert und ent­spre­chend weni­ger kommt am Detek­tor an.

Der Sen­sor MH-Z19C misst nach dem NDIR-Prin­zip (Nicht­di­sper­si­ver Infra­rot­sen­sor). Er besteht aus einer Infra­rot-Lam­pe und einem Detek­tor. Dazwi­schen befin­det sich die zu mes­sen­de Luft.
Je mehr CO2 sie ent­hält, des­to mehr Infra­rot Strah­lung wird absor­biert und ent­spre­chend weni­ger kommt am Detek­tor an.

Arbeits­wei­se des Programms

Das Pro­gramm misst mit dem Sen­sor DHT22 Tem­pe­ra­tur und Luft­feuch­tig­keit und mit dem MH-Z19C den CO2-Gehalt der Luft. Das RTC-Modul DS3231 ermit­telt Datum und Zeit und misst zusätz­lich die Tem­pe­ra­tur
Die Mess­da­ten wer­den auf einem LCD angezeigt.

Im Seri­el­len Moni­tor wer­den zusätz­lich die Tem­pe­ra­tur­mess­wer­te des DS3231 und des MH-Z19C angezeigt.

Ansicht auf dem LCD

Ansicht im Seri­el­len Monitor

Anschluss des MH-Z19C am UNO

Kali­brie­rung des Sensors

Das Sen­sor MH-Z19C muss auf einen „Null­punkt“ ein­ge­stellt wer­den. Es wird ange­nom­men, dass drau­ßen oder in einem gut gelüf­te­tem Raum die CO2-Kon­ze­tra­ti­on 400 ppm (parts per mil­li­on) beträgt. Die­ser Wert wird als „Null­wert“ fest­ge­legt. Mei­ne Mes­sun­gen haben gezeigt, dass die­ser Wert in der Regel nur leicht über­schrit­ten wird.

Für die Kali­brie­rung gibt es drei Möglichkeiten:

Händi­sche Kalibrierung:

Der Sen­sor muss min­des­tens 20 Minu­ten in einer gut gelüf­te­ten Umge­bung (am bes­ten drau­ßen) Mes­sun­gen durch­füh­ren, dann musst du den HD Pin wird für mehr als 7 Sekun­den mit GND verbinden.

Auto­ma­ti­sche Kalibrierung:

Die auto­ma­ti­sche Kali­brie­rung kann nur dann funk­tio­nie­ren, wenn der Sen­sor über län­ge­re Zeit im Ein­satz ist und sich zwi­schen­durch immer wie­der in einem gut durch­lüf­te­tem Raum befin­det. Der „Null­punkt“ von 400 ppm muss dann nähe­rungs­wei­se erreicht wer­den. Die auto­ma­ti­sche Kali­brie­rung funk­tio­niert nur mit einer Bibliothek.

Sie wird mit

autoCalibration(false); aus­ge­schal­tet

autoCalibration(true); schal­tet sie ein

Mit einer Bibliothek

Instal­lie­re zunächst die Biblio­thek MH-Z19.

In den Bei­spie­len zur Biblio­thek befin­det sich das Pro­gramm Cali­bra­ti­on, ich habe es ein wenig angepasst.

#include "Arduino.h"
#include "MHZ19.h"
#include "SoftwareSerial.h"

// RX/TX Pins zuordnen
// TX MH-Z19C auf 2, RX-Pin MH-Z19C auf 3
#define RX 2 
#define TX 3  

// Name des Moduls MH-Z19
MHZ19 MHZCO2;

// SoftwareSerial -> Name zuordnen
SoftwareSerial MHZSerial(RX, TX);

unsigned long Wartezeit = 0;

void setup() 
{
  Serial.begin(9600);
  delay(500);

  MHZSerial.begin(9600);
  MHZCO2.begin(MHZSerial);

  // automatische Kalibrierung ausschalten
  MHZCO2.autoCalibration(false);

  Serial.println("20 Minuten warten um die Messwerte zu stabilisieren...");
  Wartezeit = 12e5;
  delay(Wartezeit);
  Serial.println("Kalibriere..");

  // Sensor kalibrieren
  MHZCO2.calibrate();
}

Nach der Kali­brie­rung darfst du das Pro­gramm nicht erneut hochladen!

Benö­tig­te Bauteile:

  • CO2-Sen­sor MH-Z19C
  • RTC-Modul DS3231
  • Tem­pe­ra­tur-/Feuch­tig­keits­sen­sor DHT22 oder DHT11
  • LCD
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Benö­tig­te Biblio­the­ken installieren:

Das Pro­gramm

Biblio­the­ken und Variable

#include "Arduino.h"
#include "MHZ19.h"
#include "SoftwareSerial.h"
#include "RTClib.h"
#include "DHT.h"
#include "LCDIC2.h"

// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);

// Pin des DHT-Sensors
int SENSOR_DHT = 7;

// Sensortyp festlegen
// DHT22 oder DHT11
#define SensorTyp DHT22

// Sensor DHT einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);

// Name des RTC-Moduls (rtc)
RTC_DS3231 rtc;

// RX/TX Pins zuordnen
#define RX 2
#define TX 3  

// Name des Moduls MH-Z19
MHZ19 MHZCO2;

// SoftwareSerial -> Name zuordnen
SoftwareSerial MHZSerial(RX, TX);

unsigned long VerstricheneZeit = 0;

Der set­up-Teil:

void setup() 
{
  Serial.begin(9600);
  delay(500);

  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);

  // Serielle Kommunikation MH-Z19C starten
  MHZSerial.begin(9600);
  MHZCO2.begin(MHZSerial);

  // automatische Kalibrierung einschalten wenn der Sensor im Dauerbetrieb
  MHZCO2.autoCalibration(true);

  // RTC-Modul starten
  rtc.begin();

  // Datum/Zeit einmalig setzen, beim nächsten Starten auskommentieren
  // rtc.adjust(DateTime(2023, 4, 23, 8, 50, 30));

  // Sensor DHT starten
  dht.begin();
}

Der loop-Teil

void loop() 
{
  // 5 Sekunden warten
  if (millis() - VerstricheneZeit >= 5000) 
  {
    // rtc.now() -> aktuelle Zeit holen
    DateTime aktuell = rtc.now();

    /*
      Datumsformat festlegen
      DD -> Tag mit führender 0
      MM -> Monat mit führender 0
      YYYY -> vollständige Angabe des Jahres
    */
    char Datum[] = "DD.MM.YYYY ";

    // Datum in Zeichenkette (String) umwandeln und anzeigen
    Serial.print(aktuell.toString(Datum));

    // Format der Zeitangabe festlegen
    char Zeit[] = "hh:mm:ss Uhr";

    // Zeitangabe in Zeichenkette (String) umwandeln und anzeigen
    Serial.println(aktuell.toString(Zeit));
    // Daten lesen
    // CO2-Wert MH-Z19C
    int CO2 = MHZCO2.getCO2();

    // Temperatur MH-Z19
    int TemperaturMHZ = MHZCO2.getTemperature();

    // Temperatur RTC (DS3231) ermitteln
    String TemperaturRTC = String(rtc.getTemperature());
    String AnzeigeTemperaturRTC = String(TemperaturRTC);
    AnzeigeTemperaturRTC.replace(".", ",");

    // Temperatur DHT
    float TemperaturDHT = dht.readTemperature();
    String AnzeigeTemperaturDHT = String(TemperaturDHT);
    AnzeigeTemperaturDHT.replace(".", ",");

    // Luftfeuchtigkeit DHT
    String AnzeigeLuftfeuchtigkeit = String(dht.readHumidity());
    AnzeigeLuftfeuchtigkeit.replace(".", ",");
    Serial.print("Messwert CO²: ");
    Serial.println(String(CO2) + " ppm");

    Serial.print("Temperatur MH-Z19: ");
    Serial.println(String(TemperaturMHZ) + "°C");

    Serial.print("Temperatur RTC: ");
    Serial.println(AnzeigeTemperaturRTC + "°C");
    Serial.print("Temperatur DHT: ");
    Serial.println(AnzeigeTemperaturDHT + "°C");
    Serial.println("----------------------");

    lcd.setCursor(0, 0);
    lcd.print(aktuell.toString(Zeit));
    lcd.setCursor(0, 1);
    lcd.print("CO2 " + String(CO2) + " ppm");
    lcd.setCursor(0, 2);
    lcd.print("Temperatur " + AnzeigeTemperaturDHT + "\337C");
    lcd.setCursor(0, 3);
    lcd.print("Feuchtigkeit " + AnzeigeLuftfeuchtigkeit + "%");
    
    VerstricheneZeit = millis();
  }
}

Quel­len:

MH-Z19 Sen­so­ren bei Wol­les Elek­tronik­kis­te
Daten­blatt MH-Z19C bei Win­sen Ele­tro­nics
Bei­trag bei Wiki­pe­dia zum NDIR-Prin­zip
Fotos: Hart­mut Waller


Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Letzte Aktualisierung: 7. Mai 2024 @ 11:43