Raspberry Pi - Merilnik temperature

Priklop senzorjev DS1820 / DS18B20

Ker se bližajo vroči dnevi, sem prišel na idejo, da bi RPI uporabil za merjenje temperature. Pod streho imam že zmontirana 2 DS1820 senzorja. En meri dejansko temperaturo direktno pod streho, drugi na isti veji pa meri temperaturo zunaj. Zakaj ju nebi uporabil za merjenje temperature?

Za RPI se najde na spletu že kar nekaj vodičev za priklop senzorja DS18B20. V pomoč je seveda da ima malina že pripravljene kernel module, ki poskrbijo za komunikacijo. Na srečo kernel modul podpira tudi senzorje DS1820, ki se rahlo razlikujejo od DS18B20.

Za osnovno delovanje potrebujemo rahlo modificirati 2 konfiguracijski datoteki:
sudo nano /etc/modules
V katero dodamo na koncu 2 vrstici:
w1-gpio
w1_therm
Datoteko shranimo
popravimo še konfiguracijo:
sudo nano /boot/config.txt
Na koncu dopišemo:
device_tree=
Datoteko shranimo in malino ponovno zaženemo:
sudo reboot
Seveda moramo imeti priključen tudi senzor.
Priklop senzorja je najvarneje opraviti ob ugasneni malini. Shema priklopa je prikazana spodaj.

Ko se malina ponovno zboota, lahko preko konzole pogledamo ali je bil senzor prepoznan. V konzolo vpišemo:
ls - l /sys/bus/w1/devices
V primeru enega senzorja se izpiše nekaj takšnega:
skupno 0
lrwxrwxrwx 1 root root 0 jun 10 19:33 28-000003a7b494 -> ../../../devices/w1_bus_master1/28-000003a7b494
lrwxrwxrwx 1 root root 0 jun 10 19:33 w1_bus_master -> ../../../devices/w1_bus_master1
V kolikor se izpiše samo prva vrstica senzor ne deluje. Preveriti je potrebno priklop, ali pa ima prste kakšna modifikacija programske opreme RPI.
V drugi vrstici je med drugim izpisana dolga številka. v mojem primeru je 000003a7b494, ki je unikatna številka mojega senzorja, lahko rečemo njegov naslov. Naslov določi proizvajalec čipa in ga ni možno spremeniti.

Seveda nas zanima ali senzor tudi kaj meri. V konzolo vpišemo:
cat /sys/bus/w1/devices/28-000003a7b494/w1_slave
Čez nekaj trenutkov se izpiše:
9f 01 4b 46 7f ff 01 10 40 : crc=40 YES
9f 01 4b 46 7f ff 01 10 40 t=25937
Crc=40 YES pomeni, da so bili podati iz čipa uspešno prenešeni do maline(ni prišlo do napake pri prenosu)
t= 25937 pa je temperatura - v tem primeru 25,937 stopinj celzija.
V kolikor nočemo kernel modulov samodejno zagnati ob zagonu maline lahko module naložimo ročno z vpisom v konzolo naslednjih ukazov:
sudo modprobe w1-gpio && sudo modprobe w1_therm
Sedaj pa z izmerjenimi podatki kaj naredimo!

Senzorji, ki so trenutno na razpolago so trije:

10-000801511ae5 - lokacija = podstreha
10-000801d33938 - lokacija = PC soba
10-000801d37ffc - lokacija = zunaj, severna stran hiše

Zagon web serverja

Poskrbimo za najnovejšo različico operacijskega sistema:
sudo apt-get update
sudo apt-get upgrade
Namestimo Apache server s podporo za python skripte:
sudo apt-get install apache2 libapache2-mod-wsgi python-libxml2
Strežnik nato reštartamo:
sudo service apache2 restart
Namestimo še preprost Python CMS - Pyplate:
curl http://pyplate.com/install_apache.sh | sudo bash
Ko skripta zaključi nas obvesti o začasnem geslu vmesnika in uporabniškem imenu. Pomembno je, da se oboje zapišemo, da kasneje ne bo problemov s prijavo. Poskrbimo za backup:
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default.backup
sudo cp /usr/share/pyplate/sample_configs/apache2/default /etc/apache2/sites-available/default
Zaradi varnosti poskrbimo za izbris datoteke, ki je zgenerirala geslo:

sudo rm /usr/share/pyplate/wsgi-scripts/create_passwd_file.py

Ter ponovno zaženemo apache strežnik, da se zažene z novo konfiguracijo:

sudo service apache2 restart
Brisanje Pyplate-a:
sudo rm -r /usr/share/pyplate

Vzorčna stran je takoj na voljo na lokalnem naslovu računalnika: 127.0.0.1, ki ga vtipkamo v brskalnik.

Namestitev SQLite

Namestitev SQLite bazo podatkov, ki jo bomo uporabili za snemanje temperature:
SQLite je knjižnica, ki omogoča izdelavo samozadostnega SQL strežnika, ki ne potrebuje konfiguriranja. več detajlov na strani: https://www.sqlite.org/lang.html
sudo apt-get install sqlite3
Za dostop do baze vpišemo v konzolo naslednji ukaz:
sqlite3 meritve.db
Izpiše se naslednje:
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"sqlite>
Program izdela bazo podatkov z imenom meritve.db
V bazi odpremo tabelo Temperatura:
BEGIN;
CREATE TABLE Temperatura (kdaj DATETIME, temp1 NUMERIC, temp2 NUMERIC,temp3 NUMERIC, temp4 NUMERIC);
COMMIT;
Tabela vsebuje pet kolon: kdaj ter temp1-temp4. V kolono "kdaj" se vpiše podatek o uri in datumu zapisa, v "temp1-4" pa se bo zapisovala temperatura posameznih senzorjev. Pri pisanu ukazov pazimo, da vpišemo na koncu podpičje!
Zaključimo dostop do baze preko konzole: (pazimo na pikico pred ukazom)
.quit
Izdelano bazo prekopiramo v mapo /var/www/, ter nastavimo lastnika baze na www-data, ki ga uporablja Apache
sudo cp meritve.db /var/www/
sudo chown www-data:www-data /var/www/meritve.db

Bash skripta, ki izpiše senzorje in njihove podatke

Dokler ne uredim resnega programa, ki bo izpisoval temperature, sem izdelal eno preprosto bash skripto, da mi ni potrebno tipkati en kup ukazov.
sudo nano temperatura.sh
In prepišemo naslednjo vsebino:
#!/bin/bash
echo "Temperature po hiši"
echo "Temperatura zunaj:"
cat /sys/bus/w1/devices/10-000801d37ffc/w1_slave
echo ""
echo "Temperatura podstrehe:"
cat /sys/bus/w1/devices/10-000801511ae5/w1_slave
echo ""
echo "Temperatura sobe računalnika:"
cat /sys/bus/w1/devices/10-000801d33938/w1_slave
echo ""
Skripti dodamo pravice, da jo lahko zaženemo:
sudo chmod +x temperatura.sh
Skripto lahko zaženemo z ukazom:
sudo ./temperatura.sh
Skripta izpiše kje se posamezni senzorji nahajajo ter podatke, ki jih senzor pošlje ob poizvedbi.

PYTHON program za branje in zapisovanje temperatur v bazo.

Ideja izdelave merilnika temperature je takšna, da na RPi priključim senzorje, napišem en program v PYTON-u, ki bo prebral podatke iz senzorjev, ter preprane podatke zapisal v sqllite bazo.

Če hočem podatke meriti dlje časa moram podatke periodično zajemati. To lahko izvedemo na več načinov. Poznam vsaj dva. Lahko znotraj PYTON programa naredimo zanko, kjer program čada, da mine želen čas, lahko pa PYTON progam preko Task schedulrja zaženemo v poljubnem razmaku.

Za začetek sem napsial, program, ki beleži periodično brez pomoči operacijskega sistema. Ker sem program zagnal kar preko Python-ove lupine, mi je lupina čez čas zamrznila, ker je bilo očitno preveč vpisov. Zato sem se odločil, da bom poizkusil meritev temperature izvesti preko Task shedulerja. (Cron)

Za ta namen moramo imeti na voljo ustrezen Python program, ki mora biti izvršljiva datoteka, nato pa v Cron dodamo nalogo, ki vsakih 15 minut zažene python program.

Priprava konfiguracuje RPi.

  1. Apache skonfiguriramo, da lahko izvede Pyton skripte
    sudo nano /etc/apache2/sites-enabled/000-default
    V datoteki, ki se odpre najdemo naslednje besedilo:
    WSGIPythonPath /usr/share/pyplate/wsgi-scripts
    <VirtualHost *:80>
    DocumentRoot /var/www
    <Directory /var/www>
    AllowOverride All
    Order allow,deny
    Allow from all
    </Directory>
    WSGIScriptAlias /pyplate /usr/share/pyplate/wsgi-scripts/index.py
    </VirtualHost>
    V datoteko dodamo naslednje besedilo:
    AddHandler cgi-script .py

    Vsebina je potem takšna:
    WSGIPythonPath /usr/share/pyplate/wsgi-scripts
    <VirtualHost *:80>
    DocumentRoot /var/www
    <Directory /var/www>
    AddHandler cgi-script .py
    AllowOverride All
    Order allow,deny
    Allow from all
    </Directory>
    WSGIScriptAlias /pyplate /usr/share/pyplate/wsgi-scripts/index.py
    </VirtualHost>
    Nato pononvno zaženemo Apache strežnik:
    sudo service apache2 reload
    To je načeloma dovolj, če pa hočemo preveriti ali strežnik deluje lahko napišemo kratko Python scripto, jo prekopiramo v mapo /var/www/ in jo poizkusimo zagnati tako, da v brskalnik vpišemo ip naslov RPi, /, ter ime naše datoteke, ki jo želimo zagnati: http://192.168.1.219/test.py

    Primer vsebine datoteke:
    #!/usr/bin/env python
    print ('Content-type: text/html\n\n') #Brskalnik prikazuje HTML datoteke,
    print ('<h1>Dela al ne dela?</h1>')
    Če je vse pravilno nastavljeno bi brskalnik moral prikazati vsebino "Dela al ne dela?"

  2. Najprej skripto, ki se uporablja za spremljanje temperatur spisano v Pytonu prekopiramo na lokacijo, kjer Apache hrani našo internetno stran: /var/www/

  3. Spisani Pyton skripti moramo pred zagonom iz brskalnika ali konzole določiti, da je izvršljiva, ter da je lastnik apache
    sudo chmod +x /var/www/zapis.py
    sudo chown www-data:www-data /var/www/zapis.py
  4. Nastavimo redno izvajanje skripte, ki zapisuje temperature, ki jih merijo senzorji, v bazo:
    sudo crontab -u www-data -e
    In vpišemo naslednjo vsebino:
    */15 * * * * /var/www/zapis.py
    Zapis pomeni, da cron vsakih 15min izvrši datoteko /var/www/zapis.py
    Uspešnost lahko preverimo z ogledom datoteke /var/log/syslog

  5. Na ustrezno mesto skopiramo tudi bazo, če jo že imamo z vsebino:
    sudo cp /media/Data/rpi_temp_logger-master/meritve.db /var/www/
    Primer prekopira bazo meritve.db iz mape /media/Data/rpi_temp_logger-master/ v mapo /var/www/

  6. Dodamo pravice za pisanje v bazo:
    sudo chown www-data:www-data /var/www/meritve.db

Priprava Python programov

Datoteke sem shranil v mapo na RPi, ki je na voljo v mojem omrežju. Tako, da sem datoteke lahko urejal z Notepad++ programom, ki ima tudi podporo za Python, tako da je koda ustrezno obarvana. Kodo pa sem izvajal na RPi, tako, da so bili programom dostopni senzorji. Končne verzije sem nato prekopiral na predvidene lokacije in popravil nastavitve na RPi, da so delovale kot je bilo predvideno.

Pripravil sem 2 python programa, ki ju potrebujemo, da uspemo podatke pregledovati v brskalniku.

Prvi program zapis.py je namenjen branju podatkov senzorjev z diska, kamor jih RPi zapiše, ter vpis teh podatkov v bazo. Ta program vsakih 15 minut zažene cron. zapis.py

Drugi program tempratura.py pa poženemo preko brskalnika, in v brskalnik izpiše graf in nekaj statistike.
temperatura.py

Ni vse zraslo na mojem zelniku. Večino informacij skupaj s programi sem pridobill tule:
http://raspberrywebserver.com/cgiscripting/rpi-temperature-logger/building-an-sqlite-temperature-logger.html

Sam sem poizkušal iz pridobljenih podatkov le stvar toliko dodelati, da bi delovala po mojih željah. Nekaj popravkov v kodi je bilo potrebno, ker sam poganjam Python 3, ki ima ravno pri ukazih Print nekaj razlike od Python 2. Poleg tega sem imel 4 senzorje, zato je bilo tudi treba nekaj kolobocije.

Pri pregledovanju vsebine baze si lahko pomagamo z izpisom:izpis.py

Sam sem si pomagal tudi s programom SQLite manager, ki teče na windows platformi, a je demo omejen na 20 vrstic, lahko pa z njim izvajamo SQL poizvedbe, tudi brisanje podatkov.


P&P© 28.7.2015