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.

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.

Zurück zum Blog