2012-12-27

Czujnik temperatury


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 +
no i + do 3.3V w RPI




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

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

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.

3 komentarze:

  1. Nie sprawdzasz sumy kontrolnej na odczycie z czujnika, czasem może być błąd CRC i zły wynik.

    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

    OdpowiedzUsuń
  2. Kolego, a jak temp na zewnątrz będzie ujemna? :) Walcze tez z tym zagadnieniem :)

    OdpowiedzUsuń
  3. Cenne informacje można tutaj znaleźć

    OdpowiedzUsuń