KursyPoradnikiInspirujące DIYForum

Kurs Raspberry Pi – #15 – czujnik temperatury DS18B20

Kurs Raspberry Pi – #15 – czujnik temperatury DS18B20

W tym odcinku kursu do malinki podłączymy termometr cyfrowy. Czujnik DS18B20 pozwala na precyzyjny pomiar temperatury, więc często używany jest np. w automatyce domowej.

Do obsługi tego sensora potrzebna będzie nam umiejętność komunikacji przez interfejs 1-wire.

Niezbędne informacje o DS18B20

Czujnik DS18B20 to cyfrowy termometr o rozdzielczości od 9 do 12 bitów, w praktyce oznacza to dokładność od 0,5°C do 0,0625°C. Pozwala on na pomiar temperatury w zakresie od -10°C do +85°C stopni z dokładnością ±0,5°C.

Czujnik podłączymy do Raspberry Pi za pomocą interfejsu 1-wire, który do poprawnego działania oprócz masy wymaga tylko jednego przewodu. Zasilanie może być dostarczane przez linię używaną do komunikacji lub dodatkowym wyprowadzeniem. Tym razem skorzystamy z tej drugiej metody.

Każdy czujnik ma swój niepowtarzalny numer, dzięki czemu informacje z wielu termometrów mogą być przesyłane jednym przewodem. Szczegółowe informacje na temat działania czujnika znaleźć można w jego dokumentacji. Układ ten był też używany w naszym kursie Arduino:

Kurs Arduino II – #7 –  termometry analogowe i cyfrowe
Kurs Arduino II – #7 – termometry analogowe i cyfrowe

Podczas tej części kursu Arduino porównamy dwa podejścia do czujników. Sprawdzimy w praktyce termometry w wersji analogowej i cyfrowej! W... Czytaj dalej »

"Wadą" czujnika DS18B20 jest dość skomplikowany protokół komunikacyjny. Na szczęście odpowiednie biblioteki sprawią, że nie będziemy się musieli tym przejmować.

Gotowe zestawy do kursów Forbota

 Komplet elementów  Gwarancja pomocy  Wysyłka w 24h

Elementy niezbędne do wykonania wszystkich ćwiczeń z kursu podstaw Rasberry Pi dostępne są w formie gotowych zestawów!

Zamów w Botland.com.pl »

Podłączenie DS18B20 do Raspberry Pi

Czujnik możemy podłączyć właściwie do dowolnego wyprowadzenia GPIO. W naszym przykładzie wykorzystamy pin GPIO4, który jest używany jako domyślna linia do komunikacji 1-wire.

Schemat podłączenia DS18B20 do Raspberry Pi.

Schemat podłączenia DS18B20 do Raspberry Pi.

Musimy wykonać cztery połączenia. Patrząc od przodu (od płaskie strony czujnika):

  • skrajne lewe wyprowadzenie podłączamy do masy,
  • środkową nóżkę podłączamy do GPIO4,
  • skrajne prawe wyprowadzenie podłączamy do zasilania (3,3V),
  • linię danych należy koniecznie połączyć przez rezystor 4,7kΩ z zasilaniem (3,3V).

W praktyce podłączenie czujnika może wyglądać więc następująco:

Gdy wszystko będzie poprawnie podłączone możemy przejść dalej, czyli do uruchomienia RPi.

Konfiguracja 1-wire na Raspberry Pi

Czujnik DS18B20 wymaga sterownika w jądrze systemu. Domyślnie jest on wyłączony, musimy więc go uruchomić. Jak zwykle ten sam efekt można uzyskać na wiele sposobów, najłatwiej skorzystać ze znanego już nam programu raspi-config.

Wymaga on praw administratora (roota), więc uruchamiamy go poleceniem:

Wybieramy opcję "5. Interfacing Options":

Wybór odpowiedniej opcji w raspi-config.

Wybór odpowiedniej opcji w raspi-config.

Następnie wybieramy "P7 1-Wire" i uruchamiamy obsługę interfejsu:

W celu faktycznego uruchomienia interfejsu 1-wire, przy wychodzeniu z ustawień, musimy zgodzić się na restart Raspberry Pi:

Kończymy zmianę ustawień restartując RPi.

Kończymy zmianę ustawień restartując RPi.

Po restarcie będziemy mogli sprawdzić, czy moduł został poprawnie uruchomiony. W tym celu przyda nam się polecenie lsmod, które wyświetli listę zainstalowanych modułów jądra:

Po wywołaniu powyższego polecenie wyświetli się lista, na której odszukujemy moduły sterownika o nazwach w1_gpio oraz w1_therm. Jeśli zobaczymy tylko w1_gpio (bez w1_therm) będzie to oznaczać, że system nie wykrył czujnika. Czyli w praktyce: interfejs 1-wire działa, ale źle podłączyliśmy nasz termometr. W takim przypadku najlepiej wyłączyć Raspberry Pi i podłączyć wszystko raz jeszcze.

Efekt poprawnego podłączenia czujnika - moduły w1_gpio oraz w1_therm.

Efekt poprawnego podłączenia czujnika - moduły w1_gpio oraz w1_therm.

Odczytywanie temperatury - linia poleceń

Wiemy już, że odpowiednie sterowniki są zainstalowane. Teraz możemy odczytać dane z czujnika. Zanim przejdziemy do Pythona spróbujemy dokonać tego z poziomu linii poleceń.

Dostęp ten jest podobny do dostępu do linii GPIO, również odbywa się przez katalog /sys. Najpierw musimy sprawdzić jakie urządzenia są podłączone do magistrali 1-wire. W tym celu wyświetlamy zawartość katalogu /sys/bus/w1/devices/, czyli wydajemy polecenie:

Mając podłączony jeden czujnik powinniśmy zobaczyć dwa urządzenia - nasz termometr oraz sam sterownik 1-wire (master). Jak już wspominaliśmy, każdy czujnik ma inny numer, więc wyniki tego polecenia u każdego będą wyglądały odrobinę inaczej:

Lista urządzeń podłączonych do interfejsu 1-wire.

Lista urządzeń podłączonych do interfejsu 1-wire.

W naszym przypadku adres termometru to 28-000008d6bac6. Następny krok to sprawdzenie zawartości katalogu odpowiadającemu temu czujnikowi. W tym celu wydajemy poniższą komendę:

U nas było to więc:

Efekt działania powyższego polecenia:

Zawartość katalogu odpowiadającego naszemu czujnikowi.

Zawartość katalogu odpowiadającego naszemu czujnikowi.

Wśród widocznych plików znajdziemy plik w1_slave. W kolejnym kroku warto zobaczyć jaka jest jego zawartość. Tutaj pomocne będzie znane nam już polecenie cat:

Po jego wywołaniu otrzymamy m.in. temperaturę odczytaną z czujnika:

Wartość temperatury odczytana z DS18B20.

Wartość temperatury odczytana z DS18B20.

Odczyt temperatury w Pythonie

Jak udowodnił nam powyższy przykład w pliku w1_slave znajdziemy aktualną temperaturę odczytaną przez nasz czujnik. Niestety znajduje się tam trochę więcej informacji. Wykorzystanie samej temperatury w jakimś programie wymagałoby odpowiedniego przefiltrowania zawartości tego pliku.

Można to oczywiście uzyskać z poziomu linii poleceń, ale jest to nieco skomplikowane. W poprzednim artykule poznaliśmy podstawy Pythona, możemy więc z niego teraz skorzystać. Taka forma dostępu do informacji z czujnika będzie znacznie wygodniejsza.

W tym celu skorzystamy z gotowej biblioteki, którą musimy najpierw zainstalować:

Po jej zainstalowaniu możemy uruchomić poniższy program:

Po uruchomieniu powyższego kodu zobaczymy informacje na temat aktualnej temperatury:

Aktualna temperatura odczytana w Pythonie.

Aktualna temperatura odczytana w Pythonie.

Użycie Pythona oraz odpowiedniej biblioteki znacznie uprościło dostęp do odczytów czujnika. Pora wykorzystać tę informację w ciekawszy sposób.

Alarm o zbyt wysokiej temperaturze

W ramach przykładu możemy teraz stworzyć układ, który po przekroczeniu zadanej temperatury będzie uruchamiał alarm. W roli alarmu można wykorzystać diodę świecącą lub buzzer. My skorzystamy z tego drugiego rozwiązania. Schemat podłączenia elementów:

Schemat podłączenia buzzera i czujnika temperatury DS18B20.

Schemat podłączenia buzzera i czujnika temperatury DS18B20.

W praktyce może to wyglądać następująco:

Program będzie dość prosty. Na początku importujemy niezbędne biblioteki i ustawiamy działanie GPIO. Później deklarujemy zmienną, do której przypisujemy temperaturę maksymalną - po jej przekroczeniu uruchomi się alarm. Następnie w nieskończonej pętli while wyświetlamy temperaturę i sprawdzamy czy jest wyższa od tej, która ma uruchamiać alarm. W zależności od tego włączamy lub wyłączamy buzzer i wypisujemy na ekranie stosowny komunikat. Na końcu pętli dodane jest opóźnienie, które sprawia, że temperatura sprawdzana jest co sekundę.

Cały kod w najprostszej postaci wygląda następująco:

W efekcie działania programu, po podgrzaniu termometru (np. palcem) powinien włączyć się buzzer:

Efekt działania programu w praktyce.

Efekt działania programu w praktyce.

W konsoli będzie to widoczne w następujący sposób:

Informacja o aktualnej temperaturze i alarmie widoczna w konsoli.

Informacja o aktualnej temperaturze i alarmie widoczna w konsoli.

Kod nie jest jednak zbyt elegancki i będzie generował małe problemy, gdy będziemy chcieli go wyłączyć za pomocą kombinacji klawiszy CTRL+C.

Zdecydowanie lepiej będzie jeśli skorzystamy z konstrukcji try-except, która potrafi ładnie zareagować na przerwanie działania programu. Za jej pomocą po wciśnięciu wyżej wspomnianej kombinacji klawiszy wyłączymy buzzer, wyświetlimy w konsoli stosowny napis i "posprzątamy" po sobie konfigurację GPIO:

Zakończenie działania programu z użyciem nowej konstrukcji w praktyce:

Informacja o aktualnej temperaturze, alarmie i zakończeniu pracy programu widoczna w konsoli.

Informacja o aktualnej temperaturze, alarmie i zakończeniu pracy programu widoczna w konsoli.

Podsumowanie

W tej części kursu nauczyliśmy się uruchamiać nowe moduły systemu Linux oraz przetestowaliśmy działanie czujnika temperatury DS18B20. Zobaczyliśmy też jak instalować biblioteki Pythona oraz pisać proste programy z ich użyciem. W kolejnej części kursu będziemy kontynuować poznawanie podstaw Pythona - zajmiemy się wejściami oraz generowaniem sygnału PWM.

Czy wpis był pomocny? Oceń go:

Średnia ocena 4.9 / 5. Głosów łącznie: 142

Nikt jeszcze nie głosował, bądź pierwszy!

Artykuł nie był pomocny? Jak możemy go poprawić? Wpisz swoje sugestie poniżej. Jeśli masz pytanie to zadaj je w komentarzu - ten formularz jest anonimowy, nie będziemy mogli Ci odpowiedzieć!

Nawigacja kursu

Autor: Piotr Bugalski
Testy, ilustracje: Piotr Adamczyk
Redakcja: Damian Szymański

czujnik, DS18B20, kurs, kursRaspberryPi, Python, raspberrypi, termometr

Trwa ładowanie komentarzy...