Kolejnym krokiem w moich testach jest czujnik temperatury. Zakupiłem bardzo typowy, łatwo dostępny w Polsce czujnik DS18B20, kosztuje niecałe 4zł.
Dane techniczne:
DS18B20 - Czujnik temperatury TO92
- Napięcie pracy: 3 - 5,5V
- Mierzona temperatura: -55°C - + 125°C
- Dokładność: 0,5°C
- Interfejs: 1-Wire
- Obudowa: TO92
Źródło: electropark.pl |
Interfejs 1-wire powinien być możliwy do uruchomienia w każdym najnowszym jądrze...
Jeśli ktoś ma z problem z 1-wire polecam zajrzeć tutaj:
albo użyć systemu Adafruit - Occidentials:
W każdym razie na najnowszym Raspbianie również działa.
OSTRZEŻENIE !
Przy
podłączaniu wszelkich kabelków należy zachować ostrożność, gdyż może
zakończyć się to uszkodzeniem sprzętu lub uszczerbkiem na zdrowiu.
Robisz to na własną odpowiedzialność.
UKŁAD
Tradycyjnie opis GPIO możemy znaleźć TUTAJ
Pierwszy pin czujnika to GND
Drugi pin do GPIO 4 (4 z lewej) oraz rezystor 4k7 do +
trzeci pin do +
Następnie ładujemy moduły (można je oczywiście dodać na stałe w /etc/modules)
sudo modprobe w1-gpio sudo modprobe w1-therm
i weryfikujemy
cd /sys/bus/w1/devices/
tu powinien być katalog zaczynający się na 28-...
# cat 28-000004458ce3/w1_slave 3e 01 4b 46 7f ff 02 10 6c : crc=6c YES 3e 01 4b 46 7f ff 02 10 6c t=19875
czyli w moim przypadku temperatura to około 19,87 °C (wartość t= podzielona przez 1000)
MRTG
Jakiś czas temu napisałem krótkiego posta jak skonfigurować mrtg. Teraz jeden praktyczny pomysł jak to wykorzystać.
Podepniemy tu wyniki z czujnika, żeby rysowało nam wykresy.
Dodatkowo (dla większego bajeru;) ) jako porównanie dodamy drugą wartość - np temperaturę ze stolicy (to już oczywiście ściągane z internetu - np z www.wunderground.com)
Od razu zaznacze, że zapewne da się to zrobić inaczej/łatwiej, ale jako, że nie mam duszy programisty zrobiłem to właśnie tak.
Najpierw upewniamy się, że mamy zainstalowany pakiet links
Szukamy na www.wunderground.com miasta np Warszawa, klikamy na nazwie stacji pogodowej... na samym dole jest link do CDF (Comma Delimited File)
w przypadku Wawy ostateczny link to:
http://www.wunderground.com/history/airport/EPWA/2012/12/25/DailyHistory.html?format=1
ostatnia linia to najbardziej aktualny odczyt
Jakiś czas temu napisałem krótkiego posta jak skonfigurować mrtg. Teraz jeden praktyczny pomysł jak to wykorzystać.
Podepniemy tu wyniki z czujnika, żeby rysowało nam wykresy.
Dodatkowo (dla większego bajeru;) ) jako porównanie dodamy drugą wartość - np temperaturę ze stolicy (to już oczywiście ściągane z internetu - np z www.wunderground.com)
Od razu zaznacze, że zapewne da się to zrobić inaczej/łatwiej, ale jako, że nie mam duszy programisty zrobiłem to właśnie tak.
Najpierw upewniamy się, że mamy zainstalowany pakiet links
Szukamy na www.wunderground.com miasta np Warszawa, klikamy na nazwie stacji pogodowej... na samym dole jest link do CDF (Comma Delimited File)
w przypadku Wawy ostateczny link to:
http://www.wunderground.com/history/airport/EPWA/2012/12/25/DailyHistory.html?format=1
ostatnia linia to najbardziej aktualny odczyt
W międzyczasie przypomniało mi się, że MRTG zaokrągla liczby (nie bierze pod uwagę wartości po przecinku, czyli 20,46°C to po prostu będzie 20). Dlatego postanowiłem zrobić małe obejście i pomnożyć każdy wynik * 10 - żeby mieć na wykresach nieco większą dokładność (czyli 20,46°C - to będzie 204 w moim przypadku). Tu tylko zaznaczę, że równie dobrze można wykorzystać czyste rrdtool, która ma dokładność do 3 miejsc po przecinku - ale szczerze mówiąc nie chciałem na to już zużywać zbyt dużo czasu.
Tak więc do /etc/mrtg.conf dodajemy
Tworzymy skrypt, który będzie weryfikował temperaturę lokalnie i z internetu.
Przy zrzucie stronki przez links - ostatnia linia (zebrana przez tail -1) pokazuje standardowo tylko godzinę... pewnie jest na to inne rozwiązanie, ale nie chciałem za bardzo wnikać i poszerzyłem po prostu zakres dla linksa (-width 150).
Odpalamy jeszcze raz indexmaker i po jakimś czasie powinniśmy mieć wykresy.
Niebieska linia to wyniki z internetu, a zielone słupki to nasz czujnik.
Tak więc do /etc/mrtg.conf dodajemy
Title[temper]: Temperatura * 10 PageTop[temper]: Temperatura * 10 Target[temper]: `/projekty/temperatura/getTemp.sh` MaxBytes[temper]: 500 Options[temper]: nopercent,growright,nobanner,nolegend,noinfo,gauge ShortLegend[temper]: C LegendI[temper]: Temperatura dom * 10 LegendO[temper]: Temperatura SF * 10 YLegend[temper]: Stopnie C
Tworzymy skrypt, który będzie weryfikował temperaturę lokalnie i z internetu.
#!/bin/bash DATAdlaLINKSA=`date +%Y/%m/%d` LINK_TEMP="http://www.wunderground.com/history/airport/EPWA/$DATAdlaLINKSA/DailyHistory.html?format=1" # weryfikacja czy załadowany jest moduł lsmod | grep w1_therm > /dev/null 2>/dev/null if [ $? = 0 ] then echo ok >/dev/null else sudo modprobe w1_gpio sudo modprobe w1_therm fi TEMPczujnik=`cat "/sys/bus/w1/devices/28-000004458ce3/w1_slave" | grep "t=" | cut -d "=" -f 2` echo "scale=2; $TEMPczujnik / 100" | bc TEMPWAW=`links -width 150 -dump $LINK_TEMP | tail -1 | cut -d "," -f 2` echo "scale=2; $TEMPWAW * 10" | bc
Przy zrzucie stronki przez links - ostatnia linia (zebrana przez tail -1) pokazuje standardowo tylko godzinę... pewnie jest na to inne rozwiązanie, ale nie chciałem za bardzo wnikać i poszerzyłem po prostu zakres dla linksa (-width 150).
Odpalamy jeszcze raz indexmaker i po jakimś czasie powinniśmy mieć wykresy.
Niebieska linia to wyniki z internetu, a zielone słupki to nasz czujnik.
Jeśli chodzi o już zupełnie praktyczne zastosowanie - myślę, że trochę tego jest - np. monitor temperatury w garażu, szklarni, pomieszczenia w którym szykujemy wino, serwerowni itp.
Można sięgnąć nieco (naprawdę tylko nieco) głębiej do kieszeni i zakupić wodoodporny czujnik i monitorować temperaturę płynów itp.
Można sięgnąć nieco (naprawdę tylko nieco) głębiej do kieszeni i zakupić wodoodporny czujnik i monitorować temperaturę płynów itp.
Nie sprawdzasz sumy kontrolnej na odczycie z czujnika, czasem może być błąd CRC i zły wynik.
OdpowiedzUsuńf = open('/sys/bus/w1/devices/28-000004ce045e/w1_slave')
regex = re.compile(".*crc\=[0-9a-f][0-9a-f] (YES|NO)\n.*t\=(\d*)")
r = regex.search(str(f.read()))
f.close()
if r and str(r.group(1)) == "YES":
return float(r.group(2))/1000
Kolego, a jak temp na zewnątrz będzie ujemna? :) Walcze tez z tym zagadnieniem :)
OdpowiedzUsuńCenne informacje można tutaj znaleźć
OdpowiedzUsuń