Raspberry Pi-Lettura Temperatura

Da raspibo.
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Ciao a tutti , scrivo il primo WIKI della mia vita , spero di non fare troppi errori, in ogni caso, un grazie a Davide per le info iniziali

Volevo presentare il progetto a cui sto lavorando in questi ultimi giorni , anche lui il è mio primo Raspberry. E' uno dei tanti progetti per leggere la temperatura , però volevo propinarlo lo stesso.. Intanto presentato in italiano, poi a parte la gestione elettronica, che è molto semplice. Il tutto prevede di integrare nel raspberry; un server web , un gestore di grafici rrdtools , vari script in php + bash + python, perciò anche come "palestra" per imparare una qualche funzione mi sembra utile , personalmente mi sta dando parecchi spunti. Poi funziona e ottengo il grafico della temperatura di casa .


SCHEMA PROGETTO Raspberry Temperatura


Progetto.png

Lo scopo è visualizzare l'andamento della temperatura nel tempo , e creare un grafico con gli RRDTOOL, poi esportare il tutto su un server web esterno , per poter visualizzare il tutto anche da fuori casa , in più è stato aggiunto un modulo per leggere la temperatura esterna dal servizio weather.noaa.gov.

Il "cuore" del sistema è l'integrato DS18B20

Ds18b20.png Il principio di funzionamento e lo schema sono illustrati nella sezione 1Wire e il sensore di temperatura ds18s10

Consiglio la lettura che comprende anche i test per verificare che il sensore sia installato in modo corretto.


HARDWARE

Lista componenti

  • N°01 Raspberry PI versione B
  • N°01 Chip DS18B20
  • N°01 Resistenza 4,7 Kohm
  • N°01 Jack stereo 2,5mm da pannello
  • N°01 Jack 2,5 maschio
  • Cavo tripolare audio , lunghezza a piacere fino a 60 Metri
  1. Collegare il pin1 (GND) del DS18B20 al pin 6 del GPIO Raspberry
  2. Collegare il pin2 (DQ) del DS18B20 al pin 7 GPIO4 del Raspberry
  3. Collegare il pin3 (VDD) del DS18B20 al pin 1 3,3V del GPIO Raspberry
  4. Collegare la resistenza 4,7 Kohm tra il piedino 2 e 3 del DS18B20

Schema connessioni

Ds18s10.png

Questa è l'immagine del primo prototipo Prototipo.jpg

Che poi si è evoluto in Jack.jpgFinale.jpg

SOFTWARE

  • occorre che il raspberry abbia il "suo"sistema operativo già installato , la Raspbian Wheezy è perfetta.
  • ricordo i test di funzionamento ( 1Wire e il sensore di temperatura ds18s10 )
  • installiamo i moduli mancanti del sistema operativo
  1. sudo apt-get install libwww-perl
  2. sudo apt-get install python-paramiko
  3. sudo apt-get install rrdtool
  4. sudo apt-get install apache2 php5 libapache2-mod-php5
  5. sudo apt-get install ftp
  • Creiamo una cartella dove andare a memorizzare i file degli script , i miei esempi fanno riferimento ad una cartella creata in /opt/dallas, ma non è vincolante ( DALLAS è l'iniziale della sigla DS18B20 la società che costruisce il componente NDR )
  • creiamo il primo file chiamato create_db.sh , questo serve per creare e inizializzare il database "round robin" utilizzato da rrdtools

Io solitamente uso il "vi" ma ognuno utilizzi il suo "editor" preferito

  • vi /opt/dallas/create_db.sh
#!/bin/bash
rrdtool create hometemp.rrd --start N --step 300 \
DS:temp:GAUGE:600:U:U \
DS:outtemp:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365

Ricordiamoci di renderlo eseguibile con:

chmod +x /opt/dallas/create_db.sh
  • Creiamo il file create_graphs.sh questo script crea l'andamento giornaliero, settimanale, mensile e annuale sulla base dei dati memorizzati nel database rrdtool
vi /opt/dallas/create_graphs.sh
#!/bin/bash
DIR="/opt/dallas"
#set to C if using Celsius
TEMP_SCALE="C"
#define the desired colors for the graphs
INTEMP_COLOR="#CC0000"
OUTTEMP_COLOR="#0000FF"
#hourly
rrdtool graph $DIR/temp_hourly.png --start -4h \
DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \
AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \
DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \
LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]"
#daily
rrdtool graph $DIR/temp_daily.png --start -1d \
DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \
AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \
DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \
LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]"
#weekly
rrdtool graph $DIR/temp_weekly.png --start -1w \
DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \
DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \
AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \
LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]"
#monthly
rrdtool graph $DIR/temp_monthly.png --start -1m \
DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \
DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \
AREA:temp$INTEMP_COLOR:"Inside Temperature [deg F]" \
LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg F]"
#yearly
rrdtool graph $DIR/temp_yearly.png --start -1y \
DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \
DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \
AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \
LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]"
#aggiorna server web locale
cp $DIR/*.png /var/www/.
#aggiorna server web esterno 
#/opt/dallas/ftp_graphs.sh

rendiamo sempre il file eseguibile

chmod +x /opt/dallas/create_graphs.sh

Creiamo il file get_temp.pl questo è il fle che va a leggere i dati dal sensore , perciò nella riga

$output = `sudo cat /sys/bus/w1/devices/10-0008027acdab/w1_slave 2>&1`;

Occorre mettere il codice del vostro sensore DS , ricordo che i sensori sono serializzati, ogni sensore ha un codice diverso, e nella riga

my $metar_url = 'http://weather.noaa.gov/pub/data/observations/metar/stations/LIMP.TXT';

La sigla LIMP.TXT sta per Parma , ognuno poi metterà il codice della sua zona secondo la tabella di weather.noaa.gov, io ho messo PR , purtroppo Reggio non avendo aereoporto non è contemplata

vi /opt/dallas/get_temp.pl
#!/usr/bin/perl
use LWP::UserAgent;
my $dir = '/opt/dallas';
my $metar_url = 'http://weather.noaa.gov/pub/data/observations/metar/stations/LIMP.TXT';
my $is_celsius = 1; #set to 1 if using Celsius
my $ua = new LWP::UserAgent;
$ua->timeout(120);
my $request = new HTTP::Request('GET', $metar_url);
my $response = $ua->request($request);
my $metar= $response->content();
$metar =~ /([\s|M])(\d{2})\//g;
$outtemp = ($1 eq 'M') ? $2 * -1 : $2; #'M' in a METAR report signifies below 0 temps
$outtemp = ($is_celsius) ? $outtemp + 0 : ($outtemp * 9/5) + 32;
$modules = `cat /proc/modules`;
if ($modules =~ /w1_therm/ && $modules =~ /w1_gpio/)
{
       #modules installed
}
else
{
       $gpio = `sudo modprobe w1-gpio`;
       $therm = `sudo modprobe w1-therm`;
}
$output = "";
$attempts = 0;
while ($output !~ /YES/g && $attempts < 5)
{
       $output = `sudo cat /sys/bus/w1/devices/10-0008027d7cb0/w1_slave 2>&1`;
       if($output =~ /No such file or directory/)
       {
               print "Could not find DS18B20\n";
               last;
       }
       elsif($output !~ /NO/g)
       {
               $output =~ /t=(\d+)/i;
               $temp = ($is_celsius) ? ($1 / 1000) : ($1 / 1000) * 9/5 + 32;
               $rrd = `/usr/bin/rrdtool update /$dir/hometemp.rrd N:$temp:$outtemp`;
       }
       $attempts++;
}
$file = '/var/www/temperatura.txt';
open(INFO, ">$file");
print INFO "$temp\n";
close(INFO)
#print "Outside temp: $outtemp\n";
#print "Inside temp: $temp\n";

Rendiamo sempre eseguibile il file

chmod +x /opt/dallas/get_temp.pl

Andiamo a creare gli utimi 3 file, che però servono solo a traferire i dati su un server web esterno , utilizzando il protocollo ftp, questo script va utilizzato in abbinamento al file /root/.netrc . Nel file .netrc vengono memorizzati i dati di accesso all'aera ftp con la password in chiaro .

vi /root/.netrc
machine NOME.SERVER.FTP
login NOME_UTENTE
password PASSWORD_FTP_UTENTE

poi il comando chmod 0600 /root/.netrc

File contenente la lista dei file da trasferire

vi /opt/dallas/lista
prompt on
binary
mput *.png

E infine lo script per iniziare l'upload verso il sito esterno

vi /opt/dallas/ftp_graphs.sh
#!/bin/bash
cd /opt/dallas
ftp NOME.SERVER.FTP < lista

Rendere eseguibile il file con chmod +x /opt/dallas/ftp_graphs.sh

Ultimo file , va creato in /var/www è il file in php che genera la pagina web, da richiamare

vi /var/www/temperature.php 

Questo file, lo allego in formato pdf temperature.pdf, essendo in formato php/html va in "contrasto" con il sistema wiki File:Temperature.pdf

COLLAUDO

Ora eseguire nell'ordine i seguenti programmi

  1. /opt/dallas/create_db.sh
  2. /opt/dallas/get_temp.pl
  3. /opt/dallas/create_graphs.sh
  4. da un pc della rete htp://IP_RASPBERRY/temperature.php

Se tutto OK , inserire nel crontab i 2 script , vedi questo come esempio

  • /5 * * * * /opt/dallas/get_temp.pl
  • /5 * * * * /opt/dallas/create_graphs.sh

e togliere il #dall'ultima riga di /opt/dallas/create_graphs.sh , per abilitare il trasferimento ftp verso il sito


WORK IN PROGRESS

Tutto quello che ho scritto e realizzato , è stato ispirato da varie letture e da questo progetto

http://blog.turningdigital.com/2012/09/raspberry-pi-ds18b20-temperature-sensor-rrdtool/

Manca ancora di tradurre un paio di scritte in Inglese e implementare ulteriori funzioni , tipo:

  1. modulo per Nagios
  2. allarmi di sovra/sotto temperatura a mezzo email , oppure chiudendo un contatto di un relè
  3. Oppure mi viene in mente come modulo di un eventuale controllo temperatura di un appartamento , controllabile da remoto

Qua link al "mio" http://www.ferrarini.info/temperature.php

le temperature negative , anomale per il periodo, erano le lettura di una stazione meterologica USA

ATTENZIONE a dove posizionare il jack per il sensore di temperatura. se guardate la foto , il "mio" jack stereo da 2,5" è finito proprio sopra il regolatore di tensione ... Io ho costruito 2 sonde una "corta" e una con un cavetto di 2 metri ( vedi foto ) . La sonda "corta" non funziona perchè il regolatore interno di tensione scalda il connettore metallico... Falsando le misure :(

Sonde.jpg

--Luca 09:54, 19 mar 2013 (CET)

Discussione:Raspberry Pi-Lettura Temperatura