CO₂-Ampel mit dem Arduino selbst bauen
FunduinoZuletzt aktualisiert am
Luftqualität messen und als Ampelfarbe sichtbar machen
Welche CO₂-Werte sind kritisch?
Aufbau und Verkabelung
1 / 2
Messwerte auslesen
CO₂-Wert auslesen und anzeigen
// Funduino - CO2-Messung mit dem Sensor MH-Z19B
// Die Messwerte werden über das PWM-Signal des Sensors ermittelt.
// Der PWM-Pin des Sensors kommt an Pin 5 des Mikrocontrollers. Bei anderen
// Boards muss dieser Pin PWM-fähig sein.
int SensorPin = 5;
// Der voreingestellte Messbereich (0 bis 5000 ppm). Der MH-Z19B kann auch auf
// einen Höchstwert von 2000 ppm vorkonfiguriert sein.
int Messbereich = 5000;
unsigned long ZeitMikrosekunden; // Dauer des PWM-Signalpegels in Mikrosekunden
unsigned long ZeitMillisekunden; // Dauer des PWM-Signalpegels in Millisekunden
int PPM = 0; // CO2-Messwert in ppm (parts per million, Anteile pro Million)
float Prozent = 0; // prozentuale Länge des PWM-Signals
void setup()
{
pinMode(SensorPin, INPUT); // Pin 5 wird als Eingang definiert.
Serial.begin(9600); // Serielle Verbindung für den seriellen Monitor
}
void loop()
{
// pulseIn misst, wie lange das Signal am Pin auf HIGH bleibt. Ohne den dritten
// Wert endet die Messung nach 1.000.000 Mikrosekunden, also nach einer Sekunde.
// Das Signal des Sensors kann aber bis zu 1004 ms lang sein - deshalb setzen
// wir diesen "Timeout" höher.
ZeitMikrosekunden = pulseIn(SensorPin, HIGH, 2000000);
// Umrechnen von Mikrosekunden in Millisekunden
ZeitMillisekunden = ZeitMikrosekunden / 1000;
// Laut Datenblatt ist das PWM-Signal des MH-Z19B höchstens 1004 ms lang. Wir
// teilen die gemessene Dauer durch diesen Höchstwert und bekommen so den Anteil
// des aktiven Pegels am Gesamtsignal.
Prozent = ZeitMillisekunden / 1004.0;
// Aus diesem Anteil und dem Messbereich ergibt sich der ppm-Wert.
PPM = Messbereich * Prozent;
Serial.print("CO2 Anteil in der Luft in PPM: ");
Serial.println(PPM);
delay(1000); // Eine Sekunde bis zur nächsten Messung
}Die Ampel ergänzen
CO₂-Ampel: Messwert als Ampelfarbe anzeigen
// Funduino - CO2-Ampel mit dem Sensor MH-Z19B
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
// Der PWM-Pin des Sensors kommt an Pin 5 des Mikrocontrollers.
int SensorPin = 5;
// Der voreingestellte Messbereich (0 bis 5000 ppm).
int Messbereich = 5000;
unsigned long ZeitMikrosekunden; // Dauer des PWM-Signalpegels in Mikrosekunden
unsigned long ZeitMillisekunden; // Dauer des PWM-Signalpegels in Millisekunden
int PPM = 0; // CO2-Messwert in ppm
float Prozent = 0; // prozentuale Länge des PWM-Signals
void setup()
{
pinMode(SensorPin, INPUT); // Pin 5 wird als Eingang definiert.
Serial.begin(9600);
pinMode(ROT, OUTPUT); // Pin 6 ist ein Ausgang.
pinMode(GELB, OUTPUT); // Pin 7 ist ein Ausgang.
pinMode(GRUN, OUTPUT); // Pin 8 ist ein Ausgang.
}
void loop()
{
ZeitMikrosekunden = pulseIn(SensorPin, HIGH, 2000000);
ZeitMillisekunden = ZeitMikrosekunden / 1000;
Prozent = ZeitMillisekunden / 1004.0;
PPM = Messbereich * Prozent;
Serial.print("CO2 Anteil in der Luft in PPM: ");
Serial.println(PPM);
// Ab hier wird die Ampel angesteuert.
if (PPM < 800) // Messwert kleiner als 800: hohe Raumluftqualitaet
{
digitalWrite(GRUN, HIGH); // gruene LED an
digitalWrite(GELB, LOW);
digitalWrite(ROT, LOW);
}
if (PPM >= 800 && PPM <= 1000) // 800 bis 1000: mittlere Raumluftqualitaet
{
digitalWrite(GRUN, HIGH); // gruene und gelbe LED an
digitalWrite(GELB, HIGH);
digitalWrite(ROT, LOW);
}
if (PPM > 1000 && PPM <= 1400) // 1000 bis 1400: maessige Raumluftqualitaet
{
digitalWrite(GRUN, LOW);
digitalWrite(GELB, HIGH); // nur die gelbe LED an
digitalWrite(ROT, LOW);
}
if (PPM > 1400) // ueber 1400: niedrige Raumluftqualitaet
{
digitalWrite(GRUN, LOW);
digitalWrite(GELB, LOW);
digitalWrite(ROT, HIGH); // rote LED an
}
delay(1000); // Eine Sekunde bis zur nächsten Messung
}Anleitung bewerten