mscroggs.co.uk
mscroggs.co.uk

subscribe

Blog

 2013-07-11 
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:
 python 
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")))
= file("/var/www/temperature2","r")
= []
= []
tt = []
ss = []
= []
= []
= []
= []
= []
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:
 bash 
0 * * * * scp /var/www/tempr/tg*p.png username@mscroggs.co.uk:/path/to/folder
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.
                        
(Click on one of these icons to react to this blog post)

You might also enjoy...

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).

Allowed HTML tags: <br> <a> <small> <b> <i> <s> <sup> <sub> <u> <spoiler> <ul> <ol> <li> <logo>
To prove you are not a spam bot, please type "htdiw" backwards in the box below (case sensitive):

Archive

Show me a random blog post
 2024 

Feb 2024

Zines, pt. 2

Jan 2024

Christmas (2023) is over
 2023 
▼ show ▼
 2022 
▼ show ▼
 2021 
▼ show ▼
 2020 
▼ show ▼
 2019 
▼ show ▼
 2018 
▼ show ▼
 2017 
▼ show ▼
 2016 
▼ show ▼
 2015 
▼ show ▼
 2014 
▼ show ▼
 2013 
▼ show ▼
 2012 
▼ show ▼

Tags

matrix multiplication london folding tube maps chebyshev numerical analysis computational complexity live stream stickers approximation hyperbolic surfaces raspberry pi people maths chess bodmas game of life frobel tmip pi approximation day runge's phenomenon mathsjam python captain scarlet matrices royal baby light european cup quadrilaterals squares gerry anderson guest posts pi fonts electromagnetic field newcastle errors recursion standard deviation game show probability manchester science festival polynomials exponential growth cambridge world cup bubble bobble latex trigonometry stirling numbers hats estimation oeis edinburgh wave scattering craft puzzles advent calendar arithmetic reuleaux polygons boundary element methods misleading statistics matt parker bempp pascal's triangle manchester youtube final fantasy flexagons signorini conditions inline code preconditioning the aperiodical chalkdust magazine pac-man platonic solids palindromes national lottery binary crossnumber graphs coins asteroids christmas databet a gamut of games crochet cross stitch map projections gaussian elimination interpolation turtles martin gardner speed javascript graph theory braiding simultaneous equations mathslogicbot anscombe's quartet royal institution plastic ratio 24 hour maths dragon curves machine learning golden spiral radio 4 phd programming curvature numbers nine men's morris folding paper christmas card rhombicuboctahedron zines sobolev spaces probability books go football ternary sport sorting reddit datasaurus dozen dataset pizza cutting error bars menace logo determinants pythagoras data rugby finite element method data visualisation convergence propositional calculus gather town geogebra news inverse matrices fence posts wool correlation hannah fry finite group hexapawn sound noughts and crosses countdown weak imposition statistics london underground realhats mathsteroids weather station big internet math-off ucl accuracy games tennis dates fractals mean geometry php triangles logic harriss spiral video games matrix of cofactors dinosaurs talking maths in public logs draughts golden ratio matrix of minors

Archive

Show me a random blog post
▼ show ▼
© Matthew Scroggs 2012–2024