Czujnik temperatury DS18B20 – jak działa?

Czujnik temperatury DS18B20 jest to produkt firmy Maxim Integrated. Pozwala na pomiar temperatury w zakresie -55 °C do 125 °C. Komunikacja z czujnikiem odbywa się przez sieć OneWire, która umożliwia łączenie wielu czujników równolegle na wspólnej magistrali. Każdy wyprodukowany czujnik posiada unikatowy 64-bitowy numer seryjny. Dzięki unikalnemu numerowi seryjnemu każdego wyprodukowanego czujnika możemy połączyć jednym przewodem równolegle wiele czujników i odczytywać temperaturę z każdego z czujników DS18B20 oddzielanie. Jest to możliwe, gdyż możemy każdy czujnik zaadresować, wysyłając zapytanie.

Łączenie równolegle dużej ilości czujników na trójżyłowej magistrali jest fenomenem czujników temperatury DS18B20. Czujniki pozwalają niskim kosztem i niezbyt skomplikowaną siecią przeprowadzać pomiary i rozkład temperatury na interesującym nas obiekcie. Za pomocą jednej linii danych możemy przeprowadzać pomiary w wielu punktach. czujnik temperatury DS18B20 znajduje zastosowanie w takich obszarach jak:

  • HVAC,
  • budynek inteligentny,
  • maszyny przemysłowe,
  • monitoring przebiegu procesu np. w destylatorze,
  • monitoring stanu jakiejś substancji np. zboże.

Generalnie czujnik temperatury DS18B20 możemy traktować jako cyfrowy czujnik temperatury o programowalnej rozdzielczości. Układ ten jest dostępny w obudowach TO-92, SO i μSOP. Jenak najczęściej spotykanym wariantem jest przewlekany TO-92.

Czujnik temperatury DS18B20
Czujnik temperatury DS18B20

Czujnik temperatury DS18B20 do działania nie potrzebuje żadnych dodatkowych komponentów. Działa poprawnie przy napięciu zasilania od 3 do 5V. Dane udostępniane są z dokładnością 0,5°C dla zakresu -10 do 85°C. Pełen zakres pomiarowy czujnika to -55 do 125°C. Aby odczytać temperatuBrę z czujnika temperatury DS18b20, w dużym skrócie należy:

  1. Wysłać najpierw do niego komendę konwersji przetwornika ADC,
  2. Odczekać na zakończenie działania przetwornika ADC.
  3. Wysłać komendę odczytu temperatury.
  4. Odebrać wartość temperatury.

Ta procedura składa się z szeregu innych mniejszych kroków, które omówię poniżej.

Przetworniki OneWire obsługujące czujnik temperatury DS18B20

W Ntronic mamy urządzenia, którymi łatwo można odczytywać dane z czujników temperatury DS18B20. To właśnie wiedza wykorzystana w tym artykule posłużyła do ich zbudowania. Jeśli potrzebujesz moduł odczytującego temperaturę z czujników DS18B20 zapraszam do zapoznania się z nimi

Przetwornik TD2 ↗

Umożliwia odczyt z czujników temperatury i wilgotności w sieci OneWire o długości nawet 400 m. Dane można odczytywać portami RS485 i USB. Istotne jest, że te porty są separowane galwanicznie.

Moduł TD1.01 ↗

TD1.01 to konwerter temperatury z wyświetlaczem LED. Odczytuje temperaturę z 64 czujników temperatury DS18B20 w sieci o długości 100 m. Dane odczytujemy portem RS485 przez Modbus RTU

Przetwornik temperatury na szynę DIN z wyświetlaczem

Pamięć czujnika temperatury DS18B20

Jeśli zajrzymy do wewnętrznej budowy logicznej układu, to widzimy, że jest tam wiele elementów. Znajdziemy tam coś takiego jak Scratchpad (notatnik). Jest to obszar pamięci, który możemy odczytywać i częściowo zapisywać. Składa się on z 8-u bajtów. Część rejestrów, których wartości nie są kasowane po resecie zasilania, stanowi pamięć typu EEPROM. Zaliczamy do nich rejestr konfiguracyjny oraz bajty TH i TL, zawierające progi alarmów temperatury.

Czujnik temperatury DS18B20 układ rejestrów
  • Bajty 0 i 1 zawierają rejestry pomiaru temperatury. Można je tylko odczytać.
  • Bajty 2, 3 zapewniają dostęp do rejestrów z progami alarmowymi TH i TL.
  • Bajt 4 zawiera ustawienie konfiguracji.
  • Bajty 5, 6, 7 są zarezerwowane do wewnętrznego użycia przez urządzenie i nie mogą być kasowane. Odczyt ich powoduje zwrócenie wartości jeden.
  • Bajt 8 służy wyłącznie do odczytu i zawiera wyliczone CRC z bajtów od 0 do 7 ze scratchpadu.

Czujnik temperatury DS18B20 – bajt 8 CRC

Wartość tego bajtu wyznaczona jest z pierwszych 8 bajtów pamięci. Należy zaznaczyć, że bajt CRC zmienia się wraz ze zmianą zawartości scratchpada. Układ Master odczytujący pamięć czujnika może wykorzystać bajt CRC do sprawdzenia poprawności transmisji. Po odczytaniu pamięci z bajtem CRC należy obliczyć CRC tej wiadomości i porównać z dostarczonym bajtem 8. Matematyczny sposób liczenia CRC:

CRC = X8 + X5 + X4 + 1

Poniżej fragment kodu w języku C stosowany w urządzeniach Ntronic do obliczania sumy CRC podczas odczytu z czujników DS18B20

uint8_t OneWire_CRC8(uint8_t *addr, uint8_t len) {
	uint8_t crc = 0, inbyte, i, mix;

	while (len--) {
		inbyte = *addr++;
		for (i = 8; i; i--) {
			mix = (crc ^ inbyte) & 0x01;
			crc >>= 1;
			if (mix) {
				crc ^= 0x8C;
			}
			inbyte >>= 1;
		}
	}

	/* Return calculated CRC */
	return crc;
}

Czujnik temperatury DS18B20 – bajt 4 konfiguracja czujnika

W rejestrze konfiguracyjnym możemy ustawić z jaką rozdzielczością będą udostępniane wartości temperatur. Służą do tego tylko dwa bity rejestru 4-tego: bit 5 oraz 6-y. Bit 7 oraz bity 0..4 są zarezerwowane do wewnętrznego użytku przez urządzenie i nie powinny być kasowane.

bit 7bit 6bit 5 bit 4 bit 3bit 2bit 1 bit 0
0R1R211111

Istnieje zależność pomiędzy rozdzielczością a czasem konwersji. Użytkownik może wybrać wartość od 9-ciu do 12-stu bitów.

Warto zwrócić uwagę, że dokładność czujnika w zakresie -10 … 80 °C wynosi 0,5 °C. Oznacza to, że większa rozdzielczość niż 9 bitów, może nam się przydać tylko do rozróżnienia zmiany temperatury. 

R1R2RozdzielczośćDokładnośćMax czas konwersji
009-bit0,5 °C93,75 ms
0110-bit0,25 °C187,5 ms
1011-bit0,125 °C375 ms
1112-bit0,06125 °C750 ms

Czujnik temperatury DS18B20 – bajt 3 i 2 rejestry alarmowe

Gdy układ ADC czujnika temperatury DS18B20 zakończy konwersję temperatury, otrzymana wartość jest porównywana z wartościami zapisanymi w rejestrach TH i TL. Jeśli wartość temperatury jest większa bądź równa TH czy też mniejsza, bądź równa TL następuje ustawienie wewnętrznej flagi. Status tej flagi możemy odczytywać za pomocą komendy ALARM SEARCH (0xEC). Rejestry TH i TL są typu EEPROM, więc ich wartość są pamiętane po wyłączeniu zasilania.

Działanie tej komendy ALARM SEARCH jest identyczne z komendą Search ROM. Na wywołanie odpowiadają tylko układy Slave z ustawioną flagą alarmu. Komenda ta pozwala układowi Master ustalić, który z układów DS18B20 na magistrali w czasie konwersji temperatury napotkał na stan alarmu.

Flaga alarmowa jest aktualizowana po każdym cyklu konwersji temperatury. Jeśli nie są używane funkcje alarmu, rejestry TH i TL mogą służyć jako pamięć ogólna.

Czujnik temperatury DS18B20 – bajt 0 i 1 rozkodowanie temperatury

W bajtach 0 i 1 zakodowana jest mierzona temperatura. Sposób jej prezentacji jest powiązany z konfiguracją rozdzielczości z bajtu 4. Ustawienie odpowiednio 9, 10, 11 lub 12 bitów, odpowiada odpowiednio dokładnościom 0,5 °C, 0,25 °C, 0,125 °C, 0,0625 °C. Oznacza to, przykładowo, że jeśli mamy wybrane ustawienie 9 bitów. Bity 2, 1 i 0-ym bajtu LSB będą zawsze wynosiły 0 i tym samym dokładność pomiaru będzie wynosić 0,5 °C. Jeśli wybierzemy 11 bitową dokładność, aktywne staną się bajty 2 i 1 a ich wartości wynoszą kolejno 0,25 oraz 0,125 °C. Spowoduje to zwiększenie dokładności odczytów do 0,125 °C. Jeśli wybierzemy rozdzielczość 12 bitów, to wszystkie bity będą znaczące. Wartość domyślna to 12 bitów.

Bajt 1 (MSB):

nr bitubit 7bit 6bit 5 bit 4 bit 3bit 2bit 1 bit 0
wartośćSSSSS262524
znakznakznakznakznak643216

Bajt 0 (LSB):

nr bitubit 7bit 6bit 5 bit 4 bit 3bit 2bit 1 bit 0
wartość232221202-12-22-32-4
84210,50,250,1250,0625

Czujnik temperatury DS18B20 wyliczenie temperatury z rejestru

Samo dekodowanie temperatur z rejestrów nie musi uwzględniać ustawień rozdzielczości. Jeśli jakiś bajt będzie nieaktywny, jego wartość będzie po prostu wynosić 0. Nie będzie on znaczący w naszych obliczeniach. Przykładowe obliczenie poniżej:

MSBLSBBinarnieObliczenieWynik
01h91h0000 0001 1001 000116+8+1+0,062525,0625 °C
00h08h0000 0000 0000 10000,50,5 °C

Jeśli bity znaku będą miały wartości 1, to przed obliczeniem wartości należy odwrócić wartości bitów oraz dodać 1. Otrzymana wartość traktujemy jako liczbę ujemną.

MSBLSBBinarnieOdwrotność+ 1ObliczenieWynik
FFh5Eh1111 1111 0101 11100000 0000 1010 00010000 0000 1010 0010-1*(8+2+0,125)-10,125 °C
FCh90h1111 1100 1001 00000000 0011 0110 11110000 0011 0111 0000-1*(32+16+4+2+1)-55 °C

Chcąc dobrze zrozumieć sposób działania transmisja danych z czujnikami, warto zapoznać się zasadą działania protokołu 1-wire. Jeśli znasz zasadę działania 1-wire, pomiń następny rozdział i przejdź od razu do kolejnego, w którym omawiam transmisję danych.

Jak działa OneWire?

Na temat budowania systemów z magistralą 1-wire i napisałem odrębny artykuł. Objaśniam tam takie aspekty jak: waga i promień sieci, topologie, przykłady połączeń z urządzeniami, dobór przewodów. Link do wpisu poniżej.
Zasada działania, projektowanie oraz budowanie niezawodnych sieci OneWire

Interfejs OneWire opracowano celem redukcji liczby przewodów, koniecznych do realizacji połączeń pomiędzy układami scalonymi. Zasada przekazu danych opiera się na generowaniu impulsów, których sekwencja i czas trwania kodują odpowiednie stany logiczne (0 i 1) – dzięki temu nie jest konieczne stosowanie dodatkowej linii zegarowej, a każdy dodatkowy czujnik dopinany jest do magistrali bez przyłączania dodatkowych linii sygnałowych.

Jak zbudować sieć OneWire

Połączenie OneWire umożliwia stosunkowo niewielką przepustowość transmisji danych — standardowo 16 kbps (w trybie overdrive maksymalnie do 142 kbps). Jest podobne do interfejsu I²C, ale z uwagi na pojedynczą linię komunikacyjną jest zarówno wolniejsze, ale i tańsze. Pojedyncza sieć 1-Wire może się składać się z zawsze TYLKO jednego urządzenia odpytującego (przetwornik TD2 na grafice) oraz wielu urządzeń podrzędnych — w naszym przypadku czujników temperatury DS18B20.

Czujnik temperatury DS18B20 w komunikacji z modułem TD2
Moduł TD2 z czujnikami OneWire

Ilość podłączonych czujników jest warunkowana jedynie pojemnością linii. Każde urządzenia ma swój własny unikalny kod, dlatego
ilość urządzeń możliwych do zaadresowania w wirtualnej magistrali jest praktycznie nieograniczona. Należy jednak pamiętać, że każdy dodatkowy metr magistrali oraz czujnik stanowi obciążenie linii i jeśli jej pojemność przekroczy graniczną wartość, zbocza sygnałów będą zbyt wolne by urządzenia poprawnie odbierały sygnały.

Dane wymieniane są TYLKO linią DQ, dlatego magistrala 1-Wire definiowana jest jako jednoprzewodowa, mimo, że do czujnika podłączamy 2 lub 3 przewody,

Czujnik temperatury DS18B20 może działać bez zewnętrznego źródła zasilania. Mówi się tutaj o tzw. zasilaniu pasożytniczym i w taki wypadku do czujnika podłączamy tylko linie danych DQ i masę GND.

Przesyłanie 0 i 1 w magistrali 1-wire

Transmisja danych na pierwszy moment wydaje się skomplikowana. Za pomocą jednej linii danych musimy mieć możliwość transferu stanu logicznego „HIGH” czyli 1 oraz „LOW” czyli 0 oraz musimy przekazywać dane w dwie strony, wysyłać zapytania do czujnika i odczytywać dane przez niego nadane.

Jak wymusić 1 – kę logiczną jeśli wszystkie urządzenia są typu otwarty dren?
Urządzenia komunikujące się w tej sieci, posiadają porty typu otwarty dren lub trójstanowy port. Oznacza to, że mogą wymusić na magistrali logiczne 0 (GND), lub nie wpływać na jej stan. Jeśli żadne urządzenie nie „ściągnie” magistrali do 0, będzie na niej stan logicznej 1-ki. Dzieje się tak, gdyż sieć 1-wire jest podciągnięta przez rezystor do 5V. Po prostu, jeśli ani urządzenie master, ani żaden czujnik nie zewrze linii DQ do masy połączenie rezystorem „pull-up” wymusi na tej magistrali stan logicznej 1-ki (+5V). Wartość tego rezystora ma istotne znaczenie, gdyż od niej zależy wartość prądu płynącego od + do linii danych DQ, a tym samym stromość zbocza sygnału narastającego. Dobór rezystora powinien być dobrany na podstawie ilości podłączonych czujników, jednak praktyka pokazuje, że większość sieci wire działa poprawnie z rezystorem o wartości ok 1kΩ

Reystor "Pull-Up" w siecie 1-wire


Na magistrali OneWire musi panować pewien porządek. Urządzenia Slave nie mogą same z siebie zajmować magistrali, to Master musi wydawać polecenia i dać możliwość odpowiedzieć Slaveom. Ważne jest też moment rozpoczęcia komunikacji, który jest zupełnie inny niż wysyłanie normalnie bajtów. Z tej przyczyny istnieją następujące rodzaje sygnałów:

  • reset pulse,
  • presence pulse
  • zapis 0,
  • zapis 1,
  • odczyt 0,
  • odczyt 1.

Co najważniejsze wszystkie te sygnały są wysyłane/inicjowane przez urządzenie master z wyjątkiem Presence Pulse, który jest rodzajem odpowiedzi układu DS18B20.

RESET PULSE, PRESENCE PULSE czyli rozpoczęcie transmisji

Każda wymiana danych między Masterem a czujnikami DS18B20 rozpoczyna się sekwencją inicjalizacyjną zawierającą impuls resetu RESET PULSE wysyłany z Mastera. Następnie, jeśli czujnik temperatury DS18B20 jest gotowy, wysyła impuls „przedstawienia się” PRESENCE PULSE . Wysłanie impulsu PRESENCE PULSE w odpowiedzi na reset, oznacza dla Mastera, że czujnik temperatury DS18B20 jest gotowy do obsługi.

Sekwencja inicjalizacji przebiega następująco, Master wysyła reset przez ustawienie linii danych w stan niski przez minimum 480 μs. Następnie Master zwalnia magistralę i przechodzi w tryb odbiornika. Kiedy magistrala jest zwolniona, rezystor „Pull-Up” podciąga linie 1-Wire do stanu
wysokiego. Kiedy DS18B20 wykryje narastające zbocze, odczeka 15 – 60 μs i wyśle impuls PRESENCE PULSE, poprzez ustawienie magistrali w stan niski na 60 – 240 μs.

Po procedurze inicjalizacji, gdy master wie, że podpięte czujniki temperatury DS18B20 są gotowe, zaczyna komunikować się z nimi. Zapis danych do układu DS18B20 podczas trwania tzw. WRITE TIME SLOTS, odczyt z kolei następuje w czasie trwania READ TIME SLOTS. Podczas każdego takiego przedziału czasowego jeden bit danych jest wysyłany lub odbierany przez magistralę.

Warto zwrócić uwagę iż zapis i odczyt danych charakteryzują inne parametry czasowe niż procedura inicjalizacji.

WRITE TIME SLOTS czyli zapis 0 i 1

  • Zapis jedynki, czyli wysłanie przez Mastera do czujnika temperatury DS18B20 logicznej jedynki przebiega następująco: Master wymusza stan niski i w przeciągu 15 us zwalnia ją. Rezystor „Pull-Up” podciąga linie danych do stanu wysokiego. DS po wykryciu zbocza wymuszonego przez rezystor i odmierzeniu czasu 15 μs – 60 μs sprawdza stan magistrali. Jeśli po tym czasie jest ona w stanie wysokim, przyjmuje, że master chciał zapisać jedynkę logiczną.
  • Zapis 0 logicznego przez Mastera wygląda tak, że wymusza on stan niski na magistrali i trzyma go przez minimum 60 μs. DS po wykryciu zbocza opadającego i następnie odczekaniu 15 – 60 μs sprawdza stan magistrali. Jeśli ma ona stan niski, następuje przyjęcie, że Master inicjował wysyłkę 0 logicznego.

READ TIME SLOTS czyli odczyt 0 i 1

Czujnik temperatury DS18B20 może wysyłać dane do Mastera tylko w momencie, kiedy ten wygeneruje na magistrali tzw read time slot.

Generacja read time slot musi nastąpić natychmiast po wydaniu przez master instrukcji:
– Read Scratchpad 0xBE,
– Read Power Supply 0xB4,
– ConverT 0x44,
– Recall E2 0xB8.

Komendy te są omówione w dalszej części.

Read time slot jest to okno trwające co najmniej 60 μs. Jest ono inicjowane przez Mastera i polega na ściągnięciu przez niego magistrali do stanu niskiego na minimum 1 μs i jej zwolnieniu. Następnie układ DS18B20 zaczyna sterować magistralą ściągając ją do 0 logicznego chcąc nadać 0 logiczne, lub zwalniając ją, jeśli chcemy nadać jedynkę logiczną.

Dane wyjściowe z czujnika temperatury DS18B20 są dostępne przez 15 μs po zboczu opadającym, które inicjowało read time slot. Tak więc master musi zwolnić magistralę i próbkować jej stan na przestrzeni tych 15 μs od czasu wygenerowania read time slot. Po zakończeniu read time slot, czujnik temperatury DS18B20 zwalnia magistralę i jest ona podciągana w stan wysoki przez rezystor podciągający. Zalecanym miejscem odczytu danych przez Mastera jest bliżej końca części wymuszanej przez czujnik DS18B20.

Transmisja danych w czujniku temperatury DS18B20

Wymiana danych między urządzeniem czytającym dane (Master), a czujnikami DS18B20 odbywa się w kolejności:

  1. Inicjalizacja,
  2. Komenda pamięci,
  3. Numer seryjny czujnika*
  4. Komenda funkcyjna.
  5. Odpowiedź DS18B20
MASTER TXDS18B20 TXMASTER TXMASTER TXMASTER TXDS18B20 TX
RESET PULSEPresence PulseKomenda pamięci *Numer Seryjny czujnikaFunkcjaOdpowiedź DS18B20
F0h, 33h, 55h, CCh, ECh28h XXh XXh XXh XXh XXh XXh CRC44h, BEh, 4Eh, 48h, B8h, B4h

Nieprzestrzeganie tej kolejności może skutkować brakiem odpowiedzi czujnika.

Wyjątkami są komendy Search ROM oraz Alarm SEARCH. Po użyciu tych komend, master musi wrócić do kroku pierwszego podanej sekwencji.

Inicjalizacja

Jest to element rozpoczynający komunikacje z czujnikami DS18B20. Sekwencja ta polega na wysłaniu impulsu RESET PULSE przez układ Master-a. Następnie na sygnał ten czujnik DS18B20, jeśli jest gotowy, odpowiada sygnałem PRESENCE PULSE.

Jeśli żaden z czujników nie zareaguje komendą PRESENCE PULSE układ master powinien uznać, że do wejścia nie jest podłączony żaden czujnik.

Po wykryciu przez układ nadrzędny PRESENCE PULSE możliwa jest obsługa komend ROM. Są to instrukcje wydawane czujnikowi DS18B20. Na ich podstawie czujnik wie, czy jego dotyczy komunikacja i czy ma reagować na dalszą komunikację.

Komendy pamięci czujnika temperatury DS18B20

Komendy pamięci operują na numerach seryjnych czujników. Za ich pomocą układ master może wydawać czujnikom polecenia związane z jego adresowaniem.

hexKomendaNazwaReakcja czujnika DS18B20
F0hSzukaj czujnikówSEARCH ROMOpowiada swoim numerem seryjnym do momentu wykluczenia go przez mastera
33hOdczytaj numer seryjnyREAD ROMWysyła numer seryjny
55hAdresuj czujnikMATCH ROMTylko czujnik o pasującym numerze wykona polecenie
CChPomiń numer seryjnySKIP ROMKażdy czujnik na magistrali wykona kolejne polecenie
EChSzukaj alarmuALARM SEARCHOpowiada swoim numerem seryjnym, tylko jeśli ma ustawiona flagę alarmu

Czujnik temperatury DS18B20 – kod F0h – Wyszukiwanie czujników

Aby indywidualny odczyt z wielu czujników DS18B20 był możliwy, układ master musi znać ich numery seryjne (ROM kody). Algorytmowi wyszukiwania umożliwia układowi Master odczyt numerów seryjnych wszystkich podłączonych czujników. Jeśli na magistrali znajduje się tylko jeden układ podrzędny, możliwe jest pominięcie komendy Search ROM, można wtedy od razu skorzystać z komendy 33h – Read ROM.

W programie NtroConfig obsługującym przetwornik TD2, funkcja wyszukaj, wykonuje się po naciśnięciu przycisku Wyszukaj, po czym możemy zobaczyć numery seryjne czujników DS18B20 w oknie powyżej.

Czujnik temperatury DS18B20 – kod 33h – Czytaj pamięć

Komenda ta może być użyta tylko w wypadku istnienia jednego układu Slave na magistrali 1-Wire. Wywołanie jej powoduje odczyt kodu ROM z układu DS18B20.

Czujnik temperatury DS18B20 – kod 55h – Adresuj czujnik

Komenda ta wywoływana w celu zaadresowania układu podrzędnego, gdy chcemy, aby naszą komendę wykonał tylko jeden czujnik. Po jej wysłaniu układ master powinien wysłać numer seryjny czujnika. Tylko układ DS18B20, którego numer seryjny pokrywa się z adresem wysłanym, może zareagować na tę komendę. Pozostałe układy podrzędne powinny czekać na RESET PULSE. Przetwornik TD2, zanim umieści pomiary temperatury w rejestrach Modbus, wysyła do każdego komendę MATCH ROM i konkretny numer czujnika zapisany w pamięci.

Czujnik temperatury DS18B20 – kod CCh — Pomiń numer seryjny

Układ nadrzędny może używać tej komendy po to, aby zaadresować wszystkie urządzenia na magistrali równocześnie, z pominięciem wysłania jakiegokolwiek kodu ROM. Może mieć to miejsce w sytuacji, w której Master chce, aby we wszystkich układach DS18B20 znajdujących się na magistrali włączona została konwersja temperatura – zatem należy użyć
komendy Skip ROM, po którym następuje komenda Convert T (0x44).

Konfigurator obsługi czujników  temperatury DS18B20

Jeśli w NtroConfig w ustawieniach ustawiono Konwersja Pojedyncza. Uruchomienie przetworników ADC w czujniku temperatury DS18B20, odbywa się w tym samym momencie we wszystkich czujnikach podłączonych do TD2. Wiąże się to ze zwiększonym przepływem prądu w magistrali. Może to mieć znaczenie w niektórych przypadkach. Np. strefa Ex, albo gdy mamy bardzo długą magistralę, gdzie większy przepływ prądu powoduje znaczący spadek napięcia.

Czujnik temperatury DS18B20 – kod ECh — Wyszukaj alarm

Działanie tej komendy jest identyczne z komendą SEARCH ROM, tyle że na komendę odpowiadają tylko układy DS18B20 z ustawioną flagą alarmu. Układ Master może ustalić, który z układów DS18B20 na magistrali w czasie konwersji temperatury napotkał na stan alarmu. Po każdym cyklu ALARM SEARCH układ Master musi rozpocząć sekwencje obsługi od nowa.

Czujnik temperatury DS18B20 – pole adresu

Po komendzie pamięci następuje wysłanie numeru seryjnego. To pole występuje tylko jeśli komendą pamięci była:

  • 33h – READ ROM
  • 55h – MATCH ROM

W pozostałych przypadkach to pole jest puste i zostaje od razu nadana komenda funkcyjna.

Czujnik temperatury DS18B20 -komendy funkcyjne

Po zaadresowaniu układu DS18B20, układ Ds18B20 wie czy następne komendy będą dotyczyć jego oraz czy ma reagować na nie. Urządzenie master teraz wydaje jedną z komend funkcji. Komedy te pozwalają układowi nadrzędnemu zapisywać i odczytywać pamięć scratchpada, inicjować konwersje temperatury oraz ustawiać odpowiedni tryb zasilania układu. Poniższa tabela ilustruje wszystkie te kody funkcyjne.

hexKomendaNazwaczujnik temperatury DS18B20 reakcja
44hWymuszenie konwersji temperatury.CONVERT TUruchamia przetwornik ADC i jeśli wysyła status konwersji na linie danych DQ.
BEhOdczytaj ScratchpadREAD SCRATCHPADWysyła zawartość pamięci Scratchpad
4EhZapisz ScratchpadWRITE SCRATCHPADBajty odebrane od Mastera Zapisuje do pamięci Scratchpad
48hKopiuj ScratchpadCOPY SCRATCHPADKopiuje zawartość bajtów 2,3 i 4 ze Scratchpadu do Pamięci EEPROM
B8hWczytaj EPROMRECALL E2Kopiuje zawartość Pamięci EEPROM do bajtów 2,3 i 4 w Scratchpadzie
B4hCzytaj tryb zasilaniaREAD POWER SUPPLYZwraca 1 jeśli zasiany pasożytniczo, bądź 0 w przeciwnym wypadku

Czujnik temperatury DS18B20 – kod 44h – Włączenie konwersji temperatury

Komenda ta inicjalizuje pojedynczą konwersję temperatury. Po zakończeniu konwersji, jej rezultat jest przenoszony do rejestrów nr: 0 i 1 w pamięci scratchpad. Czujnik przechodzi w stan bezczynności.

Jeśli urządzenie jest obsługiwane w trybie zasilania pasożytniczego, pomiędzy przedziałem czasu 10µs, po wydaniu tej komendy, Master musi
aktywować podciągnięcie magistrali.

Jeśli z kolei DS18B20 zasilany jest z zewnętrznego źródła, Master może wysłać read time slots. Odczyt zera oznacza to, że układ jest w trakcie konwersji, zaś jeśli odbierze jeden, to konwersja jest zakończona.

Czas konwersji zależy bezpośrednio od ustawionej rozdzielczości pomiarów.

Czujnik temperatury DS18B20 – kod BEh — Odczyt pamięci Scratchpad

Komenda ta pozwala układowi Master odczytać dane umieszczone w pamięci scratchpada. Transmisja danych rozpoczyna się od najmłodszego bitu (nr 0) i kontynuowana jest aż do dziewiątego bajtu. Układ Master może, w dowolnym momencie możne wysłać żądanie reset, aby zakończyć transmisje.

Czujnik temperatury DS18B20 – kod 4Eh – Zapis do pamięci Scratchpad

Komenda ta pozwala zapisać 3 bajty danych do układu DS18B20. Pierwszy bajt zapisywany jest do rejestru TH (bajt nr 2 w scratchpadzie), drugi do rejestry TL (bajt nr 3 w scratchpadzie), zaś trzeci do rejestru konfiguracyjnego. Dane muszą być przesłane od najmłodszego do najstarszego bitu. Wszystkie 3 bajty muszą być zapisane przed wydaniem
przez układ master polecenia reset. W innym wypadku dane mogą zostać uszkodzone.

Czujnik temperatury DS18B20 – kod 48h – kopiuj scratchpad

Kopiowanie danych z rejestrów TH, TL oraz konfiguracyjnego (bajty
2, 3 i 4) do pamięci EEPROM. Jeśli czujnik działa w trybie zasilania pasożytniczego układ odczytujący powinien w przeciągu 10μs, podciągnąć magistralę.

Czujnik temperatury DS18B20 - rejestry urządzenia

Żeby zapis do pamięci EEPROM wykonał się poprawnie, wszystkie trzy bajty muszą zostać przesłane przed wyzwoleniem komendy Reset.

Dane przepisane do pamięci EEPROM nie są kasowane po resecie zasilania. Podczas każdego uruchomienia czujnika DS18B20, dane z EEPROM są przepisywane do odpowiednich bajtów pamięci Scratchpad. Moduł odczytujący może również wymusić wpisanie zawartości pamięci EEPROM do Scratchpadu wysyłając komendę B8h – RECALL E2.

Czujnik temperatury DS18B20 – kod B8h – wczytaj scratchpad

Wpisanie do rejestrów TH, TL oraz konfiguracyjnego Scratchpada wartości z pamięci EEPROM. Operacja ta wykonuje się automatycznie po podłączeniu zasilania do układu.

Master może wysłać polecenie read time slots, celem sprawdzenia postępu komendy RECALL. Jeśli zostanie zwrócona
wartość zero, oznacza to, że wykonywanie funkcji trwa, zaś jeden, że funkcja została wykonana.

Czujnik temperatury DS18B20 – kod B4h – Czytaj tryb zasilania

Układ Master może zażądać odpowiedzi, który układ temperatury DS18B20 umieszczony na magistrali korzysta z zasilania pasożytniczego. Po komendzie B4h wysyła read time slot. Układy zasilane pasożytniczo powinny ustawić magistralę w poziom niski, zaś zasilane zewnętrznie powinny podciągnąć ją do stanu wysokiego.

Czujnik temperatury DS18B20 zasilanie pasożytnicze

Jedną z cech układu DS18B20 jest możliwość obsługi bez zewnętrznego źródła zasilania!

Czujnik temperatury DS18B20

Mówi się tutaj o tzw. zasilaniu pasożytniczym. Jest to możliwe, gdyż układ podczas pracy pobiera energię do działania pobiera z linii danych DQ, przy okazji komunikacji z urządzeniem odpytującym. W trybie tym linia zasilania +5 V nie jest wymagana i należy ją podpiąć do masy, a do czujnika doprowadzamy tylko dwa sygnały. Podczas występowania na magistrali 1-wire wysokiego stanu logicznego (+5 V) następuje automatyczne doładowanie pojemności wewnętrznej czujnika. Energia zgromadzona w kondensatorze wystarcza na podtrzymanie działania czujnika w czasie transferu 0 logicznego.

Należy jednak pamiętać, że działanie konwersji ADC czujnika wiąże się z większym poborem prądu oraz czasem tej czynności. W czasie działania przetwornika ADC, jeśli obsługujemy DS18B20 w trybie zasilania pasożytniczego, należy na linii danych DQ wymusić jedynkę logiczną, do czasu zakończenia działania przetwornika. Wiąże się to z niemożliwością kontroli czy przetwornik zakończył pracę. Należy wówczas, po prostu odczekać odpowiedni czas wynikający z ustawienia rozdzielczości pomiarowej czujnika.

W przypadku większej ilości czujników temperatury DS18B20 podłączonych równolegle pracujących w trybie zasilania pasożytniczego prąd płynący przez rezystor podciągający może nie być wystarczający. Wówczas można zastosować, w czasie pracy przetwornika ADC, zwarcie linii danych DQ do linii zasilania przez tranzystor.

Czujnik temperatury DS18B20 pasilany przez linie danych

Innym sposobem zapewnienia zasilania czujników DS18B20 w czasie działania konwersji ADC jest zasilenie linii samego czujnika z innego źródła zasilania.

Czujnik temperatury DS18B20 zasilany z zewnętrznego źródła zasilania

O wymuszeniu stanu wysokiego na lini danych DQ w trybie zasilania pasożytniczego, należy pamiętać także podczas wysyłania komendy COPY SCRATCHPAD – 48h. Należy to zrobić, w przeciągu 10µs, by nie doszło do wyłączenia czujnika. Do sprawdzenia trybu zasilania służy wypomniana wcześniej komenda B4h

Przykład komunikacji z czujnikiem temperatury DS18B20

Do czujnika temperatury DS18B20 możemy wysyłać wiele różnych komend. Ważne jest aby przestrzegać kolejności rodzaju komend nadawanych po sobie:

  1. Inicjalizacja,
  2. Komenda pamięci,
  3. Numer seryjny czujnika – nie zawsze obecne,
  4. Komenda funkcyjna.
  5. Wymiana danych

W każdym momencie możemy przerwać komunikację i wrócić do początku za pomocą komendy RESET PULSE.

Poniżej pokaże przykład kilkugotowych ramek komunikacji z czujnikiem temperatury DS18B20:

Odczyt numeru seryjnego (tylko w przypadku jednego czujnika na magistrali):

InitKomeda pamięciNumer seryjny czujnika
MasterRESET PULSE33h
DS18B20PRESENT PULSE28-XX-XX-XX-XX-XX-XX-XX

Zapis pamięci Scratchpad:

InitKomenda pamięciNumer seryjny czujnikaKomenda funkcyjnaDane do DS18B20
MasterRESET PULSE55h28-XX-XX-XX-XX-XX-XX-XX4Eh4Bh 46h 3fh
DS18B20PRESENT PULSE

Odczyt pamięci scratchpada:

InitKomenda pamięciNumer seryjny czujnikaKomenda funkcyjnaDane z DS18B20
MasterRESET PULSE55h28-XX-XX-XX-XX-XX-XX-XX4Eh
DS18B20PRESENT PULSE4Bh 46h 3fh XXh XXh XXhXXh XXh XXh

Włączenie przetwornika ADC:

InitKomenda pamięciNumer seryjny czujnikaKomenda funkcyjna
MasterRESET PULSE55h28-XX-XX-XX-XX-XX-XX-XX44h
DS18B20PRESENT PULSE

Włączenie przetwornika ADC (tylko z jednym czujnikiem):

InitKomenda pamięciKomenda funkcyjna
MasterRESET PULSECCh44h
DS18B20PRESENT PULSE

Odczyt pamięci scratchpada (tylko z jednym czujnikiem):

InitKomenda pamięciKomenda funkcyjnaDane z DS18B20
MasterRESET PULSECChBEh
DS18B20PRESENT PULSE4Bh 46h 3fh XXh XXh XXhXXh XXh XXh

Czym czytać czujniki DS18B20

Cyfrowy czujnik temperatury DS18B20 ma bardzo szerokie zastosowanie w aplikacjach wymagających pomiaru czy też monitoringu temperatury. Świetnie sprawdzi się w wielu projektach elektronicznych, wymagających użycia sensora mierzącego wartość temperatury.

Ekspander portów GPIO do Raspberry Pi

Można z powodzeniem zastosować go na przykład do skonstruowania takich urządzeń jak termometr czy stacja pogodowa, które z kolei znakomicie nadają się jako uzupełnienie domowego systemu automatyki. Ten model sensora sprawdzi się również w wielu innych projektach, takich jak systemy chłodzące do elektroniki czy kontrolery instalacji grzewczej. Czujniki temperatury DS18B20 oraz DS18S20 są często wykorzystywane do pomiaru i monitoringu temperatury zboża.

Interfejs 1-wire wykorzystywany przez DS18B20 może być obsługiwany zarówno przez pojedynczy mikrokontroler, jak i takie systemy jak Arduino czy Raspberry PI. Czyni go to idealną propozycją dla elektroników tworzących własne projekty wymagające wykorzystania sensora temperatury — urządzenia chłodzące i grzewcze, termometry, stacje pogodowe, systemy klimatyzacji w budynkach czy sprzęt AGD. Chcąc przyłączyć czujniki DS18B20 do Raspberry PI dużym ułatwieniem może być Expander portów GPIO.

DS18B20 może być nawet obsługiwany nawet przez sterowniki przemysłowe. Jest to możliwe przez odpowiednie sterownie portem RS232. To rozwiązanie jest średnio wygodne i niezbyt niezawodne. Dużo wygodniej jest zastosować przetworniki magistrali z czynnika temperatury DS18B20 na protokół obsługiwany przez sterowniki przemysłowe. Przykładami modułów obsługujących czujniki temperatury DS18B20 są moduły TD2 oraz TD1.01

Przetwornik TD2 ↗

Umożliwia odczyt z czujników temperatury i wilgotności w sieci OneWire o długości nawet 400 m. Dane można odczytywać portami RS485 i USB. Istotne jest, że te porty są separowane galwanicznie.

Moduł TD1.01 ↗

TD1.01 to konwerter temperatury z wyświetlaczem LED. Odczytuje temperaturę z 64 czujników temperatury DS18B20 w sieci o długości 100 m. Dane odczytujemy portem RS485 przez Modbus RTU

Przetwornik temperatury na szynę DIN z wyświetlaczem

W ofercie Ntronic również mamy czujnik temperatury DS18B20 zamknięty w szczelnej obudowie z dołączonym przewodem o długości 1 m. Czujnik taki możemy zastosować w miejscach narażonych na zewnętrzne warunki środowiskowe.

Czujnik temperatury TEMPi1N ↗

Wodoodporny czujnik temperatury DS18B20 w metalowej rurce z kablem o długości 1 m. Mierzy temperatury w zakresie od -55 °C do 125 °C.

Dzięki szczelnej obudowie można go stosować w warunkach narażonych na działanie atmosferyczne

Czujnik temperatury DS18B20 w stalowej tulei

Rozdzielacz magistrali OneWire PAS-W ↗

Czujnik temperatury DS18B20 w systemie pomiaru temperatury możemy łączyć równolegle za pomocą specjalnych rozdzielaczy magistrali OneWire o nazwie PAS-W

Rozdzielacz OneWire do Czujników temperatury DS18B20

Co więcej, w Ntronic mamy nawet w ofercie specjalnie przygotowane sondy pomiarowe do pomiaru temperatury ziarna w silosie zbożowym. Które wraz z przetwornikiem TD2 mogą tworzyć gotowy system monitoringu temperatury zboża.

Sonda temperaturowa ↗ temperaturowa do silosów zbożowych

Monitoring temperatury ziarna
Sonda do pomiaru temperatury zboża

Czujnik temperatury DS18B20 kontra DS18S20

Czujnik DS18S20 jest bardzo zbliżony do popularnego DS18B20. Jest to wprawdzie starszy produkt i rzadziej stosowany. Można go mimo wszystko spotkać w różnych aktualnych rozwiązaniach, dlatego warto wiedzieć o jego istnieniu.

Czujnik temperatury DS18S20 jest w pełni zgodny z protokołem OneWire. Pamięć Scratchpad czujnika temperatury DS18S20 względem DS18B20 różnią tylko dwa bajty:

  • 6-COUNT REAMIN
  • 7-COUNT PER °C.

Główna różnica względem DS18B20 to stały 9-bitowy wynik pomiaru temperatury. Czyli czujnik podaje wynik temperatury z rozdzielczością 0,5 °C. Ponieważ jest to bezpośredni następca czujnika DS1820, samo przetwarzanie temperatury odbywa się z 12-bitową rozdzielczością, a wynik jest zaokrąglany z dokładnością 9 bitów.

Wyliczenie pomiaru o rozdzielczości większej niż 9 czujnika temperatury DS18B20

Użytkownik, nie może w żaden sposób przyśpieszyć działania przetwornika ADC w czujniku DS18S20. Konwersja temperatury na wartość cyfrową zawsze odbywa się z rozdzielczością 12-bitów. Wynik prezentowany jest w rozdzielaczości 9-bitów.

Wyliczenie pomiaru o rozdzielczości większej niż 9 bitów mimo wszystko jest możliwe. Należy do tego wykorzystać rejestry COUNT REMAIN i COUNT PER °C z pamięci scratchpad wg równania:

Temperatura 12-bit = temperatura z czujnika – 0,25 + ((COUNT PER °CCOUNT REMAIN)/COUNT PER °C)

Rejestry zawierające temperaturę również należy interpretować inaczej. W czujniku DS18B20 są one przygotowane do odczytu z 12 bitową rozdzielczością. DS18S20 ma być kompatybilny z DS1820 i większa rozdzielczość musi być dodatkowo wyliczana – jak wspomniałem wyżej.

bit 7bit 6bit 5 bit 4 bit 3bit 2bit 1 bit 0
LSB262524232221202-1
MSBznakznakznakznakznakznakznakznak
Układ rejestrów temperatury w DS18S20
bit 7bit 6bit 5 bit 4 bit 3bit 2bit 1 bit 0
LSB232221202-12-22-32-4
MSBznakznakznakznakznak262524
Układ rejestrów temperatury w DS18B20

Żeby odczytać poprawnie temperaturę kożystając z funkcji stosowanych do DS18B20 przed wyliczeniem bity w rejestrach wystarczy przesunąć o 3 bity:

temperature = temperature << 3;

Podróbki czujnika temperatury DS18B20

Authentic Maxim DS18B20 with topmark DALLAS DS18B20 1932C4 +786AB and indent marked "P"

Nie jest łatwo rozpoznać podróbki układów DS18B20. Jeśli czujnik kupujemy na Aliexpress albo na Alibabie to możemy być niemal pewni, że oryginalnego czujnika DS18B20 nie otrzymamy. Ich odróżnienie od oryginału jest bardzo trudne. Najprostszym sposobem odróżnia czy mamy oryginał jest odczytanie numeru seryjnego który powinien wyglądać wg wzoru:

28-xx-xx-xx-xx-00-00-xx

Problemy jaki możemy mieć stosując zamienniki:

  • niepoprawna praca w trybie zasilania pasożytniczego.
  • nie trzymanie dokładności pomiaru
  • dryft pomiaru temperatury poza zakres 0.5°C
  • brak pamięci EEPROM
  • losowe błędy działania.

Chcąc mieć pewność, że korzystamy z oryginalnego czujnika DS18B20 powinniśmy zakupować te czujniki tylko u autoryzowanych dystrybutorów np: DigiKey, RS, Farnell, Mouser, TME.

W Ntronic do budowy urządzeń wykorzystywane są tylko czujniki temperatury DS18B20 pochodzące od autoryzowanych dystrybutorów.

Więcej na temat istniejącym zamienników możemy przeczytać w artykule.

Czujnik temperatury DS18B20 podsumowanie

Czujnik temperatury DS18B20 cechuje się też atrakcyjną ceną połączoną z wysoką jakością wykonania i dużą trwałością, dlatego stanowi dobrą propozycję dla wszystkich poszukujących niedrogiego i niezawodnego, cyfrowego czujnika temperatury.

Dodaj komentarz