Gehörst du zu den Leuten, die gerne die Zimmer lüften, aber dann vergessen, dass das Fenster offen ist? Mir passiert das regelmäßig – bis jetzt. In diesem Projekt überwacht ein Arduino Nano die Temperatur, sobald du das Fenster zum Lüften öffnest. Fällt die Temperatur im Raum um 0,5°C, schlägt er Alarm. So kannst du sicher sein, dass der Raum oder sogar die ganze Wohnung nicht unnötig auskühlt.
Diese Bauteile brauchst du
- 1× Arduino Nano Alternativ ist laut Text auch ein Arduino UNO möglich.
- 1× Temperatur- und Luftfeuchtesensor DHT22 Alternativ kann ein DHT11 verwendet werden.
- 1× Piezo-Summer Passiver Piezo-Summer für die Tonerzeugung am Digitalpin.
- 1× Taster (Button) Momenttaster, z. B. 6x6 mm.
- 1× 10-kΩ-Widerstand Laut Materialliste werden zwei benötigt; im gezeigten Sketch ist für den Taster der interne Pull-up aktiv.
- 1× Steckbrett (Breadboard)
- 1× Jumper-Kabel Für die Verbindungen zwischen Arduino, Sensor, Taster und Summer.
Affiliate-Links: Kaufst du über diese Links, erhält Pollux Labs eine kleine Provision – für dich ohne Mehrkosten.
So funktioniert die Temperaturüberwachung
Wenn du das Fenster öffnest, drückst du einen Button am Arduino – damit wird der Startwert der Temperatur festgelegt und die Messung beginnt. Während nun (mal abgesehen vom Sommer) kühlere Luft ins Zimmer gelangt, fällt die Temperatur darin kontinuierlich. Dass die Messung läuft, erkennst du an der internen LED des Arduinos, die währenddessen leuchtet. Sobald die Zimmertemperatur um 0,5°C gefallen ist, schlägt der Piezo-Summer Alarm und ruft dich ans geöffnete Fenster, um es zu schließen. Du drückst den Button erneut: der Alarm hört auf und der Arduino wird wieder in den Wartezustand zurückgesetzt – bis zum nächsten Lüften.
Natürlich kannst du den Wert von 0,5°C ändern und so einstellen, dass er zu deinen Wünschen, zur Positionierung des Arduinos im Zimmer etc. passt.
So baust du das Projekt zusammen
Orientiere dich beim Aufbau an der folgenden Skizze. Ich habe für dieses Projekt wegen seiner kompakten Größe einen Arduino Nano verwendet. Du kannst aber natürlich auch ein anderes Board verwenden, das du gerade zur Hand hast – also zum Beispiel einen Arduino UNO. Auch muss es nicht unbedingt der Sensor DHT22 sein – in diesem Tutorial lernst du, wie du den DHT22 und seinen „kleinen Bruder“ DHT11 am Arduino anschließt und verwendest.
Hier noch einmal alle Anschlüsse in der Übersicht:
| Bauteil | Pin am Bauteil | Anschluss am Arduino Nano |
|---|---|---|
| DHT22 | VCC (Pin 1) | 5V |
| DHT22 | DATA (Pin 2) | D7 – zusätzlich über den 10kΩ Widerstand mit 5V verbinden |
| DHT22 | GND (Pin 4) | GND |
| Piezo-Summer | Plus | D4 |
| Piezo-Summer | Minus | GND |
| Taster | eine Seite | D6 |
| Taster | andere Seite | GND |
Beim DHT22 bleibt Pin 3 frei – der hat keine Funktion. Der 10kΩ Widerstand zwischen DATA und 5V ist ein sogenannter Pull-Up-Widerstand und sorgt dafür, dass auf der Datenleitung ein sauberer Pegel anliegt. Verwendest du den DHT22 als fertiges Modul auf einer kleinen Platine, ist dieser Widerstand meist schon verbaut und du kannst ihn weglassen.
Beim Taster fällt vielleicht auf, dass er ohne Widerstand auskommt. Das liegt daran, dass der Arduino für jeden Pin einen solchen Pull-Up-Widerstand bereits eingebaut hat – du aktivierst ihn später im Sketch mit INPUT_PULLUP und sparst dir damit ein Bauteil. Wichtig ist dabei nur, dass der Taster gegen GND schaltet und nicht gegen 5V. Der Pin liegt dadurch im Ruhezustand auf HIGH und beim Druck auf den Taster auf LOW – die Abfrage im Sketch fragt deshalb auf LOW ab.
Wenn du alles verkabelt hast, kann es mit dem Sketch weitergehen.
Der Sketch für das Projekt
Bevor du den folgenden Sketch kopierst und auf deinen Arduino hochlädst, benötigst du noch die passenden Bibliotheken für den Sensor DHT22 – falls du in der Arduino IDE noch nie ein Projekt mit diesem Sensor umgesetzt hast.
Öffne in diesem Fall den Bibliotheksmanager in der IDE und suche nach DHT sensor library und klicke auf Installieren. In einem Dialogfenster wirst du daraufhin gefragt, ob du die Bibliothek Adafruit Unified Sensor gleich mitinstallieren möchtest. Bestätige das mit einem Klick auf Ja.
Nun zum vollständigen Sketch:
___STEADY_PAYWALL___
#include <DHT.h>
// Pins
#define DHTPIN 7 // DHT22 an Pin D7
#define BUZZER_PIN 4 // Piezo-Summer an Pin D4
#define BUTTON_PIN 6 // Taster an Pin D6
#define LED_PIN 13 // Interne LED an Pin D13
// DHT Sensor
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Variablen
float startTemperature = 0.0;
bool measuring = false;
bool alarmActive = false;
// Zeitsteuerung der Messung
unsigned long letzteMessung = 0;
const unsigned long messIntervall = 2000; // alle 2 Sekunden messen
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Interner Pull-Up-Widerstand aktivieren
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW); // LED initial ausgeschaltet
}
void loop() {
// Taster prüfen (wechseln zwischen Messung und Leerlauf)
if (digitalRead(BUTTON_PIN) == LOW) { // Taster gedrückt
delay(50); // Entprellung
// Sicherstellen, dass der Taster weiterhin gedrückt ist
if (digitalRead(BUTTON_PIN) == LOW) {
if (!measuring) {
// Messung starten
measuring = true;
alarmActive = false; // sicherstellen, dass der Alarm deaktiviert ist
startTemperature = dht.readTemperature();
if (isnan(startTemperature)) {
Serial.println("Fehler beim Lesen des DHT22!");
startTemperature = 0.0; // Standardwert
}
Serial.print("Messung gestartet. Starttemperatur: ");
Serial.println(startTemperature);
digitalWrite(LED_PIN, HIGH); // LED einschalten
letzteMessung = millis(); // Startzeitpunkt merken
} else {
// In Leerlauf wechseln: Alarm und Messung stoppen
noTone(BUZZER_PIN); // Alarmton stoppen
digitalWrite(LED_PIN, LOW); // LED ausschalten
alarmActive = false;
measuring = false;
Serial.println("Messung gestoppt und Leerlauf aktiviert.");
}
// Warten bis der Button losgelassen wird
while (digitalRead(BUTTON_PIN) == LOW);
delay(50); // Entprellzeit nach Loslassen
}
}
// Messlogik, wenn aktiv – alle 2 Sekunden, ohne den Taster zu blockieren
if (measuring && millis() - letzteMessung >= messIntervall) {
letzteMessung = millis(); // Zeitpunkt für die nächste Messung merken
float currentTemperature = dht.readTemperature();
if (isnan(currentTemperature)) {
Serial.println("Fehler beim Lesen des DHT22!");
return;
}
// Temperaturänderung prüfen
if (currentTemperature <= startTemperature - 0.5) {
alarmActive = true; // Alarm auslösen
}
// Alarm ausführen
if (alarmActive) {
tone(BUZZER_PIN, 1000); // Alarmton
Serial.println("Alarm: Temperatur ist gesunken!");
} else {
noTone(BUZZER_PIN); // Alarmton deaktivieren
}
// Debug-Ausgabe
Serial.print("Aktuelle Temperatur: ");
Serial.println(currentTemperature);
}
}
So funktioniert der Sketch
Lass uns einen genaueren Blick auf den Sketch werfen. Zunächst bindest du die Bibliothek für den Temperatursensor ein und legst die Anschlüsse der Bauteile fest:
#include <DHT.h>
#define DHTPIN 7 // DHT22 an Pin D7
#define BUZZER_PIN 4 // Piezo-Summer an Pin D4
#define BUTTON_PIN 6 // Taster an Pin D6
#define LED_PIN 13 // Interne LED an Pin D13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Weiter geht es mit den benötigten Variablen. In startTemperature wird die Temperatur zu Beginn deiner Messung – also sobald du auf den Button drückst – erfasst. Die beiden Variablen measuring und alarmActive dienen später der Programmsteuerung. In letzteMessung hältst du fest, wann du zuletzt gemessen hast, und in messIntervall legst du fest, wie oft gemessen werden soll.
float startTemperature = 0.0;
bool measuring = false;
bool alarmActive = false;
unsigned long letzteMessung = 0;
const unsigned long messIntervall = 2000; // alle 2 Sekunden messen
Setup-Funktion
Hier startest du den Seriellen Monitor und initialisierst den Sensor. Außerdem legst du die benötigten pinModes fest und aktivierst für den Button den internen Pull-Up-Widerstand des Arduinos. Zuletzt stellst du sicher, dass der Piezo-Summer und die interne LED ausgeschaltet sind.
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Interner Pull-Up-Widerstand aktivieren
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW); // LED initial ausgeschaltet
}
Loop-Funktion
Das ist der Hauptteil des Programms, der kontinuierlich läuft. Hier wird entschieden, ob die Messung durchgeführt wird oder nicht:
if (digitalRead(BUTTON_PIN) == LOW) {
// Wurde der Button gedrückt? Dann beginnt die Messung, falls sie nicht bereits läuft.
}
Bei einem Druck auf den Button passiert Folgendes: Wenn die Messung nicht läuft (die Variable measuring ist false), wird sie gestartet. Die Variable measuring wird dann auf true gesetzt.
Wenn die Messung allerdings läuft, wird sie gestoppt. Der Alarm wird deaktiviert und die LED ausgeschaltet. Die Variable measuring wird wieder auf false gesetzt. Der Arduino befindet sich nun sozusagen im Leerlauf.
In der Messung selbst wird alle 2 Sekunden geprüft, ob die aktuelle Temperatur mindestens 0,5°C unterhalb der Starttemperatur liegt. Für diesen Takt verwendest du millis() – also die Zeit in Millisekunden, die seit dem Start des Arduinos vergangen ist – und nicht etwa ein delay():
if (measuring && millis() - letzteMessung >= messIntervall) {
letzteMessung = millis();
// hier wird gemessen
}
Der Unterschied ist wichtig: Ein delay(2000) würde den Arduino zwei Sekunden lang komplett anhalten. In dieser Zeit würde er auch den Taster nicht beachten – dein Druck auf den Button würde also meistens einfach verschluckt und du müsstest ihn so lange gedrückt halten, bis der Arduino wieder aufwacht. Mit millis() läuft die Schleife dagegen ununterbrochen weiter und schaut nur nebenbei nach, ob seit der letzten Messung schon 2 Sekunden vergangen sind. Der Taster reagiert dadurch jederzeit sofort.
Liegt die Temperatur nun mindestens 0,5°C unter dem Startwert, wird der Alarm aktiviert. Hierfür wird die Variable alarmActive auf true gesetzt, was dazu führt, dass in der darauffolgenden Abfrage der Piezo-Summer aktiviert wird:
if (alarmActive) {
tone(BUZZER_PIN, 1000); // Alarmton
Serial.println("Alarm: Temperatur ist gesunken!");
} else {
noTone(BUZZER_PIN); // Alarmton deaktivieren
}
Hier wird geprüft, ob alarmActive == true ist (in einer verkürzten Schreibweise) und der Piezo entsprechend aktiviert oder deaktiviert.
Wie geht es weiter?
Du hast nun einen Arduino, der laut Alarm schlägt, sobald die Temperatur entsprechend deiner Einstellung gefallen ist. Statt einen Piezo-Summers kannst du aber natürlich auch eine andere Benachrichtigung wählen. Wie wäre es z.B. mit einer Push Notification auf deinem Smartphone? Hierfür benötigst du allerdings einen Microcontroller mit WLAN, wie z.B. den ESP8266 oder ESP32.