Na rynku dostępnych jest kilka rodzajów termometrów z różnymi sposobami komunikacji m.in. 1-wire, analogowe czy i2c. Przy wykorzystaniu Raspberry Pi najbardziej wygodnym i najprostszym rozwiązaniem jest wykorzystanie termometrów komunikujących się poprzez protokół 1-wire, który Raspberry Pi obsługuje na pinie 4 GPIO. Raspberry Pi jest w stanie obsłużyć do ośmiu urządzeń za pomocą protokołu 1-wire. W artykule tym pokażę jak łatwo można podłączyć i odczytać temperatury z termometrów DS18B20+.

Praktycznie wszystkie systemy maja już zainstalowane moduły dla protokołu 1-wire i obsługi termometrów po tym protokole. Aby sprawdzić czy moduły są zainstalowane możemy je ręcznie załadować

[bash]
sudo modprobe w1-gpio
sudo modprobe w1-therm
[/bash]

Jeśli nie otrzymaliśmy żadnych błędów to warto aby powyższe moduły ładowały się wraz ze startem systemu dodając do pliku /etc/modules poniższe linijki.

[bash]
w1-gpio
w1-therm
[/bash]

UWAGA:

W nowszych wersjach systemu należy jeszcze dodać poniższy wpis do pliku /boot/config.txt i zrestartować malinę.

[bash]dtoverlay=w1-gpio,gpiopin=4[/bash]

Wybór czujników

Do naszych testów użyjemy cyfrowe termometry DS18B20+, które do komunikacji wykorzystują protokół 1-wire. Czujniki DS18B20+ można także kupić jako moduły oraz wodoodporne sondy.

Schemat podłączenia

Na poniższym obrazku pokazany jest schemat podłączenia termometrów do Raspberry Pi. Rezystor musi mieć wartość 4,7KΩ i być podłączony pomiędzy zasilaniem 3.3v (pin 1<>prawa nóżka) a kablem komunikacji (pin 7(GPIO4)<>środkowa nóżka). Trzecia lewa nóżka powinna być podłączona do GDN (pin 6)

ds1820 Raspberry pi

Odczytywanie informacji z czujników

Odczyt stanów i wartości z magistrali 1-wire odbywa się za pomocą odczytów z plików. Listę podpietych urządzeń można odczytać np. za pomocą poleceń

[bash]
cd /sys/bus/w1/devices
ls
[/bash]

Po przejściu do katalogu sys/bus/w1/devices i wyświetleniu jego zawartości zobaczymy wszystkie podłączone urządzenia

[bash]
28-0000045478fb 28-000004f3843c 28-0000054d14bc 28-0000054d6df0
28-000004f354e6 28-0000054cfeb2 28-0000054d52b8 w1_bus_master1
[/bash]

gdzie 28-00000xxxxxx to ID urządzeń a w1_bus_master1 określa pierwszy i jedyny główny kontroler w naszej malinie.

Możemy wyświetlić w łatwy sposób liczbę podłączonych czujników

[bash]
cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count
7
[/bash]

Możemy również wyświetlić listę ID podłączonych czujników

[bash]
cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves
28-0000054d6df0
28-0000054d52b8
28-000004f3843c
28-0000054d14bc
28-0000054cfeb2
28-000004f354e6
28-0000045478fb
[/bash]

Aby odczytać wartości temperatur oraz inne dane przykładowo z pierwszego czujnika z naszej listy wydajemy polecenie

[bash]
cat /sys/bus/w1/devices/28-0000054d52b8/w1_slave

78 01 4b 46 7f ff 08 10 51 : crc=51 YES
78 01 4b 46 7f ff 08 10 51 t=23500
[/bash]

Temperatura podana jest w wartości t=23500, którą musimy podzielić przez 1000, dzięki czemu otrzymujemy ją w bardziej przyjaznym formacie – 23,5 (°C). Wartość crc=51 YES określa czy transmisja była wykonana bez błędów – w naszym przypadku się to udało.

Dzięki możliwości odczytu informacji o czujnikach z plików możemy praktycznie w każdym języku programowania odczytywać dane jak ze zwykłych plików tekstowych za pomoca wbudowanych funkcji i klas danego języka.

32 Komentarze

    • Niestety Bartosz na malinie ten myk nie działa.

      @Cyryl fajny opis, to może teraz napiszesz jak zrobić wykresy w Highcharts do tych odczytów :)

  1. Czy długość przewodu może mieć znaczenie na jakość dokonywanych pomiarów?
    Czy jest możliwość podpięcia czujnika do maliny z zainstalowanym raspbmc lub openelc, tak aby temperatura się wyświetlała zamiast tej pobranej dla lokalizacji z netu?

  2. Ja mam pytanie odnośnie czujników. Jeszcze nie mam swojego zestawu, ale na wiosnę kupię i chciałbym za wczasu się trochę dowiedzieć. Czy te identyfikatory zawsze są takie same po starcie systemu? Chodzi o to, że umieszczę sobie kilka czujników temperatury w różnych miejscach i chciałbym wiedzieć który czujnik jest który. Nie żebym potem odczytywał temperaturę (skryptem co jakiś czas) i się okazało, że ten czujnik ma teraz inne id i nie mogę się do niego dostać. Ewentualnie czy można im nadać swoje identyfikatory.

    • Tak każdy czujnik ma unikalny id. Możesz nadać własną nazwę w programie(który musisz sam napisać albo znaleźć ) do odczytu dodając nazwę wg ID.

  3. Przy ujemnej temperaturze za oknem (-4 )wyszło mi coś takiego :
    f3 ff 4b 46 7f ff 0d 10 e8 : crc=e8 YES
    f3 ff 4b 46 7f ff 0d 10 e8 t=-812
    Gdy podzielimy to przez 1000 nie daje to oczekiwanego wyniku. Co jest nie tak?

    • W tym przykładzie służy do podciągania, a więc wystarczy 0,25W. Oczywiście 1W też może być, ale 0,25 wystarczy ;)

  4. A ja miałem zainstalowane WebIOPi na raspberry i zainstalowałem sobie ten termometr i działa.
    Mam tylko pytanie, jak na stronie (np. takiej z WebIOPi) wyświetlić odczyt?

  5. Witam,
    Niestety nie widzę w Devices: w1_bus_master1. Sondy jeszcze nie podpiąłem ale zastanawiam się czy nie mam uszkodzonego kontrolera w tym przypadku…

    Macie jakieś pomysły?

  6. […] Pojawił się ElektroPrzewodnik numer 55: [Arduino] Termometr DS18B20. W serii filmów autor w ciekawy sposób wprowadza początkujących użytkowników w świat elektroniki i elektryczności, opisując działania urządzeń oraz budując przykładowe układy. Tym razem został przedstawiony cyfrowy termometr Dallas od firmy Maxim – DS18B20. Mieliśmy okazję opisać dokładnie obsługę termometrów DS18B20+ dla Raspberry Pi. […]

  7. cześć, czy ktoś może napisać jak podpiąć tak skonfigurowany czujnik do owfs i do openhaba. Wszyscy używają jakiś adapterów, przejściówek, a nikt nie pisze o bezpośrednim podłączeniu do gpio

  8. czy wiadomo coś na temat dokładności wskazań temperatury przez te czujniki? Są różne rodzaje, analogowe cyfrowe…który lepszy?

Pozostaw odpowiedź Kamera na Raspberry Pi z wydrukowana obudową | Aleksander Data Anuluj