Aus dem Artikel zu: Überwachung und Steuerung der Umgebung: Temperatur, Luftfeuchte und CO2
// Vereinfachtes Arduino/ESP32 Code-Beispiel für CO2-Regelung mit MH-Z19B (UART)
// Benötigt SoftwareSerial für Arduino oder die Hardware-UART des ESP32
// Beispiel für ESP32 HardwareSerial:
#define MHZ19B_RX_PIN 16 // GPIO, der an TX des MH-Z19B geht
#define MHZ19B_TX_PIN 17 // GPIO, der an RX des MH-Z19B geht
HardwareSerial SerialMHZ(1); // Verwende Serial1 auf ESP32
const int co2ValveRelayPin = 21; // Relais für CO2-Magnetventil
const int targetCO2 = 1000; // Ziel-CO2 in ppm
const int co2DoseThreshold = 100; // ppm unter Ziel, bevor dosiert wird
const int doseDuration = 10000; // 10 Sekunden CO2 dosieren (ms)
const long dosePause = 5 * 60 * 1000; // 5 Minuten Pause nach Dosierung (ms)
unsigned long lastDoseTime = 0;
bool isDaytime = true; // Annahme: Hier RTC oder Lichtsensor einbinden!
void setup() {
Serial.begin(115200);
SerialMHZ.begin(9600, SERIAL_8N1, MHZ19B_RX_PIN, MHZ19B_TX_PIN); // MH-Z19B Baudrate 9600
pinMode(co2ValveRelayPin, OUTPUT);
digitalWrite(co2ValveRelayPin, HIGH); // CO2-Ventil AUS starten
Serial.println("Starte CO2-Kontrolle.");
delay(100);
}
void loop() {
// Lese CO2-Wert (MH-Z19B benötigt spezielle Anfrage)
int co2ppm = readMHZ19B(); // Funktion zum Lesen des CO2-Werts implementieren
Serial.printf("CO2: %d ppm\n", co2ppm);
// CO2-Regelung nur bei Tag und wenn ausreichend Zeit seit letzter Dosierung
if (isDaytime && (millis() - lastDoseTime > dosePause)) {
if (co2ppm < (targetCO2 - co2DoseThreshold)) {
Serial.println("CO2 zu niedrig, Ventil AN.");
digitalWrite(co2ValveRelayPin, LOW); // Ventil AN
lastDoseTime = millis();
delay(doseDuration); // Dosierdauer
digitalWrite(co2ValveRelayPin, HIGH); // Ventil AUS
Serial.println("CO2 Dosierung beendet.");
delay(2000); // Kurze Pause für Sensor
}
} else if (!isDaytime) {
// Sicherstellen, dass Ventil bei Nacht AUS ist
if (digitalRead(co2ValveRelayPin) == LOW) {
digitalWrite(co2ValveRelayPin, HIGH);
Serial.println("Nacht, CO2-Ventil AUS.");
}
}
delay(5000); // Wartezeit zwischen Messungen
// --- MH-Z19B Lese-Funktion (vereinfacht, benötigt Fehlerbehandlung) ---
// https://github.com/WifWaf/MH-Z19/blob/master/MHZ19.h
// Dies ist ein Platzhalter, eine vollständige Implementierung ist komplexer.
int readMHZ19B() {
byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // Request CO2
SerialMHZ.write(cmd, 9);
delay(100); // Warte auf Antwort
if (SerialMHZ.available() >= 9) {
byte response[9];
SerialMHZ.readBytes(response, 9);
if (response[0] == 0xFF && response[1] == 0x86) {
return (response[2] << 8) | response[3];
}
}
return -1; // Fehler
}
}