DS18B20 wasserdichter Temperatursensor mit Arduino auslesen: OneWire-Tutorial
Ein gewöhnlicher Temperatursensor wird schnell zum Problem, sobald Feuchtigkeit ins Spiel kommt – im Gartenbeet, im Aquarium oder im Außenbereich. Der DS18B20 löst das mit einem wasserdichten Edelstahlgehäuse und einem cleveren Trick: Über nur eine einzige Datenleitung (OneWire) lassen sich beliebig viele Sensoren gleichzeitig auslesen. In diesem Tutorial baust du eine Einzelmessung, eine Multi-Sensor-Schaltung und einen Temperatur-Logger mit SD-Karte.
Warum der DS18B20 anders ist als andere Temperatursensoren
Sensoren wie der DHT22 oder der BMP280 sprechen I2C oder ein proprietäres Timing-Protokoll und belegen dabei feste Pins. Der DS18B20 nutzt stattdessen das 1-Wire-Protokoll von Maxim/Dallas: Stromversorgung, Masse und Datenleitung – mehr braucht der Sensor nicht, und die Datenleitung kann sich theoretisch mit über 100 weiteren DS18B20 auf einem einzigen digitalen Pin teilen. Jeder Sensor hat eine weltweit eindeutige 64-Bit-Seriennummer, über die er eindeutig angesprochen wird.
Das MAKEROO-Modul kommt mit einem 1 Meter langen, wasserdichten Kabel und einer Edelstahl-Sonde – ideal für Anwendungen, bei denen der eigentliche Arduino trocken bleiben muss: Poolthermometer, Aquarium-Überwachung, Kompost-Monitoring, Kühlschrank-Logger oder Außentemperatur-Messung am Balkon.
Der Sensor misst mit einer Genauigkeit von ±0,5 °C im Bereich von -10 °C bis +85 °C und liefert bei voller Auflösung (12 Bit) Werte in 0,0625 °C-Schritten – für die meisten Maker-Projekte mehr als ausreichend.
Was du brauchst
| Bauteil | Menge | ca. Preis | Link |
|---|---|---|---|
| DS18B20 wasserdichter Temperatursensor (1m Kabel) | 1-3x | ab 1,39 € | Zum Produkt |
| UNO R3 Board | 1x | ab 4,99 € | Zum Produkt |
| Micro SD Card Reader Modul (für Logger-Projekt) | 1x | ab 1,19 € | Zum Produkt |
| Widerstände-Sortiment (für 4,7kΩ Pull-up) | 1x | ab 5,99 € | Zum Produkt |
| Breadboard 400 Kontakte | 1x | ab 3,49 € | Zum Produkt |
| 22AWG Kabel 2-adrig (Verlängerung) | nach Bedarf | ab 0,99 € | Zum Produkt |
Zusätzlich installierst du in der Arduino IDE über den Bibliotheksverwalter die Pakete OneWire (von Paul Stoffregen) und DallasTemperature (von Miles Burton) – beide sind kostenlos und decken praktisch alle Anwendungsfälle ab.
Schaltungsaufbau
| DS18B20 Kabel | UNO R3 Pin | Funktion |
|---|---|---|
| Rot | 5V | Spannungsversorgung |
| Schwarz | GND | Masse |
| Gelb | Pin 2 | Datenleitung (1-Wire) |
Der wichtigste Punkt beim Aufbau: Zwischen der Datenleitung (gelb) und 5V muss ein 4,7kΩ Pull-up-Widerstand sitzen. Ohne ihn bleibt die Leitung in einem undefinierten Zustand und die Kommunikation schlägt fehl – das ist die häufigste Fehlerquelle bei diesem Sensor. Bei mehreren Sensoren reicht ein einzelner Pull-up-Widerstand für den gesamten Bus, da sich alle Sensoren dieselbe Datenleitung teilen.
Code 1: Einzelnen Sensor auslesen
Der einfachste Einstieg: Ein DS18B20 wird erkannt und alle zwei Sekunden ausgelesen.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_PIN 2
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensoren(&oneWire);
void setup() {
Serial.begin(9600);
sensoren.begin();
Serial.print("Gefundene DS18B20-Sensoren: ");
Serial.println(sensoren.getDeviceCount());
}
void loop() {
sensoren.requestTemperatures();
float temperatur = sensoren.getTempCByIndex(0);
if (temperatur == DEVICE_DISCONNECTED_C) {
Serial.println("Fehler: Sensor nicht erreichbar!");
} else {
Serial.print("Temperatur: ");
Serial.print(temperatur);
Serial.println(" °C");
}
delay(2000);
}
So funktioniert's
requestTemperatures() startet die Messung auf allen angeschlossenen Sensoren gleichzeitig – bei voller 12-Bit-Auflösung dauert die Wandlung bis zu 750ms. Erst danach liest getTempCByIndex(0) den Wert des ersten gefundenen Sensors aus. DEVICE_DISCONNECTED_C ist eine spezielle Konstante (-127°C), die eine fehlerhafte Verbindung anzeigt und sich hervorragend zur Fehlerprüfung eignet.
Code 2: Mehrere Sensoren über Adressen unterscheiden
Der eigentliche Vorteil des OneWire-Busses zeigt sich mit mehreren Sensoren – etwa je einer für Innen- und Außentemperatur. Da jeder DS18B20 eine feste, eindeutige Adresse hat, kannst du sie sauber auseinanderhalten, statt dich auf die (nicht garantierte) Reihenfolge zu verlassen.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_PIN 2
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensoren(&oneWire);
DeviceAddress adresseInnen;
DeviceAddress adresseAussen;
void druckeAdresse(DeviceAddress adresse) {
for (uint8_t i = 0; i < 8; i++) {
if (adresse[i] < 16) Serial.print("0");
Serial.print(adresse[i], HEX);
}
}
void setup() {
Serial.begin(9600);
sensoren.begin();
int anzahl = sensoren.getDeviceCount();
Serial.print("Gefunden: ");
Serial.println(anzahl);
// Adressen der ersten zwei Sensoren auslesen und anzeigen
if (anzahl >= 1) {
sensoren.getAddress(adresseInnen, 0);
Serial.print("Sensor 1 Adresse: ");
druckeAdresse(adresseInnen);
Serial.println();
}
if (anzahl >= 2) {
sensoren.getAddress(adresseAussen, 1);
Serial.print("Sensor 2 Adresse: ");
druckeAdresse(adresseAussen);
Serial.println();
}
}
void loop() {
sensoren.requestTemperatures();
float tempInnen = sensoren.getTempC(adresseInnen);
float tempAussen = sensoren.getTempC(adresseAussen);
Serial.print("Innen: ");
Serial.print(tempInnen);
Serial.print(" °C | Aussen: ");
Serial.print(tempAussen);
Serial.println(" °C");
delay(2000);
}
Notiere dir die im seriellen Monitor ausgegebenen Adressen (z. B. 28FF641E...) und trage sie fest im Code ein, sobald du weißt, welcher Sensor wo verbaut ist. So bleibt die Zuordnung stabil, auch wenn du später weitere Sensoren am selben Bus ergänzt.
Code 3: Temperatur-Logger mit SD-Karte und Zeitstempel
Für Langzeitmessungen kombinierst du den DS18B20 mit dem Micro-SD-Kartenmodul aus unserem Datenlogger-Tutorial. Jede Messung wird als CSV-Zeile gespeichert, die sich später bequem in Excel oder Google Sheets auswerten lässt.
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <SD.h>
#define ONE_WIRE_PIN 2
#define SD_CHIP_SELECT 4
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensoren(&oneWire);
unsigned long messungNr = 0;
void setup() {
Serial.begin(9600);
sensoren.begin();
if (!SD.begin(SD_CHIP_SELECT)) {
Serial.println("SD-Karte nicht gefunden!");
while (true) delay(100);
}
// Kopfzeile nur schreiben, wenn Datei neu ist
if (!SD.exists("temp_log.csv")) {
File datei = SD.open("temp_log.csv", FILE_WRITE);
if (datei) {
datei.println("Messung,Temperatur_C");
datei.close();
}
}
Serial.println("Logger bereit");
}
void loop() {
sensoren.requestTemperatures();
float temperatur = sensoren.getTempCByIndex(0);
messungNr++;
File datei = SD.open("temp_log.csv", FILE_WRITE);
if (datei) {
datei.print(messungNr);
datei.print(",");
datei.println(temperatur, 2);
datei.close();
Serial.print("Messung ");
Serial.print(messungNr);
Serial.print(": ");
Serial.print(temperatur);
Serial.println(" °C gespeichert");
} else {
Serial.println("Fehler beim Schreiben auf SD-Karte!");
}
delay(60000); // jede Minute eine Messung
}
Für echte Zeitstempel statt einer fortlaufenden Nummer lohnt sich die Erweiterung um ein DS3231 RTC-Modul – dazu findest du in Kürze ein eigenes Tutorial auf unserem Blog.
Praxistipps
🌡️ Parasitic Power sparen: Verzichte auf den "Parasite Power Mode" (nur 2 Adern) für Einsteigerprojekte – die 3-Draht-Verkabelung mit separater Stromversorgung ist deutlich zuverlässiger und einfacher zu debuggen.
🔢 Auflösung anpassen: Mit sensoren.setResolution(adresse, 9) reduzierst du die Auflösung auf 9 Bit – die Messung dauert dann nur noch ca. 94ms statt 750ms, was bei vielen Sensoren am selben Bus die Zykluszeit deutlich verkürzt.
💧 Dichtigkeit prüfen: Die Schweißnaht am Edelstahlgehäuse ist wasserdicht, nicht aber die Kabeltülle am anderen Ende – bei dauerhaftem Unterwasser-Einsatz solltest du den Übergang zusätzlich mit Schrumpfschlauch und Heißkleber abdichten.
Troubleshooting
⚠️ "Gefundene Sensoren: 0": In 9 von 10 Fällen fehlt der 4,7kΩ Pull-up-Widerstand zwischen Datenleitung und 5V, oder er sitzt zwischen der falschen Ader. Prüfe außerdem, ob die Kabelfarben deines Moduls von der Standardbelegung abweichen – manche Chargen nutzen Blau statt Gelb für die Datenleitung.
⚠️ Temperaturwert konstant -127°C: Das ist DEVICE_DISCONNECTED_C und bedeutet, dass die Kommunikation zum Sensor komplett fehlschlägt – meist ein Wackelkontakt auf dem Breadboard oder eine vertauschte VCC/GND-Verbindung.
⚠️ Werte springen unrealistisch: Lange, unverdrillte Kabel können bei Störungen fehlerhafte CRC-Werte liefern. Halte die Leitungslänge bei ungeschirmten Kabeln unter 5-10 Metern oder nutze ein zusätzliches Twisted-Pair-Kabel bei längeren Strecken.
🌡️ Starte dein Temperatur-Projekt
Alle Bauteile für dieses Tutorial findest du bei MAKEROO.
- Sensoren & Module – DS18B20, SD-Kartenmodul & mehr
- Mikrocontroller-Boards – UNO R3, Nano V3 und ESP32
Kombiniere den Sensor mit unserem Datenlogger-Tutorial für dauerhafte Temperaturaufzeichnung.
Fazit
Der DS18B20 ist die erste Wahl, sobald Feuchtigkeit oder Nässe im Spiel sind – dank wasserdichter Sonde und 1-Wire-Bus lässt er sich zudem beliebig erweitern, ohne zusätzliche Pins zu verbrauchen. Von der Einzelmessung über die adressbasierte Mehrfachauslese bis zum SD-Karten-Logger zeigen die drei Codebeispiele, wie du präzise Temperaturdaten zuverlässig erfasst und langfristig speicherst.