Aus dem Artikel zu: Überwachung und Steuerung der Umgebung: Temperatur, Luftfeuchte und CO2
// Vereinfachtes Arduino/ESP32 Code-Beispiel für Temperatur/Feuchtigkeitsregler mit BME280
#include <wire.h>
#include <adafruit_sensor.h>
#include <adafruit_bme280.h> // Bibliothek für BME280 Sensor
#define SEALEVELPRESSURE_HPA (1013.25) // Standard Atmosphärendruck
Adafruit_BME280 bme; // I2C
const int exhaustFanRelayPin = 18; // Abluftventilator
const int heaterRelayPin = 19; // Heizmatte
const float tempHighThreshold = 28.0; // °C, Ventilator AN
const float tempLowThreshold = 26.0; // °C, Ventilator AUS
const float tempMinThreshold = 20.0; // °C, Heizmatte AN
const float tempMaxThreshold = 22.0; // °C, Heizmatte AUS
const float humidityHighThreshold = 75.0; // %RH, Ventilator AN
const float humidityLowThreshold = 70.0; // %RH, Ventilator AUS
void setup() {
Serial.begin(115200);
Serial.println("Starte Umgebungskontrolle.");
if (!bme.begin(0x76)) { // I2C-Adresse des BME280
Serial.println("Konnte BME280 nicht finden, überprüfe Verkabelung oder Adresse!");
while (1);
}
pinMode(exhaustFanRelayPin, OUTPUT);
pinMode(heaterRelayPin, OUTPUT);
digitalWrite(exhaustFanRelayPin, HIGH); // Ventilator AUS (Relais oft inverted)
digitalWrite(heaterRelayPin, HIGH); // Heizung AUS
delay(100);
}
void loop() {
float temperature = bme.readTemperature();
float humidity = bme.readHumidity();
Serial.printf("Temp: %.2f °C, Hum: %.2f %%\n", temperature, humidity);
// Temperaturregelung
if (temperature > tempHighThreshold) {
if (digitalRead(exhaustFanRelayPin) == HIGH) {
Serial.println("Temp zu hoch, Ventilator AN.");
digitalWrite(exhaustFanRelayPin, LOW); // Ventilator AN
}
if (digitalRead(heaterRelayPin) == LOW) { // Heizung AUS, wenn Ventilator an ist
Serial.println("Temp zu hoch, Heizung AUS.");
digitalWrite(heaterRelayPin, HIGH); // Heizung AUS
}
} else if (temperature < tempLowThreshold && temperature > tempMinThreshold) {
if (digitalRead(exhaustFanRelayPin) == LOW) {
Serial.println("Temp OK, Ventilator AUS.");
digitalWrite(exhaustFanRelayPin, HIGH); // Ventilator AUS
}
}
if (temperature < tempMinThreshold) {
if (digitalRead(heaterRelayPin) == HIGH) {
Serial.println("Temp zu niedrig, Heizung AN.");
digitalWrite(heaterRelayPin, LOW); // Heizung AN
}
if (digitalRead(exhaustFanRelayPin) == LOW) { // Ventilator AUS, wenn Heizung an ist
Serial.println("Temp zu niedrig, Ventilator AUS.");
digitalWrite(exhaustFanRelayPin, HIGH); // Ventilator AUS
}
} else if (temperature > tempMaxThreshold && temperature < tempHighThreshold) {
if (digitalRead(heaterRelayPin) == LOW) {
Serial.println("Temp OK, Heizung AUS.");
digitalWrite(heaterRelayPin, HIGH); // Heizung AUS
}
}
// Luftfeuchtigkeitsregelung (kann mit Temperaturregelung interagieren, hier vereinfacht)
if (humidity > humidityHighThreshold) {
if (digitalRead(exhaustFanRelayPin) == HIGH) {
Serial.println("Feuchte zu hoch, Ventilator AN.");
digitalWrite(exhaustFanRelayPin, LOW); // Ventilator AN
}
} else if (humidity < humidityLowThreshold) {
// Hier könnte ein Luftbefeuchter gesteuert werden, wenn nötig.
// Oder sicherstellen, dass der Ventilator AUS ist, wenn Feuchte OK.
if (digitalRead(exhaustFanRelayPin) == LOW && temperature < tempHighThreshold) { // Nur ausschalten, wenn Temp es erlaubt
Serial.println("Feuchte OK, Ventilator AUS (falls nicht wegen Temp an).");
digitalWrite(exhaustFanRelayPin, HIGH);
}
}
delay(5000); // Alle 5 Sekunden messen
}