DS18B20 to popularny cyfrowy czujnik temperatury z interfejsem 1-Wire. Można go łatwo podłączyć do Arduino, ESP8266, ESP32 oraz innych mikrokontrolerów. Uruchomienie pomiaru wymaga prawidłowego połączenia przewodów, zastosowania rezystora podciągającego, instalacji bibliotek i odpowiedniej obsługi czasu konwersji.
Czym jest DS18B20 i jak działa
DS18B20 to cyfrowy czujnik temperatury firmy Maxim Integrated, wcześniej Dallas Semiconductor. Jego najważniejsze cechy to:
- Cyfrowy pomiar – wynik jest przesyłany bezpośrednio do mikrokontrolera, dlatego nie trzeba używać przetwornika ADC;
- Magistrala 1-Wire – wiele czujników może korzystać z jednej linii danych i jednego pinu mikrokontrolera;
- Zakres pomiarowy od −55 do +125°C – pozwala stosować czujnik w różnorodnych warunkach;
- Rozdzielczość od 9 do 12 bitów – zapewnia krok pomiarowy od 0,5 do 0,0625°C;
- Unikalny 64-bitowy adres ROM – umożliwia niezależną identyfikację każdego czujnika podłączonego do magistrali.
Cyfrowa transmisja danych sprawia, że DS18B20 jest mniej podatny na zakłócenia niż typowe czujniki analogowe. Wodoszczelne warianty umieszczone w metalowych sondach nadają się między innymi do pomiaru temperatury cieczy i pracy na zewnątrz.
Wyprowadzenia i zasilanie
Standardowy DS18B20 w obudowie TO-92 ma trzy wyprowadzenia:
- Pin 1 — GND – masa układu;
- Pin 2 — DQ – linia danych magistrali 1-Wire;
- Pin 3 — VDD – wejście zasilania.
Czujnik może być zasilany napięciem od 3,0 do 5,5 V. Napięcie zasilania i podciągnięcia linii danych należy dopasować do poziomów logicznych używanego mikrokontrolera. W systemach Arduino z logiką 5 V można zastosować 5 V, natomiast w projektach z ESP8266 i ESP32 należy używać 3,3 V.
Typowe połączenia dla najpopularniejszych płytek przedstawia tabela:
| Płytka | VDD | Przykładowy pin DQ | Podciągnięcie DQ |
|---|---|---|---|
| Arduino Uno lub Nano | 5 V | D2 | 4,7 kΩ do 5 V |
| NodeMCU z ESP8266 | 3,3 V | D6 | 4,7 kΩ do 3,3 V |
| ESP32 | 3,3 V | GPIO4 | 4,7 kΩ do 3,3 V |
Standardowo między linią DQ a VDD stosuje się rezystor podciągający 4,7 kΩ. W niektórych projektach używany jest rezystor 3,3 kΩ, szczególnie przy bardziej wymagających parametrach magistrali. Gotowe moduły DS18B20 często mają odpowiedni rezystor już na płytce.
Sposoby podłączenia DS18B20
1. Klasyczne zasilanie 3-przewodowe
Najbardziej niezawodny sposób podłączenia wykorzystuje osobne przewody zasilania, masy i danych:
- Podłącz GND – połącz masę czujnika z masą mikrokontrolera;
- Podłącz VDD – użyj napięcia 5 V dla Arduino z logiką 5 V albo 3,3 V dla ESP8266 i ESP32;
- Podłącz DQ – wybierz odpowiedni pin cyfrowy, na przykład D2 w Arduino lub GPIO4 w ESP32;
- Dodaj rezystor podciągający – umieść rezystor 4,7 kΩ między DQ a VDD, o ile nie jest już wbudowany w moduł.
Klasyczne zasilanie 3-przewodowe zapewnia największą stabilność i jest zalecane w większości projektów. W przypadku gotowego modułu wystarczy zwykle połączyć wyprowadzenia VCC, GND i DATA.
2. Zasilanie pasożytnicze
DS18B20 może również pracować z wykorzystaniem dwóch przewodów. W tym trybie pin VDD jest połączony z masą, a czujnik pobiera energię z linii danych i magazynuje ją w wewnętrznym kondensatorze.
Połączenie w trybie pasożytniczym wygląda następująco:
- GND – połącz z masą mikrokontrolera;
- VDD – połącz z masą;
- DQ – podłącz do wybranego pinu cyfrowego;
- Rezystor podciągający – umieść między DQ a linią zasilania.
Zasilanie pasożytnicze zmniejsza liczbę przewodów, ale wymaga prawidłowej obsługi czasów magistrali i odpowiednio mocnego podciągania linii podczas konwersji temperatury. W instalacjach z długimi przewodami lub wieloma czujnikami bezpieczniejszym wyborem jest zasilanie 3-przewodowe.
DS18B20 w praktyce – Arduino, ESP8266 i ESP32
Podłączenie do Arduino
Przykładowe połączenie czujnika z Arduino Uno lub Nano obejmuje:
- VDD – podłączenie do 5 V;
- GND – podłączenie do GND;
- DQ – podłączenie do pinu cyfrowego, na przykład D2, D3 lub D10;
- Rezystor 4,7 kΩ – podłączenie między DQ a 5 V.
Jako linię 1-Wire można wykorzystać niemal dowolny pin cyfrowy. Numer wybranego pinu trzeba następnie wskazać w programie.
Podłączenie do ESP8266 i NodeMCU
W przypadku płytek z ESP8266 należy korzystać z poziomów logicznych 3,3 V. Typowe połączenie wygląda następująco:
- VDD – podłączenie do 3,3 V;
- GND – podłączenie do GND;
- DQ – podłączenie do wybranego pinu, na przykład D6;
- Rezystor 4,7 kΩ – podłączenie między DQ a 3,3 V.
Nie należy podciągać linii danych ESP8266 do 5 V. DS18B20 pracuje stabilnie przy napięciu 3,3 V, a jego poziomy logiczne są wtedy zgodne z wymaganiami mikrokontrolera.
Podłączenie do ESP32
Przykładowa konfiguracja dla ESP32 obejmuje:
- VDD – podłączenie do 3,3 V;
- GND – podłączenie do GND;
- DQ – podłączenie do GPIO4, GPIO22 lub innego odpowiedniego pinu;
- Rezystor 4,7 kΩ – podłączenie między DQ a 3,3 V.
Czujnik może korzystać z większości cyfrowych pinów ESP32. Wybrane GPIO nie powinno jednak kolidować z funkcjami rozruchowymi płytki ani z pozostałymi elementami projektu.
Programowanie DS18B20 – wygodne biblioteki
Biblioteki OneWire i DallasTemperature
Najprostszą obsługę czujnika w środowisku Arduino zapewniają biblioteki OneWire i DallasTemperature. Pierwsza realizuje komunikację przez magistralę 1-Wire, a druga udostępnia wygodne funkcje do wykrywania czujników, uruchamiania konwersji i odczytywania temperatury.
Obie biblioteki można zainstalować za pomocą menedżera bibliotek w Arduino IDE.
Przykładowy kod – pojedynczy DS18B20 na Arduino
Poniższy program odczytuje temperaturę z czujnika podłączonego do pinu D2 i wyświetla wynik w monitorze portu szeregowego:
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
Serial.print("Temperatura: ");
Serial.print(tempC);
Serial.println(" °C");
delay(1000);
}
Najważniejsze instrukcje wykorzystane w programie to:
sensors.begin()– inicjuje bibliotekę i wyszukuje czujniki na magistrali;sensors.requestTemperatures()– rozpoczyna konwersję temperatury;sensors.getTempCByIndex(0)– odczytuje temperaturę pierwszego wykrytego czujnika.
Wiele czujników na jednej linii
Dzięki interfejsowi 1-Wire kilka czujników DS18B20 można połączyć równolegle z tym samym pinem danych. Każdy egzemplarz ma unikalny adres ROM, dlatego może być niezależnie identyfikowany i odczytywany.
Biblioteka DallasTemperature pozwala korzystać z następujących metod obsługi wielu czujników:
- Odczyt liczby urządzeń – metoda
sensors.getDeviceCount()zwraca liczbę wykrytych czujników; - Odczyt według indeksu – czujniki można odczytywać za pomocą indeksów 0, 1, 2 i kolejnych;
- Odczyt według adresu ROM – unikalny adres pozwala przypisać wynik do konkretnego punktu pomiarowego.
Obsługa wielu czujników na jednej linii doskonale sprawdza się podczas monitorowania kilku punktów instalacji grzewczej, zbiornika, akwarium lub urządzenia.
Programowanie niskopoziomowe – magistrala 1-Wire
W mikrokontrolerach bez gotowych bibliotek, na przykład w wybranych układach ATtiny, protokół 1-Wire można zaimplementować samodzielnie.
Ogólny algorytm odczytu temperatury obejmuje następujące etapy:
- Zresetuj magistralę – wygeneruj impuls resetu i zaczekaj na sygnał obecności czujnika;
- Wybierz urządzenie – wyślij komendę ROM, na przykład
SKIP_ROM, jeśli na linii znajduje się tylko jeden czujnik; - Uruchom konwersję – wyślij komendę
CONVERT_To kodzie0x44; - Zaczekaj na wynik – przy rozdzielczości 12-bitowej konwersja może trwać do około 750 ms;
- Odczytaj pamięć – ponownie zresetuj magistralę, a następnie wyślij
SKIP_ROMiREAD_SCRATCHPADo kodzie0xBE; - Zweryfikuj dane – odczytaj dziewięć bajtów pamięci scratchpad, w tym dwa bajty temperatury i sumę kontrolną CRC.
Wartość 85°C zazwyczaj oznacza, że konwersja nie została zakończona albo program odczytał domyślną zawartość rejestru temperatury.
Implementacja protokołu na poziomie bitowym wymaga generowania impulsu resetu oraz precyzyjnych szczelin czasowych do zapisu i odczytu bitów zgodnie ze specyfikacją DS18B20.
Interpretacja danych – przeliczenie temperatury
W pamięci scratchpad wynik jest zapisany jako 16-bitowa liczba całkowita ze znakiem. Przy rozdzielczości 12-bitowej najmłodszy bit odpowiada wartości 1/16°C, czyli 0,0625°C.
Dwa bajty wyniku pełnią następujące funkcje: LSB zawiera młodszą część wartości i bity ułamkowe, natomiast MSB przechowuje starszą część wyniku oraz znak temperatury.
Po połączeniu bajtów MSB i LSB wartość trzeba zinterpretować jako 16-bitową liczbę ze znakiem, a następnie podzielić przez 16. Biblioteka DallasTemperature wykonuje te obliczenia automatycznie i zwraca temperaturę jako wartość float w stopniach Celsjusza lub Fahrenheita.
DS18B20 w MicroPythonie
DS18B20 może być również obsługiwany w MicroPythonie na płytkach ESP8266 i ESP32. Poniższy przykład wykrywa czujniki podłączone do GPIO5, uruchamia konwersję i wyświetla wyniki:
import machine
import onewire
import ds18x20
import time
dat = machine.Pin(5)
ds = ds18x20.DS18X20(onewire.OneWire(dat))
roms = ds.scan()
print('Znalezione czujniki:', roms)
def read_temp():
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
temperature = ds.read_temp(rom)
print('Temperatura:', temperature, '°C')
read_temp()
Program można rozbudować o prezentację wyniku na wyświetlaczu, zapis pomiarów do pliku, komunikację MQTT lub serwer WWW udostępniający temperaturę w sieci lokalnej.
Typowe problemy i ich diagnoza
1. Brak rezystora podciągającego lub zła wartość
Brak rezystora podciągającego między DQ a VDD może powodować niestabilną pracę magistrali 1-Wire. Czujnik może nie być wykrywany, okresowo znikać z magistrali albo zwracać błędne wyniki.
Standardową wartością jest 4,7 kΩ. Przed dodaniem rezystora warto sprawdzić, czy nie został już zamontowany na gotowym module.
2. Niewłaściwe napięcie zasilania
Podciągnięcie linii danych do 5 V podczas współpracy z ESP8266 lub ESP32 może uszkodzić wejście mikrokontrolera albo powodować nieprawidłowe działanie. W systemach z logiką 3,3 V zarówno czujnik, jak i rezystor podciągający powinny być podłączone do 3,3 V.
3. Odczyt 85°C
Wartość 85°C jest domyślnie zapisana w rejestrze temperatury po uruchomieniu czujnika. Jej odczyt najczęściej wskazuje, że program nie zaczekał na zakończenie konwersji.
W takiej sytuacji należy sprawdzić następujące elementy:
- Czas konwersji – przy rozdzielczości 12-bitowej może wynosić do około 750 ms;
- Kolejność komend – reset magistrali, wybór urządzenia i odczyt pamięci muszą przebiegać we właściwej kolejności;
- Zasilanie i rezystor – niestabilne napięcie lub brak podciągnięcia może uniemożliwić prawidłową konwersję.
4. Długie przewody i zakłócenia
Przy przewodach o długości kilku metrów może być konieczne dostosowanie wartości rezystora podciągającego, ograniczenie prędkości komunikacji oraz staranne poprowadzenie masy.
Stabilność magistrali można poprawić na kilka sposobów:
- Ograniczenie odgałęzień – krótsze odnogi zmniejszają odbicia i pojemność magistrali;
- Oddzielenie od przewodów zasilających – linia danych nie powinna przebiegać równolegle do kabli silnoprądowych;
- Zastosowanie skrętki lub ekranu – pomaga ograniczyć wpływ zakłóceń elektromagnetycznych;
- Użycie topologii liniowej – przy wielu czujnikach jest zwykle stabilniejsze niż rozbudowana topologia gwiazdy.
Praktyczne zastosowania DS18B20
DS18B20 znajduje zastosowanie w projektach elektronicznych, automatyce domowej i systemach IoT:
- Termometry domowe – pomiar temperatury za pomocą jednej lub kilku sond;
- Systemy ogrzewania – monitorowanie instalacji centralnego ogrzewania i ciepłej wody użytkowej;
- Pomiar temperatury cieczy – kontrola akwariów, bojlerów, zbiorników i instalacji solarnych;
- Monitoring elektroniki – kontrolowanie temperatury radiatorów, obudów i sekcji zasilania;
- Systemy IoT – przesyłanie wyników przez ESP8266 lub ESP32 do sieci lokalnej albo chmury.
Dostępność gotowych bibliotek, modułów i przykładów sprawia, że DS18B20 jest jednym z najczęściej wybieranych czujników temperatury w projektach DIY.


