Nr. 51 CO2 Messung mit Arduino „CO2 Ampel“

In Bearbeitung

CO²-Ampel selber bauen

Spätestens seit der Corona-Krise spielt das Thema Luftqualität eine große Rolle, wenn es um Ansammlungen von Menschen geht. Es besteht der Verdacht, dass sich mit großen Mengen ausgeatmeter Luft, auch Viren, wie das Coronavirus, bzw. SARS-CoV-2 Infektionen in Schulen und vergleichbaren Menschenansammlungen verbreiten könnten. Infizierte Menschen könnten Viren in größeren Tröpfchen, aber auch in Form von Aerosolen an die Raumluft abgeben. Als Aerosole werden Kleinstpartikel bezeichnet, die in der Raumluft nur langsam zu Boden sinken. Die Menge ausgeatmeter Luft, und damit die Menge des CO2 Anteils, soll Aufschluss über die Luftqualität geben. Denn je größer der Anteil der ausgeatmeten Luft in der Umgebungsluft ist, desto höher wird das Risiko einer Infektion durch belastete Aerosole eingeschätzt.

In einer Bekanntmachung des Deutschen Bundesumweltamtes aus dem Jahr 2008 mit dem Titel „Gesundheitliche Bewertung von Kohlendioxid in der Innenraumluft“ findet man detaillierte wissenschaftliche Hinweise darauf, welche CO2 Werte in der Umgebungsluft normal oder kritisch sind. So wird ein Wert von 400ppm (400 parts per million) als ganz natürlicher CO2 Anteil in der Umgebungsluft angesehen. Im Bereich der Schulen wurde festgestellt, dass die Konzentration der Schüler mit steigendem CO2-Anteil in der Luft abnimmt.

Eine Klassifizierung der Raumluftqualität nach DIN EN 13779: 2007–09 (DIN 2007–09) liefert folgende Anhaltspunkte:

Raumluft-Kategorie IDA 1:
Hohe Raumluftqualität
Erhöhung der CO2-Konzentration gegenüber der Außenluft in ppm: <400
Absolute CO2-Konzentration in der Innenraumluft in ppm: <800

Raumluft-Kategorie IDA 2:
Mittlere Raumluftqualität
Erhöhung der CO2-Konzentration gegenüber der Außenluft in ppm: > 400-600
Absolute CO2-Konzentration in der Innenraumluft in ppm: >800-1000

Raumluft-Kategorie IDA 3:
Mäßige Raumluftqualität
Erhöhung der CO2-Konzentration gegenüber der Außenluft in ppm: > 600–1000
Absolute CO2-Konzentration in der Innenraumluft in ppm: > 1000–1400

Raumluft-Kategorie IDA 4:
Niedrige Raumluftqualität
Erhöhung der CO2-Konzentration gegenüber der Außenluft in ppm: > 1000
Absolute CO2-Konzentration in der Innenraumluft in ppm: > 1400

In Schulen wurde in Zusammenhang mit der Covid-19 Pandemie der Ruf nach sogenannten CO2-Ampeln laut. Diese Geräte messen den Co2 Anteil in der Umgebungsluft und visualisieren die Messwerte mit Hilfe einer Ampel. Sobald bedenkliche Mengen CO2 in der Raumluft vorhanden sind, wechselt die Ampel von einem grünen Licht schrittweise über ein gelbes Licht zu einem roten Licht. Dadurch wird deutlich, wann der Raum gelüftet werden sollte.

Eine solche CO2 Ampel lässt sich mit Hilfe eines Arduino Mikrocontrollers ganz einfach selber bauen und programmieren.

Dazu werden in unserem Beispiel nur folgende Bauteile benötigt

1x Arduino UNO Mikrocontroller
1x MH-Z19B – CO² Sensor
1x LED-Ampel
Dazu ein Breadboard und ein paar Breadboardkabel

CO2-Wert mit dem Arduino Mikrocontroller messen und darstellen

Aufbau und Verkabelung

Im ersten Versuch werden wir die Messwerte des CO2-Sensors lediglich im Seriellen Monitor anzeigen und auswerten. Erst in einem zweiten Schritt wird die Visualisierung durch eine Ampel ergänzt.

Sketch Nr.1

// Funduino - CO2-Messung mit dem Sensor MH-Z19B, Messwerterfassung durch Auslesen des PWM-Signals

int SensorPin = 5; // Der PWM-Pin des Sensors wird an Pin5 des Mikrocontrollers angeschlossen. Bei anderen Mikrocontrollern muss darauf geachtet werden, dass der Pin PWM-Fähig ist.
int Messbereich = 5000; // Der voreingestellte Messbereich (0-5000ppm). Der Sensor MH-Z19B kann auch auf einen Maximalwert von 2000ppm vorkonfiguriert sein.
unsigned long ZeitMikrosekunden; // Variable für die Dauer des PWM-Signalpegels in Mikrosenkunden
unsigned long ZeitMillisekunden; // Variable für die Dauer des PWM-Signalpegels in Millisekunden

int PPM = 0; // Variable für den CO2-Messwert in ppm (parts per million - Anteile pro Million)
float Prozent=0; // Variable für den prozentuale Länge des PWM-Signals


void setup() 
{
pinMode(SensorPin, INPUT); //Der Pin für die Sensorwerte (6) wird als Eingang definiert.
Serial.begin(9600); // Aufbau der seriellen Verbindung, um Messwerte am Seriellen Monitor anzeigen zu können
}

void loop() 
{  
ZeitMikrosekunden = pulseIn(SensorPin, HIGH, 2000000); // Der pulseIn Befehl misst die Zeit, ab der ein Signal am angegebenen Pin auf HIGH wechselt und in diesem Zustand verbleibt. Standartmäßig endet diese Messung nach maximal 1.000.000 Mikrosekunden (1000ms). Durch das Ahängen des letzten Wertes kann man diesen sogenannten "Timeout" verlängern. Da das Signal des CO2 Sensors bis zu 1004ms lang sein kann, müssen wir den Wert entsprechend hoch ansetzen.
ZeitMillisekunden = ZeitMikrosekunden/1000; // Umwandeln der Zeiteinheit von Mikrosekunden in Millisekunden.
float Prozent = ZeitMillisekunden / 1004.0; // Die maximale Länge des PWM-Signals ist laut Datenblatt des MH-Z19B 1004ms (Millisekunden) lang. Daher berechnen wir hier die gemessene PWM-Signaldauer durch die maximal mögliche Signaldauer und erhalten einen Prozentwert des aktiven (5V) Pegels im PWM-Signal. Dieser Prozentwert spiegelt einen PPM-Wert zwischen 0PPM und 5000PPM wieder.
PPM = Messbereich * Prozent; // PPM-Wert berechnen aus der prozentualen Signaldauer und dem maximalen Messbereich.
Serial.print("CO2 Anteil in der Luft in PPM: "); // Ausgabe der Werte über den Seriellen Monitor
Serial.println(PPM);
delay(1000);  // Eine Sekunde Wartezeit bis zur Bestimmung des nächsten Messwertes.
}

Im Seriellen Monitor werden nun folgende Werte angezeigt

Die Luftqualität entspricht in diesem Beispiel mit Werten unter 800ppm der Raumluft-Kategorie IDA 1, also einer hohen Raumluftqualität.

 

CO2-Ampel mit dem Arduino Mikrocontroller herstellen

Die Messwerte aus der vorherigen Anleitung werden nun verwendet um eine CO²-Ampel zu bauen. Dazu schließen wir zusätzlich zum vorherigen Aufbau drei LEDs in Ampelfarben an den Arduino-Mikrocontroller an, oder alternativ ein LED-Ampel-Modul. Später können anstelle der LEDs natürlich auch Relais angeschlossen werden, um eine echte Ampelanlage anzusteuern.

Die drei LEDs werden in diesem Beispiel an die digitalen Pins 6, 7 und 8 angeschlossen. Im Sketch sollen die drei LEDs die Raumluft-Kategorien IDA1 bis IDA4 darstellen.

IDA1= Grüne LED

IDA2= Grüne und gelbe LED

IDA3= Gelbe LED

IDA4= Rote LED

 

Aufbau

 

Sketch Nr.2

// Funduino - CO2-Ampel mit dem Sensor MH-Z19B, Messwerterfassung durch Auslesen des PWM-Signals
int ROT=6; //Rote LED an Pin 6 
int GELB=7;  //Gelbe LED an Pin 7
int GRUN=8;  //Grüne LED an Pin 8

int SensorPin = 5; // Der PWM-Pin des Sensors wird an Pin5 des Mikrocontrollers angeschlossen. Bei anderen Mikrocontrollern muss darauf geachtet werden, dass der Pin PWM-Fähig ist.
int Messbereich = 5000; // Der voreingestellte Messbereich (0-5000ppm). Der Sensor MH-Z19B kann auch auf einen Maximalwert von 2000ppm vorkonfiguriert sein.
unsigned long ZeitMikrosekunden; // Variable für die Dauer des PWM-Signalpegels in Mikrosenkunden
unsigned long ZeitMillisekunden; // Variable für die Dauer des PWM-Signalpegels in Millisekunden

int PPM = 0; // Variable für den CO2-Messwert in ppm (parts per million - Anteile pro Million)
float Prozent=0; // Variable für den prozentuale Länge des PWM-Signals


void setup() 
{
pinMode(SensorPin, INPUT); //Der Pin für die Sensorwerte (6) wird als Eingang definiert.
Serial.begin(9600); // Aufbau der seriellen Verbindung, um Messwerte am Seriellen Monitor anzeigen zu können
pinMode(ROT, OUTPUT); // Pin 5 ist ein Ausgang.
pinMode(GELB, OUTPUT); // Pin 6 ist ein Ausgang.
pinMode(GRUN,OUTPUT); // Pin 7 ist ein Ausgang.
}

void loop() 
{  
ZeitMikrosekunden = pulseIn(SensorPin, HIGH, 2000000); // Der pulseIn Befehl misst die Zeit, ab der ein Signal am angegebenen Pin auf HIGH wechselt und in diesem Zustand verbleibt. Standartmäßig endet diese Messung nach maximal 1.000.000 Mikrosekunden (1000ms). Durch das Ahängen des letzten Wertes kann man diesen sogenannten "Timeout" verlängern. Da das Signal des CO2 Sensors bis zu 1004ms lang sein kann, müssen wir den Wert entsprechend hoch ansetzen.
ZeitMillisekunden = ZeitMikrosekunden/1000; // Umwandeln der Zeiteinheit von Mikrosekunden in Millisekunden.
float Prozent = ZeitMillisekunden / 1004.0; // Die maximale Länge des PWM-Signals ist laut Datenblatt des MH-Z19B 1004ms (Millisekunden) lang. Daher berechnen wir hier die gemessene PWM-Signaldauer durch die maximal mögliche Signaldauer und erhalten einen Prozentwert des aktiven (5V) Pegels im PWM-Signal. Dieser Prozentwert spiegelt einen PPM-Wert zwischen 0PPM und 5000PPM wieder.
PPM = Messbereich * Prozent; // PPM-Wert berechnen aus der prozentualen Signaldauer und dem maximalen Messbereich.
Serial.print("CO2 Anteil in der Luft in PPM: "); // Ausgabe der Werte über den Seriellen Monitor
Serial.println(PPM);

// Ab hier erfolgt die Aktivierung der Ampel

if (PPM <800 ) //Wenn der Messwert kleiner als "800" ist, dann...
{ 
digitalWrite(GRUN, HIGH); //...soll die grüne LED leuchten
digitalWrite(GELB, LOW); // die gelbe LED ist aus
digitalWrite(ROT, LOW); //die rote LED ist aus
}

if (PPM >=800 && PPM <=1000) //Wenn der Messwert größer-gleich 800 und kleiner-gleich als 1000 ist, dann...
{ 
digitalWrite(GRUN, HIGH); //...soll die grüne LED leuchten
digitalWrite(GELB, HIGH); // ...und die gelbe LED leuchten
digitalWrite(ROT, LOW); // die rote LED ist aus
}

if (PPM >1000 && PPM <=1400) //Wenn der Messwert größer als 1000 und kleiner-gleich als 1400 ist, dann...
{ 
digitalWrite(GRUN, LOW); //...soll die grüne LED aus sein,
digitalWrite(GELB, HIGH); // ...die gelbe LED soll leuchten
digitalWrite(ROT, LOW); //...und die rote LED soll aus sein
}

if (PPM >1400) //Wenn der Messwert größer als 1400 ist, dann...
{ 
digitalWrite(GRUN, LOW); //...soll die grüne LED aus sein,
digitalWrite(GELB, LOW); // ...soll die gelbe LED aus sein,
digitalWrite(ROT, HIGH); //...und die rote LED soll leuchten
}

delay(1000);  // Eine Sekunde Wartezeit bis zur Bestimmung des nächsten Messwertes.
}