Sprache auswählen

© Borgmann Aquaponik & Hydroponik
Alle Rechte Vorbehalten
https://borgmann-aquaponik-hydroponik.ch

Viel Erfolg wünschen wir Ihnen!

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