CO2 Messung mit MH-Z19 und Arduino (Teil 1)

Soda, hier geht es also um die CO2 Messung mit dem Arduino und dem MH-Z19.

Warum CO2 Messen?

Gestellt hat sich die Frage, wie wir unser neues Haus geplant haben. Wir standen vor der Entscheidung, ob wir eine zusätzliche Lüftung einplanen sollen oder nicht. Bei der Recherche zu diesem Thema stieß ich auf die CO2 Thematik. CO2 kann recht gut als Maß verwendet werden, wie verbraucht die Raumluft ist. Das ist doch interessant, oder? Aber wie hoch sind die CO2 Werte eigentlich derzeit im alten Haus? (ohne Lüftung aber mit „undichten“ Fenstern) – keine Ahnung!  Also Messen.

Welchen Sensor nehmen?

Messprinzip bei diesen Sensoren ist NDIR (= „nondispersive infrared“). Dabei wird ausgenutzt, dass bestimmte IR-Wellenlängen (4.26 µm) von CO2 absorbiert werden. Für die Messung braucht man eine IR Quelle, einen Filter, der nur die relevanten Wellenlängen durchlässt, ein „Stück Luft“ mit CO2 drinnen, das mehr oder wenige absorbiert und einen Detektor, der die durchgelassene IR-Strahlung misst. Je mehr CO2 in der Luft ist, desto weniger misst der Detektor. Gut wäre auch noch ein Referenzdetektor, der die IR-Strahlung direkt misst (damit Schwankungen in der Quelle herausgerechnet werden können). Dann brauchen wir noch ein wenig Mathematik und haben ein CO2-Signal.

Das alles gibt es fix fertig als CO2-Detektor zu kaufen! Brauchen wir also nur einen Sensor kaufen, den mit dem Arduino auslesen und dann können wir die Daten verarbeiten wie wir wollen!

So einfach?

Na schauen wir mal.

Die Sensoren die es da gibt sind zum Teil nicht ganz billig. Da ich aber später gerne dauernd in mehreren Räumen messen möchte sollte die Lösung nicht allzu teuer sein. Nach einiger Recherche bin ich auf den MH-Z19 von Winsen gestoßen (Die Seite des Herstellers mit dem entsprechenden Datenblatt ist hier).

Die Daten des Sensor schauen bei erster Betrachtung recht brauchbar aus und die Kosten für den Sensor liegen im Internet bei ca. € 20. Nicht extrem billig, aber auch nicht arg teuer.

Bei genauerer Betrachtung fällt auf, dass die Informationen im Datenblatt ein wenig dürftig sind. Es wird also ein wenig „Reverse-Engineering“ gefragt sein, aber das ist ja auch genau die Richtige Aufgabe für den DIYDonkey!!! Eine wenig Reverse-Engineering wurde auch schon hier und hier durchgeführt (letzteres ist in russisch – aber Google Translate hilft etwas). Aber so ganz verstanden scheinen die Funktion noch nicht zu sein. Es bleiben also noch Aufgaben für mich.

Für den Anfang habe ich mir mal 2 Stück von diesen Sensoren bestellt, die auch gestern (05.04.2017) gekommen sind.

Also frisch ans Werk!

Als erstes habe ich mir mal einen kleinen Testaufbau auf einer Lochrasterplatine gelötet, mit der ich beide Sensoren mit einem Arduino Mega auslesen kann. Für den Anfang verwende ich mal nur die serielle Schnittstelle (UART), d.h. man muß die Sensoren nur an 5V, GND anschließen und TXD vom Sensor mit RX am Arduine und RXD mit TX am Arduino verbinden.

Hier sind die beiden CO2 Sensoren MH-Z19 auf einem Lochrasterboard auf einem Arduino Maga verbaut
Hier sind die beiden MH-Z19 auf einem Lochrasterboard auf einem Arduino Maga verbaut

UART funktioniert am Sensor mit 9600 Baud, 8 Datenbits, 1 Stopbit und ohne Parity Check (im Datenblatt sind hier wohl ein wenig die Bits und Bytes durcheinander gekommen – aber da das Stanardeinstellungen sind, ist klar was gemeint ist).

Ein Befehl für diesen Sensor besteht aus 9 Byte. Zuerst kommt ein Startbyte 0xFF dann die Nummer des Sensors, die standardmäßig 0x01 ist. Das dritte Byte enthält den Befehl, dann 5 Bytes  für Parameter und ein Byte Prüfsumme.

Der Befehl um die CO2 Gaskonzentration auszulesen ist 0x86. Der Ganze Befehl sieht also so aus:

Byte0

Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
Startbyte Sensornummer Befehl Parameter         Prüfsumme

0xFF

0x01 0x86 0x00 0x00 0x00 0x00 0x00

0x79

Der Sensor antwortet dann mit neun Bytes:

Byte0

Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
Startbyte Befehl CO2-high CO2-low Temp Status Min-high Min-low Prüfsumme

Das Byte0 ist hier wieder das Starbyte 0xFF gefolgt von der Wiederholung das Befehls 0x85. Byte2 und Byte3 enthalten den aktuellen Co2 Wert. D.h. der aktuell gemessene CO2 Wert berechnet sich aus (CO2-high*256+CO2-low).

Die Bytes 4-7 sind im Datenblatt nicht dokumentiert. In weiser Voraussicht habe ich hier mal die Namen Temp, Status, Min-high und Min-low vergeben. Was es damit für eine Bewandtnis hat, werden wir später sehen. Der Wert Temp enthält die vom Sensor gemessene Temperatur plus 40°C. Um die wahre Temperatur zu ermitteln müssen wir also (Byte4-40) rechnen (das haben schon viele herausgefunden – siehe die beiden Links oben).

Jetzt brauchen wir noch ein kleines Programm für den Arduino, der die Werte der beiden Sensoren ausließt und an den Computer weitergibt. Ich habe das mal aus ausgeführt:

/* Programm zum Auslesen der CO2-Konzentration aus 2 Sensoren MH-Z19 an einem Arduino Mega
 * Die Sensoren befinden sich an den seriellen Schnittstellen 1 und 2.
 * Die Werte werden dann an im Klartext an den Computer übergeben.
 * Geschrieben von: Norbert Huber
 * Datum:           08.04.2017
 */


byte com[]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};  //Befehl zum Auslesen der CO2 Konzentration
byte return1[9];                                            //hier kommt der zurückgegeben Wert des ersten Sensors rein
int concentration1;                                         //CO2-Konzentration des ersten Sensors
int minimum1;                                               //Minimum-Wert des ersten Sensors
int temp1;                                                  //Temperatur-Wert des ersten Sensors
byte status1;                                               //Status des ersten Sensors
byte return2[9];
int concentration2;
int minimum2;
int temp2;
byte status2;

void setup() {
  Serial.begin(9600);   //Initialisierung Serielle Schnittstelle zum Computer
  Serial1.begin(9600);  //Initialisierung der seriellen Schnittstelle für den ersten Sensor
  Serial2.begin(9600);  //Initialisierung der seriellen Schnittstelle für den zweiten Sensor
}

void loop() {
   while (Serial1.available() >0) {     //Hier wird der Buffer der Seriellen Schnittstelle gelehrt 
    Serial1.read();
   }
   while (Serial2.available() >0)  {
    Serial2.read();
   }
                                                //Sensor 1:
   Serial1.write(com,9);                        //Befehl zum Auslesen der CO2 Konzentration
   Serial1.readBytes(return1,9);                //Auslesen der Antwort
   concentration1 = return1[2]*256+return1[3];  //Berechnung der Konzentration
   temp1 = return1[4]-40;                       //Berechnung der Temperatur
   minimum1 = return1[6]*256+return1[7];        //Berechnung des Minimums
   status1 = return1[5];                        //Berechnung des Status
   Serial.print("Zeit = ");                     //Senden der Werte an den PC 
   Serial.print(millis());                      //Am Angfang wird die Zeit in ms gesendet, die der Arduino in Betrieb ist
   Serial.print(" ; Sensor 1: CO2 = ");
   Serial.print(concentration1);
   Serial.print(" ; Temp = ");
   Serial.print(temp1);
   Serial.print(" ; Minimum = ");
   Serial.print(minimum1);
   Serial.print(" ; Status = ");
   Serial.print(status1);
                                                //Sensor2: siehe oben
   Serial2.write(com,9);
   Serial2.readBytes(return2,9);
   concentration2 = return2[2]*256+return2[3];
   temp2 = return2[4]-40;
   minimum2 = return2[6]*256+return2[7];
   status2=return2[5];
   Serial.print(" ; Sensor 2: CO2 = ");
   Serial.print(concentration2);
   Serial.print(" ; Temp = ");
   Serial.print(temp2);
   Serial.print(" ; Minimum = ");
   Serial.print(minimum2);
   Serial.print(" ; Status = ");
   Serial.println(status2);
   
   delay(10000);                              //10s warten
}

Das Programm auf den Arduino hochladen und schon werden die CO2-Werte gemessen und angezeigt. Bei mir hat das auf Anhieb funktioniert.

Die nicht dokumentierten Werte sehen wir jetzt auch – aber mit denen beschäftigen wir uns im nächsten Artikel – da geht es dann mit dem Reverse-Engineering richtig los!

Wenn es euch das interessiert, dann müsst ihr etwas Geduld haben.

Ich hoffe, der Artikel hat euch gefallen, und vielleicht auch ein wenig geholfen. Über einen Kommentar würde ich mich freuen.

Liebe Grüße

Euer DIYDonkey

 

 

Es geht wieder los!

Hallo Leute!

Ich bins der DIYDonkey!

Ja, es war lange Zeit ruhig hier in meinem Blog – ich hatte letztes Jahr so einiges zu tun und bin gar nicht wirklich zum Basteln gekommen. Lauter spannende Sache, aber eben wenig basteln – aber jetzt habe ich wieder ein wenig Luft und darum werdet ihr jetzt wieder öfter was von mir hören.

Als erstes habe ich mir das Thema CO2 Messung mit dem Arduino vorgenommen. Dabei werde ich mir den MH-Z19 mal etwas genauer anschauen.

Interesse?

Dann meldet euch mal bei mir!

 

lg

Euer DIYDonkey

WLAN Modul ESP8266

WLAN bzw. WiFi Module gibt es recht günstig. Ich hab mir die gekauft:

Der Chip, der darauf verbaut ist, ist ein ESP8266.
Die Versorgungsspannung liegt bei 3.3 V und auch alle anderen PINs vertragen nur 3.3 V! Also Achtung beim Arduino! – es muß an eine Pegelwandlung gedacht werden!
Der Stromverbrauch ist auch beachtlich (je nachdem was er gerade macht so etwa bis über 215 mA), d.h. man kann auch die 3.3 V vom Arduino nicht wirklich verwenden (manche verwenden die Arduino 3.3 V Spannung und stützen sie mit einem großen Kondensator z.B. 220 µF – das habe ich nicht getestet, könnte aber funktionieren). Ich habe ihn für diesen Test mit 3.3V von einer Breadboard-Spannungsversorgung versorgt. Der Chip hat eine serielle Schnittstelle und wird mit „AT“-Kommandos gesteuert.

„WLAN Modul ESP8266“ weiterlesen

Arduino und „harwarenahes“ Programmieren

Die Arduino IDE ist recht brauchbar. Überhaupt bin ich von dem Arduino Universum recht begeistert. Es gibt günstige Mikrokontroller Boards, die IDE ist kostenlos, es gibt eine Menge günstiger Hardware (Sensoren, Displays,….) mit entsprechenden Bibliotheken, es gibt eine recht große Community (viele Tutorien, Beispiele, Foren,..) und so kann man leicht versuchen seine Projekte umzusetzen.
Leicht wird allerdings vergessen, dass es sich hierbei um einen Mikrokontoller handelt – er ist für bestimmte Zwecke gebaut und für die ist er auch super einsetzbar. Die IDE Sprache ist quasi C – und man hat mit den ganzen Registern und der Hardware ja nix zu tun! Super!
Aber verschenkt man dadurch nicht Möglichkeiten? Kann man so das Potenzial des kleinen Mikrokontrollers wirklich ausnutzen?

„Arduino und „harwarenahes“ Programmieren“ weiterlesen

433 MHz Empfänger und Sender

Ich hab mir diese hier gekauft. Es ist ein Set mit je 3 Sendern und Empfängern (links sind die Sender, rechts die Empfänger)

Wie man auf dem Bildern sieht, sind bei den Modulen keine Antennen dabei, ich hab vorerst mal stattdessen ein Stück Draht verwendet (Kupferdraht, 1,5 mm^2). Den hab ich gerade gerichtet und angelötet. Die Länge sollte natürlich 17 cm sein. Warum? (ich sage nur Wellenlänge durch 4 – wenn Ihr mehr wissen wollt fragen!)

Mit diesen Modulen hab ich in nächster Zeit einige Dinge vor, z.B. den Bau einer Wetterstation, die auch Funksensoren verarbeitet und das Auslesen und Fernsteuern von Funksteckdosen (dazu gibt es bald was!)

Mal sehen, was mir da sonst noch einfällt!

lg
Euer DIYDonkey

 

LCD Shield mit Tasten (LCD Keypad Shield)

LCD-Shields für den Arduino gibt es ja einige. Ich hab mir unter anderem dieses bestellt, da es nicht nur ein Display, sondern auch gleich 5 Tasten hat – und man somit auch gleich eine Eingabemöglichkeit hat.

Mein Shield habe ich wie üblich bei Amazon gekauft (das ist der Link hinter dem Bild links). Dokumentation ist da allerdings keine dabei, aber es ist nicht so schwierig herauszufinden, wie es funktioniert. Auch zeigt das Bild nicht genau das Shield, das ich dann bekommen habe, aber auch egal! Es geistern einige so ähnliche Shields im Internet herum, die vielleicht auch eine etwas andere Beschaltung haben – also ACHTUNG! zuerst überprüfen, ob es wirklich so funktioniert wie man denkt!

Bei manchen Anbietern steht bei diesem Shield dabei es hätte 6 frei belegbare Tasten – das ist in meinem Fall nicht der Fall! Es sind nur 5! Die 6. Taste ist eine Resettaste (und damit nicht frei belegbar!). Ich finde die Resettaste an der Position wo sie ist auch nicht besonders glücklich. Ich denke mir, dass man da leicht beim normalen Bedienen (der anderen Tasten) aus versehen draufdrückt.

„LCD Shield mit Tasten (LCD Keypad Shield)“ weiterlesen

Mein Digitales Oszilloskop, ein Rigol DS1054Z

Ja, ich habe mir ein Oszilloskop geleistet. Natürlich ein digitales Speicheroszilloskop und es hat sogar 4 Kanäle.
Ich habe lange überlegt, ob ich mir sowas kaufen soll. In der Tat träume schon seit meiner Schulzeit von einem Oszilloskop – damals natürlich von einem Analogen – ein Digitaloszilloskop kostete damals so viel wie ein Kleinwagen und war für einen Hobbyelektroniker unbezahlbar. Inzwischen ist viel Wasser die Donau hinunter geronnen und Digitaloszilloskope sind leistbar, ja sogar günstig – und für meine Basteleien praktischer als analoge. Ich hatte bei meinen bisherigen Arbeitgebern immer die Möglichkeit ein Oszilloskop zu benutzen – ich brauche das auch des öfteren für meinen Job (ja, auch ein Physiker, der sich mit Lasern und Optik beschäftigt, braucht sowas oft) – und wenn ich mal bei meinen Arduino nicht weiterkam, dann konnte ich dort auch mal die Signale anschauen.
Jetzt habe ich mich entschieden mir selbst eines anzuschaffen. Aber was für eines? Ein Kollege riet mir, dass es eines sein sollte mit einer großen Speichertiefe („einige Megapunkte, nicht nur Kilopunkte“). Seines habe ihm da zu wenig und das bedauere er oft. Er hat auch gemeint, es gäbe da ein günstiges mit 4 Kanälen das auch nicht so schlecht ausschaut.

„Mein Digitales Oszilloskop, ein Rigol DS1054Z“ weiterlesen

PulsWeitenModulation (PWM)

Pulsweitenmodulation kann eingesetzt werden um einen analogen Ausgang zu simulieren. Man kann damit z.B. die Helligkeit einer Leuchtdiode regeln.

Wie funktioniert das?

Digitale Ausgänge haben nur 2 Zustände: High oder Low also bei 5 V Versorgungsspannung 5V oder 0V.
Wenn man den Ausgang jetzt aber sehr schnell ein- und ausschaltet so ist der Mittelwert der Spannung zwischen diesen beiden Werten.
„PulsWeitenModulation (PWM)“ weiterlesen