Kursy • Poradniki • Inspirujące DIY • Forum
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.
Maksymalny zakres pomiarowy termometru wynosi od -55°C do +125°C, jednak w tym zakresie błąd pomiaru może być większy (do ±2°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.
- Opis wyprowadzeń DS18B20.
- Czujnik temperatury DS18B20.
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
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.
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).
Brak odpowiedniego rezystora podciągającego jest jedną z najczęstszych przyczyn problemów komunikacyjnych z opisywanym czujnikiem temperatury!
W praktyce podłączenie czujnika może wyglądać więc następująco:
- Podłączenie DS18B20 do Raspberry Pi.
- Zbliżenie na czujnik DS18B20.
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:
1 |
sudo raspi-config |
Wybieramy opcję "5. Interfacing Options":
Następnie wybieramy "P7 1-Wire" i uruchamiamy obsługę interfejsu:
- Wybór odpowiedniego interfejsu.
- Włączenie 1-wire.
W celu faktycznego uruchomienia interfejsu 1-wire, przy wychodzeniu z ustawień, musimy zgodzić się na restart Raspberry Pi:
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:
1 |
lsmod |
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.
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:
1 |
ls /sys/bus/w1/devices |
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:
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ę:
1 |
ls /sys/bus/w1/devices/XXX/ |
Za XXX należy podstawić adres termometru!
U nas było to więc:
1 |
ls /sys/bus/w1/devices/28-000008d6bac6/ |
Efekt działania powyższego polecenia:
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:
1 |
cat /sys/bus/w1/devices/XXX/w1_slave |
Po jego wywołaniu otrzymamy m.in. temperaturę odczytaną z czujnika:
Wartość podawana jest w tysięcznych, więc np. 26000 oznacza 26,000°C.
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ć:
1 |
sudo pip3 install w1thermsensor |
Po jej zainstalowaniu możemy uruchomić poniższy program:
1 2 3 4 5 6 |
import w1thermsensor sensor = w1thermsensor.W1ThermSensor() temp = sensor.get_temperature() print(temp) |
Informacje na temat tworzenia i uruchamiania programów w Pythonie zostały opisane w poprzedniej części kursu podstaw Raspberry Pi.
Po uruchomieniu powyższego kodu zobaczymy informacje na temat aktualnej temperatury:
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:
W praktyce może to wyglądać następująco:
- Podłączenie buzzera i DS18B20 do Raspberry Pi.
- Zbliżenie na elektronikę.
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import time import RPi.GPIO as GPIO import w1thermsensor GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) GPIO.output(21, GPIO.HIGH) temperatura_max = 30.0 sensor = w1thermsensor.W1ThermSensor() while True: temperatura = sensor.get_temperature() print(temperatura) if temperatura > temperatura_max: GPIO.output(21, GPIO.LOW) print("Alarm!") else: GPIO.output(21, GPIO.HIGH) time.sleep(1) |
W efekcie działania programu, po podgrzaniu termometru (np. palcem) powinien włączyć się buzzer:
W konsoli będzie to widoczne w następujący sposób:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import time import RPi.GPIO as GPIO import w1thermsensor GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) GPIO.output(21, GPIO.HIGH) temperatura_max = 30.0 sensor = w1thermsensor.W1ThermSensor() try: while True: temperatura = sensor.get_temperature() print(temperatura) if temperatura > temperatura_max: GPIO.output(21, GPIO.LOW) print("Alarm!") else: GPIO.output(21, GPIO.HIGH) time.sleep(1) except KeyboardInterrupt: GPIO.output(21, GPIO.HIGH) print('Koniec') GPIO.cleanup() |
Zakończenie działania programu z użyciem nowej konstrukcji w praktyce:
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
Powiązane wpisy
czujnik, DS18B20, kurs, kursRaspberryPi, Python, raspberrypi, termometr
Trwa ładowanie komentarzy...