Zapytaj gdziekolwiek jakiego czujnika temperatury użyć a najczęściej otrzymasz odpowiedź DS18B20. Układ Dallas’a jest strasznie popularny. W sklepach można również nabyć wersję wodoodporną co jeszcze wzmacnia jego popularność. Oczywiste jest to, że nie mogło zabraknąć u mnie tego czujnika.
Komunikacja z DS18B20
Z układem DS18B20 porozmawiać można jedynie poprzez interfejs 1-Wire. Cóż to jest?! Jest to wymysł firmy Dallas Semiconductors która to w późniejszym czasie połączyła się z Maxim’em. Interfejs ten który jednocześnie jest też protokołem wykorzystuje jedynie jedną linię do komunikacji dwukierunkowej, stąd też jego nazwa.
Nie chciałbym się wdawać w szczegóły tego interfejsu oraz zasadę działania. W skrócie najważniejsze informacje to:
-
- Wszystkie urządzenia podłącza się do jednej magistrali.
- Jedynki i zera zdefiniowane są jako impulsy o zdefiniowanych przez interfejs stałych czasowych. Z tego względu też prędkość komunikacji niejako jest niezmienna.
- Transmisja jest szeregowa i odbywa się na zasadach master-slave .
- Protokół zawiera adresowanie dzięki któremu aktywujemy wybrany czujnik podobnie jak ma to miejsce przy I²C.
Polecam oficjalne dokumentacje Maxima, które tłumaczą szczegóły o wiele lepiej niżeli ja bym to zrobił. Na stronie firmowej jest np. kilka pomocnych artykułów: Link1 Link2
Połączenie
Jak już wcześniej wspomniałem urządzenia do magistrali 1-Wire podłącza się tylko jednym przewodem. Dodając do tego zasilanie, standardowo mamy 3 przewody. Linię danych obowiązkowo należy podciągnąć do linni zasilania przez rezystor. Na ogół jest on o wartości 4k7 ohm.
Hmm powiedziałem 3 przewody standardowo. A nie standardowo? A dwa! Mianowicie interfejs 1-Wire umożliwia komunikacje w tzw. trybie pasożytniczym, gdzie dodatnia linia zasilająca nie jest dostarczana do czujnika. Pin VDD przy układzie Slave zwierany jest wówczas do masy. Skąd w takim razie zasilanie w czujniku? Jak sama nazwa trybu mówi – pasożytuje on na linii danych. W układach slave 1-Wire znajduje się kondensator, który w momencie wystąpienia stanu wysokiego na linni danych, ładuje się i podtrzymuje zasilanie na czas trwania stanu niskiego.
W celach tego wpisu użyłem trybu zwykłego. Do Nucleo F401RE podłączyłem 4 czujniki DS18B20 na pinie PA1.
Programowanie
W internecie można znaleźć mnóstwo przykładów komunikacji 1-Wire dla chyba wszystkich mikrokontrolerów świata. Nie będę czarował, że moja biblioteka jest unikatowa oraz pisana od podstaw. Pisząc ją kiedyś odpierałem się różnymi otwartymi przykładami które są ogólnodostępne. Zrobiłem bibliotekę, która mi pasuje w użytkowaniu. Nie twierdzę, że jest ona najlepsza – jest dobra 🙂
Do działania biblioteki potrzebny jest timer z tickiem 1 µs. Łatwo jest go uzyskać stosując pełne megaherce do taktowania MCU. Wystarczy prescaler ustawić na (taktowanie MCU)-1. Pamiętaj, aby wpisać w CubeMX dużą wartość – np. 65000 – w Counter Period konfiguracji timer’a.
Biblioteka składa się z dwóch członów. Pierwszym jest obsługa interfejsu 1-Wire. Jest ona bezobsługowa i nie wymaga żadnej konfiguracji w nagłówkach. Drugi człon to oczywiście obsługa DS18B20. Konfiguracja w pliku nagłówkowym obejmuje:
- Maksymalną liczbę układów DS18B20 któą można podłączyć do magistrali.
- Pin oraz port GPIO wykorzystany do celów 1-Wire.
- Nazwę handlera do timera z tickiem 1 µs.
- Flagę define, która decydyje o tym, czy korzystać z CRC. Można oszczędzić kilka bajtów czasu przy czytaniu możliwym kosztem poprawności odebranych danych.
Konfiguracja w CubeMX jest banalnie prosta. Wystarczy zdefiniować pin wyjściowy GPIO dla magistrali jako zwykły GPIO Output i skonfigurować wspomniany wcześniej timer. Dodatkowo wrzuciłem sobie znajdującą się na Nucleo LEDkę do migania, UART do printowania temperatur na PC oraz wyjście testowe do podglądania na analizatorze logicznym.
Jak działa mój kod? Informacje o każdym z podłączonych czujników zawiera tablica struktur Ds18b20Sensor_t o ilości elementów podanych w nagłówku jako maksymalna ilość czujników. Znajdują się tam informacje o pełnym adresie, ostatnio poprawnie odczytanej temperaturze oraz powodzeniu ostatniego odczytu. Dodatkowo powołałem zmienną mówiącą o tym ile zostało wykrytych czujników DS18B20. Może ich być mniej niż definiowany w nagłówku MAX. Zastanawiałem się nad dynamicznym alokowaniem pamięci dla ilości podłączonych czujników, ale czy to miałoby sens? Na ogół ich ilość nie zmienia się w trakcie życia całego urządzenia, więc można ilość elementów w tablicy ustawić na sztywno.
Dostęp do danych takich jak adres czy tempeartura jest możliwy jedynie poprzez dedykowane funkcje. Nie ma ręcznego grzebania w strukturze. Najważniejsze funkcje:
void DS18B20_Init(DS18B20_Resolution_t resolution);
Jest to oczywiście inizjalizacja. Wewnątrz inicjalizacji startowana jest magistrala 1-Wire oraz są wyszukiwane i liczone podłączone czujniki DS18B20. W argumencie podać należy wymaganą rozdzielczość dla układów. Pamiętaj, że rozdzielczość ma ogromny wpływ na czas konwersji temperatury na postać cyfrową. Dostępne są opcje:
DS18B20_Resolution_9bits DS18B20_Resolution_10bits DS18B20_Resolution_11bits DS18B20_Resolution_12bits
void DS18B20_StartAll(void);
Jest to rozesłanie do wszystkich podłączonych czujników komendy startu konwersji temperatury. Proste.
void DS18B20_ReadAll(void);
Funkcja odczytania skonwertowanej temperatury do odpowiednich elementów w tablicy czujników. Każdy czujnik wykryty w funkcji inicjującej jest odczytywany.
uint8_t DS18B20_Quantity(void);
Zwraca liczbę czujników wykrytych podczas inicjalizacji.
uint8_t DS18B20_GetTemperature(uint8_t number, float* destination);
Wpisuje wartość temperatury z i-tego czujnika do miejscu w pamięci pod wskaźnikiem destination.
void DS18B20_GetROM(uint8_t number, uint8_t* ROM); void DS18B20_WriteROM(uint8_t number, uint8_t* ROM);
Operacje na adresach czujników. Można dzięki nim np. zmieniać kolejność czujników w tablicy.
Biorąc to wszystko i wrzucając do jednego garnka otrzymałem przykładowy kod printowania wszystkich czujników na terminal.
/* USER CODE BEGIN 2 */ DS18B20_Init(DS18B20_Resolution_12bits); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ DS18B20_ReadAll(); DS18B20_StartAll(); uint8_t ROM_tmp[8]; uint8_t i; for(i = 0; i < DS18B20_Quantity(); i++) { if(DS18B20_GetTemperature(i, &temperature)) { DS18B20_GetROM(i, ROM_tmp); memset(message, 0, sizeof(message)); sprintf(message, "%d. ROM: %X%X%X%X%X%X%X%X Temp: %f\n\r",i, ROM_tmp[0], ROM_tmp[1], ROM_tmp[2], ROM_tmp[3], ROM_tmp[4], ROM_tmp[5], ROM_tmp[6], ROM_tmp[7], temperature); HAL_UART_Transmit(&huart2, (uint8_t*)message, sizeof(message), 100); } } HAL_UART_Transmit(&huart2, (uint8_t*)"\n\r", sizeof("\n\r"), 100); HAL_Delay(1000); HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } /* USER CODE END 3 */
Uwaga niebezpieczeństwo!!! Kompilator STM32 ma taką cechę, że po wygenerowaniu kodu w CubeMX nie masz od razu możliwości printowania zmiennych typu float! Będą same zera lub w ogóle nic 🙁 Aby było to możliwe trzeba dodać flagę -u _printf_float do linkera.
Teraz, gdy już wszystko jest jasne, zobacz wynik działania tego małego skrawka programu:
Ciepło mam przy biurku, co nie? 🙂
Paaanie a ile to czasu zajmie?
Oczywiście musiałem sprawdzić ile czasu zajmuje transferowanie potrzebnych danych przez 1-Wire!
Sama komunikacja do odczytu temperatury trwa około 14 ms.
Komenda startu konwersji dla wszystkich czujników to ok 2,3 ms.
Więc całość dla jednego czujnika to ok 16,4 ms. Wiedząc, że komenda startu jest wysyłana jedynie raz dla wszystkich czujników, wzór na czas odczytu i startu konwersji dla n czujników to 14 * n + 2,3 [ms]. Sprawdzam.
Dwa czujniki. 14 * 2 + 2,3 = 30,3. Pomiar to 30,43.
Cztery czujniki. 14 * 4 + 2,3 = 58,3. Pomiar 58,45.
Czyli wszystko się zgadza. Czy można na czymś urwać kilka milisekund? Na braku CRC.
11,75 ms dla oczytu pojedynczego czujnika.
Komenda startu konwersji oczywiście bez zmian. Nie ma tu nic związanego z CRC. W przypadku nieużywania CRC wzór na czas obsługi n czujników wynosi 11,75 * n + 2,3 [ms].
Potwierdzenie na czterech czujnikach.
11,75 * 4 + 2,3 = 49,3. Z pomiaru wychodzi 49,05. Zgadza się 🙂
Jednak bądź ostrożny rezygnując z CRC! Może zdażyć się, że odczytasz pierdoły, a teraz nie masz jak te skontrolować.
Czy można więcej urwać? Można, ale nie w DS18B20 🙁 1-Wire bowiem oferuje coś takiego jak tryb Override, który umożliwia przyśpieszenie transmisji około 10-krotnie. Nasz czujnik temperatury nie obsługuje tego trybu więc niestety nie mam co sprawdzać. Generalnie mało jest urządzeń 1-Wire obsługujących przyśpieszoną komunikację.
Podsumowanie
Czujniki temperatury DS18B20 są bardzo przyjemne. Obsługa nie jest nadmiernie skomplikowana, a w internecie istenieją tysiące przykładów jak sobie z nimi poradzić. Dorzucam jeden od siebie mając nadzieję, że jest napisany sensownie. Niewątpliwą zaletą jest możliwość obsługi wielu urządzeń za pośrednictwem tylko jednej linii danych. Świetnie sprawdzi się to przy wielopunktowym pomiarze. Dodatkowo wersje wodoodporne idealnie nadają się do pomiaru temperatury wody np. w akwarium 🙂
Dziękuję Ci za przeczytanie tego wpisu. Jeśli taka tematyka Ci odpowiada, daj mi znać w komentarzu. Będę też wdzięczny za propozycję tematów które chciałbyś abym poruszył.
Kod standardowo dostępny jest na moim GitHubie: link
Jeśli zauważyłeś jakiś błąd, nie zgadzasz się z czymś, chciałbyś coś dodać istotnego lub po prostu uważasz, że chciałbyś podystkutować w tym temacie, napisz komentarz. Pamiętaj, że dyskusja ma być kulturalna i zgodna z zasadami języka polskiego.
Rozstrzygnięcie konkursu
W poprzednim wpisie ogłosiłem mini konkurs. Czas wyłonić zwycięzców. Spośród wszystkich niepowtarzających się po imieniu, IP i mailu oraz spełniających wszystkie wymagania komentarzy wybrałem 10 moim zdaniem najciekawszych zastosowań wyświetlacza.
Wśród nich wylosowałem dwóch zwycięzców według zasad podanych w konkursie. Są to komenmtarze numer 4 i 10 z powyższego screenshot’a. Film z przeprowadzonego losowania dostępny jest pod adresem https://youtu.be/vqYASbZ2Xr0
Gratulacje dla zwycięzców! Napisałem już do Was maila w celu finalizacji konkursu. Pewnie jeszcze nie jeden konkurs pojawi się na blogu. Trochę za dużo szpargałów mam w swojej szafie 😉
37 komentarzy
Karoga · 05/05/2021 o 15:57
Cześć, w jaki sposób odczytywać ujemne temperatury?
Mateusz Salamon · 17/05/2021 o 13:16
Trzeba by zamienić w oliczeniach uinta na inta 🙂 Taki błąd mi się chyba wkradł…
MM · 14/04/2021 o 21:38
Hej dlaczego OneWire_BusInputDirection(onewire); uzywasz tej funkcji? Togglowanie zmianą portu na output/input zajmuje dużo czasu, a stm w trybie output wspiera czytanie pinu, bez zmiany na input?
Mateusz Salamon · 15/04/2021 o 09:02
Wytłumacz mi to proszę, bo nie spotkałem się z tym, aby GPIO było jednocześnie wyjściem push-pull, oraz wejściem.
Adam · 14/04/2021 o 10:11
A dlaczego musimy robic w oneWire togglowanie kierunkiem gpio? W trybie push-pull w STM32 mamy opcje czytania pinu mimo output direction?
Mateusz Salamon · 14/04/2021 o 10:39
Czytając output push-pull odczytasz to, co sam wystawiłeś 🙂
MM · 13/04/2021 o 21:54
Hej uzylem Twojej biblioteki na stm32F103 i spotkalem sie z problemem timingow w protokole.Po analize ramek w analizatorze logicznym plus roznych testach, dochodze do wniosku, ze to nie wina timera, ktory jest ustawiony ok, a wina ze funkcja OneWire_WriteBit trwa zbyt dlugo, spotkal sie ktos z takim problemem? Plus Mateusz dlaczego w tej funkcji dla 1 i 0 powojnie wylasz OneWire_BusInputDirection? Ogolnie wewnatrz dzieje sie duzo, wiec dla protkolu, ktory jest oparty na us, to moze byc zbyt duzo?
Dzieki pozdrawiam, przepraszam za brak polskich znakow.
Mateusz Salamon · 14/04/2021 o 09:11
Z jaką częstotliwością pracuje Twój MCU? Jak ATmegi sobie radzą, to czemu STM32 sobie nie poradzi? 🙂 Z drugiej strony z kolei nie mówię, że ta moja biblioteka jest idealna. Tworzyłem ją dawno temu.
michanio · 05/03/2021 o 14:33
Możesz wypisać rzeczy które trzeba ręcznie ustawić by program ruszył ? Męczę się z tym od dłuższego czasu.
Mateusz Salamon · 14/03/2021 o 19:50
Wydaje mi się, że jest wszystko w artykule 🙂 Musisz mieć GPIO i Timer na 1us i to tyle. Dopinasz biblioteki, wskazujesz pin i funcję delay i działa 😉
Malin · 21/09/2020 o 14:41
Witam.
Jak zwykle dobre i przydatne opracowanie .
Pozwoliłem sobie skorzystać z twojej biblioteki i stąd obawiam się, że się w nią wkradł błąd.
Związany jest on z dokładnością pomiaru temperatury (9, 10, 11, 12 bitów).
Zdefiniowana jest ona w ds18b20.h w liniach od 48 – 51 (np. #define DS18B20_STEP_…BIT 0.0625 lub 0.125 lub 0.250 lub 0.5).
Pobrana z termometru temperatura jest w funkcji ds20b20_Read() w linii 100 przez nią przemnażana (można powiedzieć, że temperatura jest dzielona przez 16, 8, 4 , 2) w zależności od wybranej rozdzielczości.
Ale obawiam się, że wszystkie temperatury bez względu na rozdzielczość powinny być przemnażane przez 0.0625 czyli dzielone przez 16.
Z poważaniem Malin
Mateusz Salamon · 23/10/2020 o 09:26
Faktycznie może tak być 😀 Możesz wystawić review na Githubie 🙂
Daniel · 11/08/2020 o 17:30
Cześć!
Chciałem zastosować Twoje rozwiązanie na STM32L432 dla siedmiu czujników. Mam jednak problem z komunikacją z monitorem portu szeregowego – wyświetlają się same krzaki. Co mogło pójść nie tak ? 🙂
Pozdrawiam
Daniel
Mateusz Salamon · 11/08/2020 o 19:34
Kod od DSów nie powinien miec nic wspólnego z UARTem 😀 Sam UART chodzi? Pewnie masz jakąś rozbieżność na baudrate.
Daniel · 12/08/2020 o 09:41
USART 🙂 Zdaje się, że komunikacja jest – co sekundę przychodzą nowe dane na monitor. Zadeklarowałem baudrate 9600 i taki też ustawiłem w monitorze.
Mateusz Salamon · 12/08/2020 o 10:21
UART czy USART? 😉 Spróbuj najpierw goły UART uruchomić 🙂 Wtedy masz pewność, że działa.
Ka24 · 22/10/2020 o 14:00
Cześć, musze połączyć ds18b20 uartem z nucleo f4, od tygodnia szukam jak to zrobic ale wszedzie sa informacje tylko o one-wire bez uarta, mialbys 5 minut napisać co dalej po wybraniu Mode – single wire?
Rafal · 21/03/2020 o 12:15
Na wstępie – dziękuję za zamieszczone tu artykuły. Zaczynam cokolwiek dłubać w STM32, oraz cubemx IDE no i mam pierwszy problem. Otóż próbuję użyć Twojej biblioteki do obsługi onewire/ ds18b20 i w moim kodzie nie chce ona w ogóle wykryć żadnych urządzeń onewire. Natomiast po jakichś większych lub mniejszych perypetiach uruchomiłem Twój przykład (na tej samej płytce, te same połączenia) i on – no cóż – wykrywa dwa podłączone czujniki. I nijak nie mogę dojść gdzie jest problem, tzn co takiego źle robię że biblioteka onewire nie chce działać w moim kodzie. Poderzewam inicjalizację timerów, albo jakieś opcje GPIO, ale to takie zgadywanie na oślep. Nie ma żadnego błędu, po prostu nic nie wykrywa więc podejrzewam nieprawidłowe ustawienia timera ale póki co konfiguracja timerów to dla mnie czarna magia, tym bardziej że nie wiem jak to wpływa na zachowanie onewire.
Czy ktoś mógłby mnie naprowadzić na jakieś materiały do poczytania czy inną pomoc w konkretnie tym temacie? Dzięki.
Mateusz Salamon · 21/03/2020 o 17:52
Próbujesz moją libkę wykorzystać w innym projekcie, czy piszesz “od nowa” obsługę 1-wire? W moim przykładzie jest kilka rzeczy o które trzeba zadbać. Jedną z nich jest timer dla chamskiego blokującego delaya mikrosekundowego. W HALu musisz pamiętać, aby ten timer wystartować 🙂 Generalnie ciężko mi coś doradzić nie widząc kodu. Wrzuć na jakiegoś githuba i najlepiej napisz wątek na grupie STM32 Polska na Facebooku. Więcej mądrych ludzi na to zerknie i na pewno pomożemy 🙂
SaS · 03/12/2019 o 14:12
1-Wire wygodnie jest obsługiwać przez USART. Dallas-Maxim wydał AN z opisem jak to zrobić. Dzięki temu, obsługa 1-Wire może odbywać się na przerwaniach bez blokowania programu głównego. Bez problemu działa to nawet na AVR (trzeba dodać bufor OC). STM32 jest o tyle lepszy, że mozna ustawić UART w trybie 2-kierunkowym co ma dwie zalety:
– Zajmuje 1 pin uC.
– Nie potrzebna jest zewnętrzna bramka OC 9OD).\
Mateusz Salamon · 08/12/2019 o 15:08
Aaa nawet rozpocząłem pisanie takiej obsługi na UART bo faktycznie nieźle się to zapowiada. Gdzieś chwilowo zarzuciłem ten projekt niestety, ale na pewno do niego wrócę! Tylko nie jestem pewien, czy na HALu jest to wykonywalne i opłacalne czasowo.
ka24 · 22/10/2020 o 14:03
Można gdzieś znależć jakis poradnik jak to zrobic?
Mateusz Salamon · 23/10/2020 o 09:14
Nie mam jescze nic pod UARTa 🙁 Nie miałem czasu się tym zająć, ale moje próby na Single Wire, póki co się nie powiodły. Nie wiem jeszcze, czy da się zrobić na jednym drucie.
Wiaderko · 26/08/2019 o 09:53
Taka mała uwaga, dlaczego to w trybie blokującym jest 1wire jest bardzo wolnym protokołem i robienie jego obsługi w sposób blokujący to trochę porażka.
Mateusz Salamon · 26/08/2019 o 17:49
Nie do końca zrozumiałem czy to uwaga czy pytanie 🙁 Ale jeśli chodzi o obsługę 1W blokująco to fakt, może to cenną chwilę trwać. O wiele lepiej będzie zrealizować to sprzętowo np. na Timerze 🙂 Myślę, że pojawi się kiedyś taki wpis 😉
Wiaderko · 28/08/2019 o 11:19
Poprostu uważam że używanie i promowanie obsługi 1wire w trybie blokujący (czekanie na delayach) powinno być tak samo gnębione jak używanie float bez FPU 🙂
Angażowanie jeszcze timera sprzętowego żeby zliczać (blokując) to już lekka przesada 🙂
Jak już to powinno się dobre nawyki propagować bo taki sposób programowania nie różni się za bardzo od podejścia “arduino”
Mateusz Salamon · 28/08/2019 o 11:35
Rozumiem ból i przyznaję rację o Arduinowym podejściu 😀 sprzętowy DS18B20 czeka na mojej długiej liście TODO. Mam wrażenie, że coraz mniej czasu ostatnio mam 🙁
SaS · 03/12/2019 o 22:52
Timerem można, nawet na AVR ale o ile jest to prędkość standardowa. Dla overdrive STM da radę o ile nie jest taktowany np 1MHz, bo trzeba wygenerować impuls 1us dla jedynki (7 us dla zera). Przy odczycie 1us po czy po 3 albo 4 us (nie pamiętam dokładnie) odczytać wartość bitu. Z UART jest prościej bo on to robi sprzętowo także dla overdrive.
Ciekawe są mastery DS2482/4 (I2C) i DS2480 (UART). Ten drugi dobry gdy potrzeba zapisywać EPROM albo przerwania od slave choć nie spotkałem układu, który by takowe generował 🙂
Sebastian · 27/06/2019 o 20:29
Hejka, Uruchomiłem bibliotekę! 🙂
Problem pojawia się gdy chce obsłużyć czujnik w trybie pasożytniczym… Ktoś wie co trzeba zmodyfikować?
Pozdrawiam
Mateusz Salamon · 27/06/2019 o 21:44
A jaki problem Ci się pojawia? Chcesz uruchomić tylko jednego DSa na krótkich przewodach? W sumie nie próbowałem trybu pasożytniczego na tej bibliotece jeszcze, ale na pierwszy rzut oka powinen działać bez modyfikacji. Może jedynie rezystor wypadałoby zmniejszyć 🙂
Sebastian · 28/06/2019 o 09:36
No niestety, podłączam jednego DS’a w trybie pasożytniczym i procek nie znajduje żadnego czujnika. Rezystor mam zmniejszony do 2k. Docelowo chcę mieć na szynie 2 termometry. Taki system udało mi się uruchomić na atmega. Hmmm może przy napięciu 3V3 tryb pasożytniczy nie działa..
Mateusz Salamon · 28/06/2019 o 09:37
Powinien działać według noty. No chyba, że to DSy z Chin to różnie to bywa ? Sprawdzę to na swoich czujnikach i dam znać. Tylko nie wiem czy uda mi się w tym tygodniu bo wyjeżdżam.
Sebastian · 28/06/2019 o 10:08
Wiem że jak podłączyłem DS do atmegi to w bibliotece musiałem wybierać czy zasilanie jest DIRECT czy PARASITE. Nie analizowałem jeszcze jak to działa w tamtych bibliotekach..
Maciej · 22/05/2019 o 17:08
Nie wiem czy to błąd, ale w tekście jest napisane by ustawić timer na tick 1us, chyba miałeś na myśli przepełnienie na 1us. Tick to nie jest przepełnienie, prawda? ?
Mateusz Salamon · 22/05/2019 o 18:21
Jest dobrze. Chodzi o tick. Chodzi o to, że tyle wpiszesz do licznika, tyle us odliczy. Nie potrzebujemy stu przepełnień dla 100 us 🙂
Maciej · 01/04/2019 o 11:50
Warto zwrócić uwagę na zakres temperaturowy DS18B20. Planowałem użyć go do pomiaru temperatury w skomputeryzowanym ekspresie do kawy, ale po pierwsze dokładność tergo czujnika w okolicach 140C jest już słaba, a po drugie jest to czujnik półprzewodnikowy i długość jego żywota mocno zależy od temperatury w jakiej czujnik przebywa i czasu w niej przebywania 😉 Dla tempertur powyżej 125C warto rozważyć inne typy czujników (ja uzyłem PT100, ale to tylko jedna z alternatyw).
Mateusz · 01/04/2019 o 11:55
Oczywiście warto czytać dokumentacje, aby nie próbować go używać w 140°C 😀 Błąd jest tym większy im bliżej jesteśmy granicy używalności. PT100 czy PT1000 to prawie, że mus dla wysokich temperatur.