Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

"Mądrzejszy" dom - RPi oraz DS18B20

Mówimy o "inteligentnych domach". W połączeniu do reszty inteligentnych sprzętów domowych, jak lodówki (wysyłające spam) czy inne czujniki obecności automatycznie włączające światło mają nasze życie ułatwiać lub uprzyjemniać.

Nie mam zamiaru bawić się w aż tak rozbudowane systemy, jakie planują niektórzy. Nie potrzebuję setek rozwiązań i procesora w każdym włączniku ściennym. Ale fajnie jest czasami się nieco pobawić, prawda?

Mam termometr za oknem. Podobnie jak większość osób. Mam jednak termometr elektroniczny z wyświetlaczem ciekłokrystalicznym. Od kiedy jednak kupiłem sobie większy (szerszy) monitor to jest on nieco zasłonięty. Nie było by wygodnie, gdyby obok prognozy pogody na ekranie startowym Windows 8 pojawiała się także faktyczna temperatura w domu, oraz na zewnątrz? O ileż to wygodniejsze rozwiązanie od przesunięcia nieco termometru w lewo, aby go nie zasłaniał monitor! ;-)

A na serio - czemu się nie pobawić?

Hardware

Mam w domu Raspberry Pi, a nawet dwa. Jeden z nich służy jako serwer i (częściowo) router, ale jego piny GPIO pozostają niewykorzystane, więc można by wykorzystać go do odczytu danych z czujnika temperatury i prezentowania (skoro jest to serwer) w postaci danych do wykorzystania przez inne aplikacje - docelowo, przez aplikację dla Windows 8.

Mam też czujnik DS18B20 z interfejsem 1-wire, który dość zgrabnie współpracuje z Raspberry Pi. Podłączenie wygląda następująco:

Linia 3,3V podłączona jest do prawej nóżki czujnika. Poprzez rezystor tworzy "pull-up" z linią danych, która jest podłączona do naszego ulubionego pinu GPIO4 oraz środkowej nóżki czujnika. Lewa nóżka podłączona jest do masy. Rezystor według tutoriala na Adafruit powinien być około 4,7 kiloomów, ale równie dobrze poradzi sobie prawie każdy z zakresu od 4,7 kilooma do 10 kiloomów. Ja użyłem 10 kOhm, bo innego nie miałem pod ręką ;-)

DS18B20 opiera się na 1-wire, co oznacza, że jest możliwość łączenia wielu takich czujników w łańcuch, a będzie dostęp do wszystkich. Jest też możliwość używania tylko dwóch nóżek ("parasite power"), niestety mój bardzo intensywnie nie chciał z tym współpracować.

Software

Czas na oprogramowanie, część pierwsza. Za komunikację z interfejsem 1-wire posłużyć mogą nam moduły jądra w1-gpio oraz w1-therm, który to umie się komunikować z czujnikiem DS18B20. Ich wymogiem jest m.in. podłączenie właśnie 1-wire do pinu GPIO4.

Po ich załadowaniu możemy obejrzeć zawartość katalogu /sys/bus/w1/devices, gdzie powinny znaleźć się podkatalogi (linki symboliczne, ale to nieważne) o nazwach w postaci 28-xxx, gdzie xxx to unikatowy identyfikator czujnika.

sudo modprobe w1-gpio sudo modprobe w1-therm ls /sys/bus/w1/devices

W moim wypadku wynik będzie taki: [ktos@lily ~]$ ls /sys/bus/w1/devices 28-0000054d332a w1_bus_master1

Z podkatalogu 28-0000054d332a wypiszmy teraz zawartość pliku w1_slave:

[ktos@lily ~]$ cat /sys/bus/w1/devices/28-0000054d332a/w1_slave 6d 01 4b 46 7f ff 03 10 70 : crc=70 YES 6d 01 4b 46 7f ff 03 10 70 t=22812

Odczyt tego "pliku" trwa chwilkę, ponieważ jest to faktycznie odczyt danych z czujnika. W ostatniej linii mamy t=22812, czyli temperatura wynosi 22,812 stopnia Celsjusza. Szybki rzut oka na dwa termometry, jakie mam na półce i wskazują one 22,0 stopnia oraz 22,8 stopnia. Wychodzi zatem, że słusznie podejrzewałem, że jeden z nich nieźle zaniża.

Przydałoby się, aby moduły jądra były ładowane automatycznie. Używam dystrybucji Arch Linux, i zgodnie z opisem na ArchWiki należy stworzyć plik o rozszerzeniu .conf w katalogu /etc/modules-load.d/. Stworzyłem taki plik:

[ktos@lily ~]$ cat /etc/modules-load.d/w1.conf # ładowanie modułów jądra odpowiedzialnych za 1-wire # i DS18B20 w1-gpio w1-therm

Ok, mamy zatem odczyt temperatury. Szkoda tylko, że nie jest to w najpiękniejszej formie, to raz. Dwa, spróbujmy to "wystawić" na świat.

Stworzyłem testowo malutki skrypt, który pokazuje temperaturę w nieco bardziej "ludzkiej" formie (proszę o wyrozumiałość - nie jestem mistrzem Basha - zapewne da się zrobić lepiej):

#!/bin/sh TEMP=`cat /sys/bus/w1/devices/28-0000054d332a/w1_slave | grep t= | cut -d "=" -f 2` TEMP=`echo "scale=1; $TEMP/1000" | bc` echo "$TEMP°C"

Który po uruchomieniu w konsoli prezentuje nieco bardziej ładną formę temperatury z dokładnością do jednego miejsca po przecinku.

[ktos@lily ~]$ scripts/temperature_ds18b20 22.8°C

W sam raz aby to wykorzystać w innych skryptach, np. po zalogowaniu użytkownika pokazywać mu w terminalu temperaturę z czujnika.

Czyli mamy uruchomiony czujnik temperatury. Gdyby dodać kolejny czujnik, wystarczy połączyć linie zasilania, uziemienia i danych, bez dodatkowego rezystora, a jego identyfikator po chwili pojawi się w odpowiednim katalogu i również będzie można odczytać z niego dane.

W następnej części spróbujemy zbudować aplikację serwerową, która będzie udostępniała dane klientom, np. aplikacji dla Windows 8. 

linux sprzęt programowanie

Komentarze

0 nowych
cyryllo   17 #1 19.01.2014 18:51

Polecał bym pokazanie wyników skryptu :P

Z tego co pamiętam do maliny można podpiąć do 8 czujników po 1-wire. Ja właśnie używam 8 czujników i działa bez problemu.

Przemek1987   7 #2 19.01.2014 21:41

Ja polecam zainstalowanie Domoticz na RPi. Rysuje ładne wykresy a poza tym ma sporo innych opcji do wykorzystania.

  #3 19.01.2014 22:10

@autor
W jakim programie narysowałeś schemat?

mktos   10 #4 19.01.2014 22:57

@cyryllo:
Proszę bardzo :-)

@Przemek1987:
Fajny też wydaje się nettemp (http://techfreak.pl/nettemp/), jak i PiThermServer (jeśli mówimy tylko o temperaturze). W ogóle jest wiele fajnych projektów na Rpi związanych z nieco bardziej inteligentnymi domami :-)

ximian   1 #5 19.01.2014 23:25

W zasadzie lipa, bo o temperaturze za oknem to nawet Windows takie cuda ma wbudowane

Wykorzystaj rozpoznawanie mowy do różnych operacji

mati75   6 #6 19.01.2014 23:49

Po co się bawić w skrypt wystarczy:
awk '{print "Temperatura w pomieszczeniu: ",$1/1000,"°C"}' /sys/bus/w1/devices/28-00000463d0ed/w1_slave | grep t= | cut -f2 -d=
Działa bez zarzutu.

cyryllo   17 #7 20.01.2014 11:35

@se (niezalogowany) W programie Fritzing http://fritzing.org/download/

  #8 20.01.2014 15:23

Dziękuję za informacje.

mktos   10 #9 20.01.2014 20:50

@mati75: To też skrypt, tylko jednolinijkowy ;-) A na serio - fajne. Wiedziałem, że awk kiedyś się mi mógłby przydać.

dendrytus   5 #10 28.01.2014 18:00

"Gdyby dodać kolejny czujnik, wystarczy połączyć linie zasilania, uziemienia i danych, - a po co chcesz to uziemiać?

  #11 19.04.2015 03:14

@mati75: próbuję niejako od 0 dojść do zrobienia na RPi centrum do monitorowania temperatury + wyłącznik ethernetowy. Chcę na razie zrobić to jak najprościej. Twój wpis o AWK pomógł, zacząłem szukać. To, co napisałeś jest bardzo OK, ja zapewne przy rozkmince zrobiłem coś źle ale u mnie zadziałało:

awk -F= '/t=/ {print $2/1000"°C"}'

i w body:

°C

co w efekcie da konkretnie np.:

22.562°C

na www.

mati75   6 #12 20.04.2015 18:14

@Anonim (niezalogowany): Cały kod to awk '{print "Temperatura w pomieszczeniu: ",$1/1000,"°C"}' /sys/bus/w1/devices/28-00000463d0ed/w1_slave | grep t= | cut -f2 -d=

  #13 03.06.2015 13:59

@se (niezalogowany): Fritzing.org (znak wodny w prawym dolnym rogu schematu)

  #14 11.08.2015 23:26

Ja mam dwa czujniki ds18b20 podłączone do pi, ale wczoraj kupiłem też dwie stacje pogodowe w lidlu i nie wiem teraz jakie urządzenie źle podaje wyniki. Oba czujniki ds18b20 wskazują mi 29.4, podczas gdy dwie stacje wskazują mi 31 stopni. Stacje mają po dwa czujniki i wszystkie cztery czujniki w obu stacjach podają ten sam wynik. Pytanie, które urządzenie się myli? aby rostrzygnąć spoór wystawiłem zewnętrzne czujniki od stacji za okno obok zwykłego termometru. Oba czujniki były zgodne z termometrem alkoholowym. Pytanie więc czy to możliwe, że te czujniki ds18b20 przekłamują?

  #15 01.11.2016 10:15

ja mam RaspBerry 3 i mam termometr DS1820 to to samo co termometr DS18B20

mktos   10 #16 02.11.2016 14:26

@krzys2910 (niezalogowany): Bardzo podobne, ale nie identyczne, minimalnie się różnią w obsłudze. Nie wiem czy w1-therm obsługuje DS1820, sprawdź czy zadziała.