[Bygglogg]-ish Raspberry Pi som temperaturmätare
Tjena
Jag satt i samma tankar som många andra, vad ska jag göra med min Pi?
Eftersom jag var på jakt efter något som kan logga temperaturen i mitt serverrum och presentera det för mig på ett snyggt sätt så började jag helt enkelt forska i det.
Hårdvaran jag använde:
Raspberry Pi med ett 8GB minneskort (4GB går lika bra).
Strömadapter (gammal HTC-laddare).
USB-minne (4GB) för att installera Debain.
1st DS18B20+.
1st Metallfilmsmotstånd 0.25W 4,7Kohm .
1st GPIO 26 Pin Connector (för att inte löda direkt på min Pi).
Ladda ner:
NOOBS_v1_3_4.zip från http://www.raspberrypi.org/downloads/
och
SDFormatterv4.zip från https://www.sdcard.org/downloads/formatter_4/
Beställde två resistorer, en i reserv :).
Löda fast det på GPIO-connectorn enl följande bild
Nu ger vi oss på mjukvaran, vi börjar med att installera operativsystemet.
Formatera minneskortet med SDFormatter och kopiera sedan över innehåller från NOOBS_v1_3_4.zip rakt in på minneskortet.
Släng minneskortet i din Pi och starta den.
När den har startat visas en lista över operativsystem som kan installeras, välj Raspbian.
När det är klart startas automatiskt raspi-config där man kan ställa in språk, tid osv.
Innan vi går vidare ska vi testa så att hårdvaran fungerar.
Så stäng ner din Pi och koppla in temperaturmätaren och starta den igen.
Kör sedan
sudo modprobe w1-gpio
sudo modprobe w1-therm
cat /sys/bus/w1/devices/28-*/w1_slave
Om hårdvaran fungerar som den ska ska vi få ett mätvärde. Här ser vi att den visar 27,6 grader celcius.
Då är det dags att bygga lite script för att få detta snyggt.
Installera libwww-perl
sudo apt-get install libwww-perl
Installera paramiko (detta är till för att skicka graferna med sftp till t.ex en webserver).
sudo apt-get install python-paramiko
Installera rrdtool
sudo apt-get install rrdtool
Skapa en mapp som heter temperature
sudo mkdir temperature
Gå in i mappen
cd temperature
Skapa skriptet som ska skapa databasen
sudo nano create_db.sh
Klistra in följande text och spara med CTRL + X följt av Y och ENTER.
#!/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
Kör skriptet så att databasen skapas
sudo sh create_db.sh
Nu skapar vi skriptet som ska generera graferna.
sudo nano create_graphs.sh
Klistra in följande text och spara med CTRL + X följt av Y och ENTER.
#!/bin/bash
DIR="/home/pi/temperature/"
#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 $TEMP_SCALE]" \
LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]"
#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]"
Nu skapar vi skriptet som ska hämta temperaturen. Denna hämtar även yttertemperaturen från något som heter metar.
Leta upp din stad här http://weather.rap.ucar.edu/surface/stations.txt och ersätt KMSN.TXT i skriptet nedan med motsvarande för din stad.
sudo nano get_temp.pl
#!/usr/bin/perl
use LWP::UserAgent;
my $dir = '/home/pi/temperature/';
my $metar_url = 'http://weather.noaa.gov/pub/data/observations/metar/stations/...';
my $is_celsius = 0; #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/28-*/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++;
}
#print "Inside temp: $temp\n";
#print "Outside temp: $outtemp\n";
Nu skapar vi skriptet som skickar graferna till FTP-servern, tänk på att modifiera skriptet nedan med dina uppgifter för FTP-servern.
sudo nano ftp_graphs.py
#!/usr/bin/python
import paramiko
from commands import getstatusoutput
DIR = '/home/pi/temperature/'
#generate graphs
getstatusoutput(DIR + '/create_graph.sh')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('your_sftp_server', port=your_sftp_port, username='your_username', password='your_password')
sftp = ssh.open_sftp();
sftp.put(DIR + '/temp_hourly.png', 'rpi_temp/temp_hourly.png')
sftp.put(DIR + '/temp_daily.png', 'rpi_temp/temp_daily.png')
sftp.put(DIR + '/temp_weekly.png', 'rpi_temp/temp_weekly.png')
sftp.put(DIR + '/temp_monthly.png', 'rpi_temp/temp_monthly.png')
sftp.put(DIR + '/temp_yearly.png', 'rpi_temp/temp_yearly.png')
sftp.close()
Nu skapar vi websidan där graferna presenteras. Denna kan även skapas lokalt på din pi om du vill. Då måste du installera en webbserver på den vilket jag inte kommer att gå igenom här.
sudo nano index.php
<? $lastmod = date("F d, Y g:i A", filemtime("temp_daily.png")); ?>
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="refresh" content="3600" >
<title>RPi Temperature</title>
<style>
BODY
{
font-family: arial;
font-size: 10pt;
background-repeat: no-repeat; background-position: center center;
}
H2, H3 { margin-bottom: 0; }
</style>
</head>
<body>
<div style="width: 800px; margin-left: 100px;" >
<h2>RPi Temperature Inside & Outside</h2>
<i>Last Modified: <?=$lastmod?></i>
<h3>Daily</h3>
<img src="temp_daily.png" />
<h3>Weekly</h3>
<img src="temp_weekly.png" />
<h3>Monthly</h3>
<img src="temp_monthly.png" />
<h3>Yearly</h3>
<img src="temp_yearly.png" />
</div>
</body>
</html>
Nu måste vi se till att skripten körs automatiskt.
sudo crontab -e
Klistra in och spara med CTRL + X följt av Y och ENTER.
*/1 * * * * sudo /home/pi/temperature/get_temp.pl
*/5 * * * * sudo /home/pi/temperature/ftp_graphs.py
*/1 * * * * sudo /home/pi/temperature/create_graphs.sh
Se så snyggt det blev
Större delen av det jag har skrivit kommer från http://blog.turningdigital.com/2012/09/raspberry-pi-ds18b20-t...
Nu återstår lite finjusteringar samt att jag skulle vilja presentera temperaturen på webbsidan i siffror så jag kan se den aktuella temperaturen just nu.
Det går att göra detta med flera temperaturmätare om man vill. För att mäta i olika rum t.ex
Jag tror det var allt. Men har jag missat något så säg till :).
EDIT:
Jag lyckades att lösa problemet med att jag ville skriva ut temperaturen.
Det jag gjorde var att i
create_graphs.sh lägga till
rrdtool lastupdate $DIR/hometemp.rrd > $DIR/tmp.txt
i ftp_graphs.py lägga till
sftp.put(DIR + '/tmp.txt', 'rpi_temp/tmp.txt')
Precis under
sftp.put(DIR + '/temp_yearly.png', 'rpi_temp/temp_yearly.png')
Sedan på webbsidan index.php lägga till
<h3>Temp:
<?php
$section = file_get_contents('./tmp.txt', NULL, NULL, 27, 4);
print($section);
?>
℃ </h>