mscroggs.co.uk
mscroggs.co.uk

subscribe

Blog

Archive

Show me a Random Blog Post
 2017 
 2016 
 2015 
 2014 
 2013 
 2012 

Tags

folding paper folding tube maps london underground platonic solids rhombicuboctahedron raspberry pi weather station programming python php news royal baby probability game show probability christmas flexagons frobel coins reuleaux polygons countdown football world cup sport stickers tennis braiding craft wool emf camp people maths trigonometry logic propositional calculus twitter mathslogicbot oeis pac-man graph theory video games games chalkdust magazine menace machine learning javascript martin gardner reddit national lottery rugby puzzles advent game of life dragon curves fractals pythagoras geometry triangles european cup dates palindromes chalkdust christmas card bubble bobble asteroids final fantasy curvature binary arithmetic bodmas statistics error bars estimation accuracy

Archive

Show me a Random Blog Post
▼ show ▼
 2013-07-11 20:39:00 

Raspberry Pi Weather Station

On 19 June, the USB temperature sensor I ordered from Amazon arrived. This sensor is now hooked up to my Raspberry Pi, which is taking the temperature every 10 minutes, drawing graphs, then uploading them here. Here is a brief outline of how I set this up:

Reading the Temperature

I found this code and adapted it to write the date, time and temperature to a text file. I then set cron to run this every 10 minutes. It writes the data to a text file (/var/www/temperature2) in this format:
2013 06 20 03 50,16.445019
2013 06 20 04 00,16.187843
2013 06 20 04 10,16.187843
2013 06 20 04 20,16.187843

Plotting the Graphs

I found a guide somewhere on the internet about how to draw graphs with Python using Pylab/Matplotlib. If you have any idea where this could be, comment below and I'll put a link here.
In the end my code looked like this:
import time
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pylab as plt
import matplotlib.dates as mdates

ts = time.time()
import datetime
now=datetime.datetime.fromtimestamp(ts)
st = mdates.date2num(datetime.datetime(int(float(now.strftime('%Y'))), int(float(now.strftime('%m'))), int(float(now.strftime('%d'))), 0, 0, 0))
weekst = st-int(float(datetime.datetime.fromtimestamp(ts).strftime('%w')))
f=file('/var/www/temperature2','r')
t=[]
s=[]
tt=[]
ss=[]
u=[]
v=[]
g=[]
h=[]
i=[]
weekt=[]
weektt=[]
weeks=[]
weekss=[]
mini=1000
maxi=0
cur=-1
datC=0

for line in f:
  fL=line.split(",")
  fL[0]=fL[0].split(" ")
  if cur==-1:
    cur=mdates.date2num(datetime.datetime(int(float(fL[0][0])),int(float(fL[0][1])),int(float(fL[0][2])),0,0,0))
  datC=mdates.date2num(datetime.datetime(int(float(fL[0][0])),int(float(fL[0][1])),int(float(fL[0][2])),int(float(fL[0][3])),int(float(fL[0][4])),0))
  u.append(datC)
  v.append(fL[1])
  if datC>=st and datC<=st+1:
    t.append(datC)
    s.append(fL[1])
  if datC>=st-1 and datC<=st:
    tt.append(datC+1)
    ss.append(fL[1])
  if datC>=weekst and datC<=weekst+7:
    weekt.append(datC)
    weeks.append(fL[1])
  if datC>=weekst-7 and datC<=weekst:
    weektt.append(datC+7)
    weekss.append(fL[1])
  if datC>cur+1:
    g.append(cur)
    h.append(mini)
    i.append(maxi)
    mini=1000
    maxi=0
    cur=mdates.date2num(datetime.datetime(int(float(fL[0][0])),int(float(fL[0][1])),int(float(fL[0][2])),0,0,0))
  mini=min(float(fL[1]),mini)
  maxi=max(float(fL[1]),maxi)
g.append(cur)
h.append(mini)
i.append(maxi)

plt.plot_date(x=t,y=s,fmt="r-")
plt.plot_date(x=tt,y=ss,fmt="g-")
plt.xlabel("Time")
plt.ylabel("Temperature ($^\circ$C)")
plt.title("Daily")
plt.legend(['today','yesterday'], loc='upper left',prop={'size':8})
plt.grid(True)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.gcf().subplots_adjust(bottom=0.15,right=0.99)
labels = plt.gca().get_xticklabels()
plt.setp(labels,rotation=90,fontsize=10)
plt.xlim(st,st+1)
plt.savefig('/var/www/tempr/tg1p.png')

plt.clf()

plt.plot_date(x=weekt,y=weeks,fmt="r-")
plt.plot_date(x=weektt,y=weekss,fmt="g-")
plt.xlabel("Day")
plt.ylabel("Temperature ($^\circ$C)")
plt.title("Weekly")
plt.legend(['this week','last week'], loc='upper left',prop={'size':8})
plt.grid(True)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('                     %A'))
plt.gcf().subplots_adjust(bottom=0.15,right=0.99)
labels = plt.gca().get_xticklabels()
plt.setp(labels,rotation=0,fontsize=10)
plt.xlim(weekst,weekst+7)
plt.savefig('/var/www/tempr/tg2p.png')

plt.clf()

plt.plot_date(x=u,y=v,fmt="r-")
plt.xlabel("Date & Time")
plt.ylabel("Temperature ($^\circ$C)")
plt.title("Forever")
plt.grid(True)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y %H:%M'))
plt.gcf().subplots_adjust(bottom=0.25,right=0.99)
labels = plt.gca().get_xticklabels()
plt.setp(labels,rotation=90,fontsize=8)
plt.savefig('/var/www/tempr/tg4p.png')


plt.clf()

plt.plot_date(x=g,y=h,fmt="b-")
plt.plot_date(x=g,y=i,fmt="r-")
plt.xlabel("Date")
plt.ylabel("Temperature ($^\circ$C)")
plt.title("Forever")
plt.legend(['minimum','maximum'], loc='upper left',prop={'size':8})
plt.grid(True)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d %b'))
plt.gcf().subplots_adjust(bottom=0.15,right=0.99)
labels = plt.gca().get_xticklabels()
plt.setp(labels,rotation=90,fontsize=8)
plt.savefig('/var/www/tempr/tg3p.png')
If there's anything in there you don't understand, comment below and I'll try to fill in the gaps.

Uploading the Graphs

Finally, I upload the graphs to mscroggs.co.uk/weather. To do this, I set up pre-shared keys on the Raspberry Pi and this server and added the following as a cron job:
0 * * * * scp /var/www/tempr/tg*p.png username@mscroggs.co.uk:/path/to/mscroggs.co.uk/public_html/img/weather
I hope this was vaguely interesting/useful. I'll try to add more details and updates over time. If you are building something similar, please let me know in the comments; I'd love to see what everyone else is up to.
Edit: Updated to reflect graphs now appearing on mscroggs.co.uk not catsindrag.co.uk.

Similar Posts

How OEISbot Works
Logic Bot
Logical Contradictions
Logic Bot, pt. 2

Comments

Comments in green were written by me. Comments in blue were not written by me.
 Add a Comment 


I will only use your email address to reply to your comment (if a reply is needed).

To prove you are not a spam bot, please type "bear" in the box below (case sensitive):
© Matthew Scroggs 2017