In meinem Beitrag „Arduino-Temperaturüberwachung: Relais per Schwellwert & Tastersteuerung mit LCD-Anzeige“ habe ich gezeigt, wie man mit einem Arduino, einem Temperatursensor und einem LCD-Display eine einfache Temperaturüberwachung realisieren kann. Ein Leser meines Blogs hatte eine großartige Idee zur Erweiterung: Ein zweiter Temperatursensor soll zusätzlich die Außentemperatur auf dem Display anzeigen.
Solche Community-Ideen sind immer willkommen, und ich freue mich, wenn meine Projekte weitergedacht und optimiert werden! In diesem Beitrag zeige ich, wie du das bestehende Setup mit einem zweiten Sensor erweiterst, sodass sowohl die Innen- als auch die Außentemperatur angezeigt werden.
Inhaltsverzeichnis
- Was ist das Ziel?
- Der DS18B20 Sensor im Detail
- Erweiterung der Temperaturüberwachung: Umschalten per Taster
- Programmieren der zwei Temperatursensoren in der Arduino IDE
- Benötigte Bibliotheken
- Schritt-für-Schritt Anleitung zum erweitern des Codes für einen zweiten Sensor
- Schritt 1 – definieren der Pins für Sensor & Taster
- Schritt 2 – Sensor initialisieren
- Schritt 3 – Feld zum speichern der aktuellen Auswahl
- Schritt 5 – Taster für Sensorauswahl entprellen
- Schritt 6 – Funktion loop erweitern für die Sensorauswahl
- Schritt 7 – Funktion writeLcdDisplay erweitern
- fertiger Sketch zum anzeigen von zwei Sensorwerten auf einem LC-Display
Was ist das Ziel?
Das eigentliche Ziel ist die Steuerung eines Relais via Schwellwert mit einem Temperatursensor DS18B20 am Arduino. Wie das funktioniert, habe ich bereits ausführlich im oben verlinkten Beitrag erklärt. In diesem Beitrag geht es nun darum, Arduino zwei Temperatursensoren hinzuzufügen, sodass du sowohl die Innen- als auch die Außentemperatur messen und auf dem Display anzeigen kannst.
Der DS18B20 Sensor im Detail
Zunächst zu den technischen Daten des Sensors:
- jeder Sensor hat einen eindeutigen und einmaligen 64Bit Code auf dem onboard ROM
- Betriebsspannung – 3.0V bis 5.5V
- Messbarer Temperaturbereich von -55 °C bis +125 °C
- Toleranz – ±0.5 °C
- Auflösung des Thermometers von 9 bis 12Bit
Den DS18B20 Sensor bekommst du als einzelnen Baustein in Form TO-92 oder vergossen in einer wasserdichten Metallkapsel.

Pinout des Sensors
Der Sensor besitzt eine flache sowie eine abgerundete Seite. Wenn wir ihn von oben betrachten, sodass die flache Seite nach vorne zeigt, ergibt sich folgende Pinbelegung (von links nach rechts):
- Pin 1 – GND
- Pin 2 – DATA
- Pin 3 – Vdd / VCC
Erweiterung der Temperaturüberwachung: Umschalten per Taster
Die bestehende Schaltung erweitern wir um einen Temperatursensor und einen Taster. Der Taster dient später zum umschalten zwischen den Ansichten auf dem Display.
Programmieren der zwei Temperatursensoren in der Arduino IDE
In den nachfolgenden Abschnitten möchte ich dir erläutern wie du den bestehenden Code lauffähig machst (dazu werden ein paar Bibliotheken benötigt) und um einen zweiten Sensor & einen zusätzlichen Taster erweiterst.
Benötigte Bibliotheken
Bevor wir mit der Programmierung starten können, müssen wir einpaar Bibliotheken für die verwendeten Komponenten installieren
- LC-Display > https://docs.arduino.cc/libraries/liquidcrystal-i2c/
- Taster > https://github.com/thomasfredericks/Bounce2
- Temperatursensor DS18B20 > https://github.com/RobTillaart/DS18B20_INT
Wie man eine ZIP-Bibliothek in der Arduino IDE installiert, habe ich dir bereits im Beitrag Arduino IDE, Einbinden einer Bibliothek ausführlich erläutert.
Die beiden Bibliotheken Bounce2 & DS18B20_INT findest du auch im Bibliotheksverwalter der Arduino IDE und kannst du von dort auch einfach mit einem klick installieren.



Bei der Bibliothek DS18B20_INT musst du zusätzlich die Abhängigkeit OneWire installieren und somit die Schaltfläche „ALLE INSTALLIEREN“ wählen.
Schritt-für-Schritt Anleitung zum erweitern des Codes für einen zweiten Sensor
Nachfolgend die sieben Schritte welche notwendig sind einen zweiten Temperatursensor vom Typ DS18B20 in den Code zu implementieren.
Schritt 1 – definieren der Pins für Sensor & Taster
Zunächst definieren wir die beiden Pins für jeweils den Sensor und den Taster.
//Der zweite Temperatursensor vom Typ DS18B20 ist am //digitalen Pin D6 angeschlossen. #define ds18b20_2 6 //Taster "sensor_select" am digitalen Pin D7 angeschlossen. #define tasterSensorSelect 7
Schritt 2 – Sensor initialisieren
Der Sensor DS18B20 verfügt über eine eigene UID und theoretisch kann man die beiden Sensoren auch über einen digitalen Pin verwalten (siehe DS18B20-Sensoren am Raspberry Pi Pico W: Temperaturdaten auf einer Webseite anzeigen) da der Arduino genügend freie Pins hat dupliziere ich hier einfach die beiden Aufrufe.
OneWire oneWire2(ds18b20_2); DS18B20_INT sensor2(&oneWire2);
Schritt 3 – Feld zum speichern der aktuellen Auswahl
Wenn wir den Taster zur Sensorauswahl betätigen möchte ich zwischen diesen beiden wechseln, dazu merke ich mir den Zustand als Zahl im Feld „sensorAuswahl“.
//Auswahl //0 - Sensor "normal" //1 - Sensor "außen" - nur lesen int sensorAuswahl = 0;
Schritt 5 – Taster für Sensorauswahl entprellen
Den Taster habe ich wie die anderen auch ohne 10 kOhm PullUp / PullDown Widerstand angeschlossen. Dieses löse ich über den internen 10 kOhm Widerstand welcher mit der MCU verbunden ist. Zusätzlich entprelle ich den Taster über die Bibliothek Bounce2.
Bounce btnSensorSelect = Bounce(); void setup(){ ... btnSensorSelect.attach(tasterSensorSelect, INPUT_PULLUP); btnSensorSelect.interval(BTN_INTERVALL); ... }
Schritt 6 – Funktion loop erweitern für die Sensorauswahl
In der Funktion loop müssen wir nun eine zusätzliche If-Bedingung hinzufügen um auf den Statuswechsel des Tasters zu reagieren und den Wert im Feld „sensorAuswahl“ umzukehren.
Zusätzlich wird der bisherige Code nur ausgeführt wenn der Wert des Feldes „sensorAuswahl“ gleich 0 ist, andernfalls (also wenn dieser 1 ist) wird geprüft ob das Display aktualisiert werden soll und dann der Wert des Außensensors über die Funktion writeLcdDisplay angezeigt.
void loop() { ... btnSensorSelect.update(); if (btnSensorSelect.fell()) { sensorAuswahl = sensorAuswahl == 0 ? 1 : 0; writeLcdDisplay(); } if (sensorAuswahl == 0) { ... } else if (sensorAuswahl == 1) { if ((lastUpdate + INTERVALL) < millis()) { //überschreiben des Wertes für die letzte Ausführung lastUpdate = millis(); writeLcdDisplay(); } }
Schritt 7 – Funktion writeLcdDisplay erweitern
Die Funktion writeLcdDisplay dient dazu die Werte auf dem Display anzuzeigen. Hier müssen wir zusätzlich noch eine If-Bedingung implementieren in welcher wir wieder das Feld „sensorAuswahl“ prüfen.
Wenn der Außensensor angezeigt werden soll, dann wird in der ersten Zeile der Text „Aussensensor“ angezeigt und in der zweiten Zeile der Text „akt. Temp.:“ inkl. dem aktuellen Sensorwert.
void writeLcdDisplay() { ... if (sensorAuswahl == 0) { ... } else if (sensorAuswahl == 1) { sensor2.requestTemperatures(); printTextAt(0, 0, "Aussensensor"); printTextAt(1, 0, ">akt. Temp.:" + String(sensor2.getTempC(), DEC)); }
fertiger Sketch zum anzeigen von zwei Sensorwerten auf einem LC-Display
Nachfolgend nun der fertige Sketch zum anzeigen von zwei Sensorwerten am Arduino inkl. Temperatursteuerung.
Hallo Stefan,
zwei Sensoren! Das ist richtig cool!
Bin gerade am Bau meines Heizkoffers – werde meine Bauschritte und Auswahl der genutzten Heizungsfolien bzw. Schaltung sowie LiPo BMS (Schutz gegen Überladung, Überstrom und Unterspannung) zum Aufbau dokumentieren.
Das Script ist sehr professionell –
Vielen Dank!
Grüße aus Stein bei Nürnberg
Harry Hofmann
Hallo Stefan!
ich habe zur Relays Steuerung das High und Low getauscht.
Jetzt schaltet das Relays auch bei erreichen der „maxtemp“ ab.
if (currentTemp <= minTemp) {
digitalWrite(relais, HIGH);
……..
digitalWrite(relais, LOW);
Serial.println("max");
gruß
Harry
Hallo Stefan!
Ein Problem besteht:
Wenn das Display den Aussen Sensor mit seiner aktuellen Temp. anzeigt,
schaltet das Relay bei erreichen der mintemp nicht mehr ein und beim MaxWert nicht mehr aus!
Erst wenn der Button Sensor Auswahl gedrückt wird, aktualisiert der Wert und das Relay schaltet.
Wie kann ich das ändern?
Gruß
Harry
Hi,
oh den test habe ich garnicht gemacht. Aber der Fix dafür ist einfach.
Du musst den Code aus der inneren If-Bedingung wo geprüft wird „if (sensorAuswahl == 0)“ nach außen ziehen.
Also quasi vor die If-Bedingung verschieben.
//Wenn der Zeitpunkt der letzten Ausführung plus dem Wert
//des INTERVALLs kleiner als die aktuellen Millisekunden sind, dann...
if ((lastUpdate + INTERVALL) < millis()) { //anfordern der Temperaturwerte sensor.requestTemperatures(); //auslesen der Temperatur in Grad Celsius currentTemp = sensor.getTempC(); //überschreiben des Wertes für die letzte Ausführung lastUpdate = millis(); //nur wenn die Auswahl auf 2 steht dann soll das LCD-Display aktualisiert werden //(Auswahl 2 zeigt die aktuelle Temperatur an) if (auswahl == 2) { writeLcdDisplay(); } //Wenn die gelesene Temperatur kleiner / gleich als der Wert der Konstante MIN_TEMP ist, //dann soll das Relais aktiviert werden. if (currentTemp <= minTemp) { digitalWrite(relais, LOW); Serial.println("min"); } else if (currentTemp >= maxTemp) {
//Ist der gelesene Wert jedoch größer / gleich als der Wert der Konstante MAX_TEMP so
//soll das Relais deaktiviert werden.
digitalWrite(relais, HIGH);
Serial.println("max");
}
}