Po DS18B20 sięga się wtedy, gdy trzeba zmierzyć temperaturę czegoś, a nie powietrza w pokoju: rury zasilania i powrotu w instalacji grzewczej, zasobnika ciepłej wody, zamrażarki, akwarium, przestrzeni pod podłogą. Czujnik jest dostępny w wodoodpornych sondach na przewodzie, komunikuje się jedną linią danych, a na tej jednej linii można powiesić kilka sztuk i podłączyć całość do jednego pinu GPIO w ESP32.

Żeby jedna sonda pojawiła się w Home Assistancie, wystarczy kilka minut. Kłopoty zaczynają się później: przy trzech czy czterech sondach na jednej magistrali trzeba wiedzieć, który odczyt pochodzi z której rury i co się stanie po wymianie jednej z nich. Pokazuję, jak to podłączyć, jak skonfigurować ESPHome, jak znaleźć i przypisać adres każdego czujnika oraz jakie usterki zdarzają się najczęściej.

Co potrafi DS18B20, a czego nie

Według strony produktu i noty katalogowej Analog Devices:

  • zakres pomiaru od -55 °C do +125 °C;
  • dokładność ±0,5 °C w zakresie od -10 °C do +85 °C (dla całego zakresu nota podaje szerszą tolerancję);
  • rozdzielczość ustawiana od 9 do 12 bitów, czyli krok 0,5, 0,25, 0,125 albo 0,0625 °C;
  • napięcie zasilania od 3,0 V do 5,5 V, więc czujnik działa bezpośrednio z pinu 3,3 V płytki ESP;
  • każdy układ ma unikalny 64-bitowy numer seryjny i dzięki temu wiele czujników może dzielić jedną magistralę;
  • tryb zasilania pasożytniczego, w którym czujnik pobiera energię z linii danych i wystarczą mu dwa przewody.

Przy 12 bitach jeden pomiar trwa do 750 ms. Przy ogrzewaniu, zamrażarce czy zasobniku wody to bez znaczenia, ale tam, gdzie liczy się szybka reakcja, warto o tym pamiętać.

Uwaga na tanie sondy

Chris Petrich w 2019 roku kupił ponad 1000 wodoodpornych sond i samych układów od ponad 70 sprzedawców. Wszystkie sondy z eBaya i AliExpress miały w środku podróbki DS18B20 i prawie wszystkie układy z tych serwisów też były podrobione. Część klonów nie działa w trybie zasilania pasożytniczego, część daje zaszumione odczyty, a część ma przesunięcie większe niż deklarowane ±0,5 °C.

Wiele z nich i tak nadaje się do zastosowań domowych. Nie zakładaj tylko, że sonda z serwisu aukcyjnego ma dokładność z noty katalogowej. Jeśli odczyt jest ważny, porównaj go z termometrem wzorcowym i popraw w ESPHome (o tym w części o kalibracji).

Podłączenie

DS18B20 ma trzy wyprowadzenia: GND, DQ (dane) i VDD. W obudowie TO-92 pin 1 to GND, pin 2 to DQ, a pin 3 to VDD. Sondy wodoodporne mają już przylutowane trzy przewody, ale kolory różnią się w zależności od sprzedawcy, więc przed podłączeniem zasilania sprawdź opis wyprowadzeń w ogłoszeniu albo multimetrem.

Połączenia wyglądają tak:

  • VDD do 3,3 V na płytce ESP;
  • GND do GND;
  • DQ do wolnego pinu GPIO;
  • rezystor podciągający między DQ a 3,3 V.

Dokumentacja ESPHome zaleca zewnętrzny rezystor podciągający około 4,7 kΩ i podaje, że wartości różniące się o ±1 kΩ zwykle też działają, o ile przewody nie są wyjątkowo długie. Rezystor potrzebny jest jeden na magistralę, nie na każdy czujnik.

Podłącz czujnik trzema przewodami, z zasilanym VDD. Zasilanie pasożytnicze oszczędza jeden przewód, ale w trakcie pomiaru wymaga mocniejszego podciągania linii, nota katalogowa odradza je powyżej 100 °C, a niektóre klony w ogóle go nie obsługują. Na płytce stykowej czy w puszce elektrycznej dodatkowa żyła nic nie kosztuje.

Wybrany pin musi działać i jako wejście, i jako wyjście, bo 1-Wire to magistrala dwukierunkowa. Musi też być pinem samego mikrokontrolera, a nie ekspandera wejść i wyjść. W klasycznym ESP32 dobrze sprawdzi się na przykład GPIO4. Unikaj pinów, które decydują o trybie uruchamiania układu („strapping pins”).

Kilka sond na jednej magistrali

Wszystkie czujniki łączy się równolegle: każde DQ do tej samej linii danych, każde VDD do 3,3 V, każde GND do masy. Poprowadź przewód jedną linią od ESP do najdalszego czujnika, a pozostałe podłącz po drodze krótkimi odgałęzieniami.

Nie buduj gwiazdy, w której kilka długich przewodów wychodzi z ESP w różne strony. Wytyczne Maxim (dziś Analog Devices) dotyczące długich sieci 1-Wire opisują układ liniowy z odgałęzieniami krótszymi niż 3 m. Gwiazdę bez przełączania gałęzi uznają za układ, w którym najtrudniej o niezawodność, i jej nie zalecają, bo odbicia sygnału od końca jednej gałęzi mogą przekłamać dane.

Jeśli czujniki naprawdę są rozrzucone w różnych kierunkach, ESPHome ma proste wyjście: kilka magistral na różnych pinach GPIO, po jednej na każdy kierunek. Każda z nich zostaje wtedy krótką linią bez rozgałęzień.

Konfiguracja ESPHome dla jednego czujnika

Konfiguracja składa się z dwóch części: magistrali (one_wire) i czujnika (dallas_temp).

one_wire:
  - platform: gpio
    pin: GPIO4

sensor:
  - platform: dallas_temp
    name: "Hot water tank"
    update_interval: 60s

Gdy na magistrali jest tylko jedno urządzenie, adres nie jest potrzebny. ESPHome użyje jedynego czujnika, jaki znajdzie. update_interval domyślnie wynosi 60 sekund, a resolution 12 bitów, więc obie opcje można pominąć.

Jak znaleźć adres każdego czujnika

Przy więcej niż jednym czujniku każdy wpis dallas_temp musi mieć address albo index. Żeby poznać adresy, wgraj oprogramowanie z samą magistralą one_wire. Wpisy czujników nie są jeszcze potrzebne, bo ESPHome przeszukuje magistralę także bez nich. Potem otwórz dziennik urządzenia.

Przy starcie, w opisie konfiguracji magistrali, pojawi się wiersz Found devices:, a pod nim po jednym wierszu na każdy czujnik z adresem i modelem, na przykład 0x...28 (DS18B20). Ostatni bajt adresu to kod rodziny układu, a dla DS18B20 wynosi on 28.

Żeby ustalić, który adres należy do której sondy, podłączaj je po jednej i zapisuj adresy. Możesz też ogrzać jedną sondę w dłoni i sprawdzić, który odczyt rośnie. Zapisz adres na etykiecie i przyklej ją do przewodu. Przy wymianie sondy bardzo się to przyda.

Konfiguracja z kilkoma czujnikami

one_wire:
  - platform: gpio
    pin: GPIO4
    id: heating_bus

sensor:
  - platform: dallas_temp
    one_wire_id: heating_bus
    address: 0x1234567812345628
    name: "Heating flow"

  - platform: dallas_temp
    one_wire_id: heating_bus
    address: 0x8765432187654328
    name: "Heating return"

Adresy w przykładzie są zmyślone, wpisz te z dziennika.

Zamiast adresów można użyć index: 0, index: 1 i tak dalej. Dokumentacja ESPHome ostrzega jednak, że numeracja wynika z kolejności adresów sprzętowych, a ta może się zmienić po zamianie, dodaniu albo usunięciu czujnika. Przy indeksach wymiana jednej sondy potrafi po cichu przenieść odczyty zasilania na powrót i automatyzacje ogrzewania zaczną reagować na niewłaściwą rurę. Z adresami ten problem nie istnieje. Gdy sonda padnie, zmieniasz jeden adres i nic innego się nie przesuwa.

one_wire_id jest wymagane dopiero przy więcej niż jednej magistrali w urządzeniu, ale jeśli wpiszesz je od początku, dodanie drugiej magistrali później nie będzie wymagało poprawek.

Kalibracja i niższa rozdzielczość

Stałe przesunięcie zmierzone względem termometru wzorcowego poprawisz filtrem:

  - platform: dallas_temp
    one_wire_id: heating_bus
    address: 0x1234567812345628
    name: "Heating flow"
    filters:
      - offset: -0.3

Wartość ustal na podstawie własnego porównania, a nie przykładu. Jeśli błąd jest inny przy niskiej, a inny przy wysokiej temperaturze, ESPHome ma też filtr calibrate_linear, w którym podaje się pary wartości zmierzonych i rzeczywistych.

Opcję resolution można zmniejszyć do 9, 10 albo 11 bitów. ESPHome krócej czeka wtedy na pomiar: przy 9 bitach 94 ms zamiast 750 ms przy 12. Do alarmu w zamrażarce krok 0,5 °C w zupełności wystarczy. Przy ogrzewaniu zwykle lepiej zostawić domyślne 12 bitów.

Wykorzystanie w Home Assistancie

Czujniki pojawiają się w integracji ESPHome jako encje temperatury w °C. Kilka pomysłów:

  • Ogrzewanie: różnica między zasilaniem a powrotem pokazuje, ile ciepła oddaje instalacja. Policzy ją czujnik szablonowy, a zbyt wysoka temperatura zasilania może wysłać powiadomienie.
  • Zamrażarka: wyzwalacz stanu liczbowego powyżej na przykład -15 °C przez 15 minut, żeby drzwi otwarte na chwilę nie uruchamiały alarmu. Próg dobierz sam.
  • Zasobnik ciepłej wody: pompa cyrkulacyjna albo grzałka włącza się tylko wtedy, gdy woda naprawdę tego wymaga.

ESPHome nadaje tym czujnikom klasę stanu measurement, więc Home Assistant przechowuje dla nich także statystyki długoterminowe. Rok historii masz bez zmieniania ustawień Recordera.

Najczęstsze problemy

  • Found no devices! w dzienniku: brak rezystora podciągającego, zły pin albo zamienione DQ i VDD. Najpierw sprawdź połączenia, dopiero potem YAML.
  • 1-wire bus is held low: linia danych stoi na 0 V. Szukaj zwarcia do masy, uszkodzonej sondy albo złego pinu.
  • Odczyt równo 85 °C: to wartość, którą czujnik ma po włączeniu zasilania, a nie wynik pomiaru. ESPHome odrzuca taki odczyt, gdy rozpozna, że wynika z restartu czujnika. Jeśli mimo to widzisz go regularnie, sprawdź zasilanie i połączenia.
  • Ostrzeżenia o błędnej sumie kontrolnej (invalid CRC, scratch pad checksum invalid): dane psują się po drodze. Zwykle winny jest za długi przewód, układ gwiazdy albo słabe połączenie. Spróbuj mocniejszego podciągania w zakresie zalecanym przez ESPHome, skróć odgałęzienia albo podziel magistralę.
  • Zamienione odczyty po wymianie sondy: konfiguracja używa index. Przejdź na address.
  • Błąd o indeksie spoza zakresu (out of range): ESPHome znalazł mniej czujników, niż wynika z indeksu. Sprawdź, która sonda zniknęła z magistrali.
  • Temperatura różni się o stopień albo więcej: podrobiony układ albo sonda z długim przewodem w ciepłym miejscu. Porównaj odczyt z termometrem wzorcowym i dodaj offset.