Nr. 51 CO2 Messung mit Arduino „CO2 Ampel“

Inhaltsverzeichnis

Für dieses Projekt benötigst du

Eine CO₂-Ampel am Arduino Mikrocontroller selber bauen

Spätestens seit der Coronakrise 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 CO₂ 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 CO₂ Werte in der Umgebungsluft normal oder kritisch sind. So wird ein Wert von 400ppm (400 parts per million) als ganz natürlicher CO₂ Anteil in der Umgebungsluft angesehen. Im Bereich der Schulen wurde festgestellt, dass die Konzentration der Schüler mit steigendem CO₂-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 CO₂-Konzentration gegenüber der Außenluft in ppm: <400
Absolute CO₂-Konzentration in der Innenraumluft in ppm: <800

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

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

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

In Schulen wurde durch die Covid-19 Pandemie der Ruf nach sogenannten CO₂-Ampeln laut. Diese Geräte messen den CO₂-Anteil in der Umgebungsluft und visualisieren die Messwerte mithilfe einer Ampel. Sobald bedenkliche Mengen CO₂ 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 CO₂-Ampel lässt sich mithilfe eines Arduino Mikrocontrollers ganz einfach selbst 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
  • 1x Breadboard und ein paar Breadboardkabel

Aufbau und Verkabelung

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

Beispielsketch

// 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 oder alternativ an ein LED-Ampel-Modul an. 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

CO₂-Ampel Sketch

// 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.
}

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE