Willkommen bei TwoBears Universe. Dies ist dein erster Beitrag. Bearbeite oder lösche ihn und beginne mit dem Schreiben!
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.

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.
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?
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.
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.
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
Arduino MEGA 2560
Der Arduino MEGA 2560 ist der von mir bevorzugt eingesetzte Arduino.
Warum das? Gute Frage.
Er bietet einfach mehr Möglichkeiten.
Braucht man das?
Meistens nicht, aber manchmal schon!