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.

Podobne artykuły

33 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?

  9. witam, mój problem polega na tym, że po podłączeniu więcej niż jednego czujnika, po od kilkudziesięciu minut do kilku godzin malina przestaje gadać z czujnikami (urządzenia znikają – jak by zostały odłączone …), po restarcie maliny wszystko wraca do normy i znowu po kolejnych minutach / godzinach to samo. Ma ktoś pomysł co może być nie tak?

    Próbowałem już:
    – innych GPIO,
    – innych przewodów (również krótszych),
    – podłączenia 1 czujnika po najdłuższym z przewodów – było OK (co wyklucza powyższe – jakość / długość przewodów),
    – różnych kombinacji podpięcia czujników (3 z 3, 2 z 3, 2 z 3 w innej konfiguracji),

    Walczę z tematem już kilka tygodni, i zastanawiam się czy nie powinienem zareklamować maliny…

Pozostaw odpowiedź ElektroPrzewodnik numer 55: [Arduino] Termometr DS18B20 - OSWorld.pl Anuluj