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.… Czytaj dalej »

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

Zestaw elementów do kursu

Gwarancja pomocy na forum Błyskawiczna wysyłka

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

Kup 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.

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 zasilanie (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.

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.

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.

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.

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.

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.

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.

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.

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.

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

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.

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.

Nawigacja kursu

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

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