Weather - pressure and temperature
Keeping track of air pressure is essential at sea. From early on recording barographs were in widespread use. Today instruments that can monitor and display air pressure, current and historically can be bought. However, there is no reason that the Pi can not perform this task. Air pressure and temperature sensors are readily avaiable at remarkably low prices. I have used a chip called BMP 180 from Bosch. Documentation can be found here. The board I use is bought from China, show on the picture.
This board uses the I2C bus to communicate with the Pi board. The I2C is a bus which allow for a range of different units to connect to the same bus.
The very simple wiring using the I2C bus make it very suitable for caes where a range of different sensors are to be connected and used with the Pi.
Only 4 wires, power (+ GND) and two wires for I2C, one signal and one clock signal. The Pi uses two dedicated pins for I2C, they are maked SDA and SLC and are located close to the 3.3V supply at pin 1, SDA is pin 2 and SCL is pin 3. Verify this before you turn on the power.
Software is equally simple, drivers and modules for Python are readly available on the net.
A small Python3 program to collect and print the temperature and pressure can look like the one below, it uses the BMP085 module, but they are compatible and it works without problems. The Python3 code is:
import Adafruit_BMP.BMP085 as BMP085
sensor = BMP085.BMP085()
print('Temp = {0:0.2f} *C'.format(sensor.read_temperature()))
print('Pressure = {0:0.2f} hPa'.format(sensor.read_pressure()/100))
A Python barograph program need to log a timestamp and a pressure measurement to a log file befor we can proceed to plot any data.
import Adafruit_BMP.BMP085 as BMP085
import time
import datetime
sensor = BMP085.BMP085()
cal=1400 # Add 14 hPa
bufsize = 1
logfile = open("logg.dta", 'a', bufsize)
while True:
logfile.write(str(datetime.datetime.now())+','+str((sensor.read_pressure()+cal)/100)+"\n")
time.sleep(1800)
I take a sample every 30 mins which should be enough to keep track of even rapid changes in air pressure. The log file wil contain a time stamp and a pressure readying, separated by a comma to make parsing easier as the time stamp contain spaces. A line of the log file look like this:
2017-01-01 21:12:12.649517,1010.55
Next is to accumulate some hours of data and write a little Pyton code that can display historical data.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as dt
from datetime import datetime
time_format = '%Y-%m-%d %H:%M:%S.%f'
minp=980
maxp=1020
plt.ion()
plt.close('all')
fig, ax = plt.subplots(1)
hfmt = dt.DateFormatter('%d:%H')
ax.xaxis.set_major_formatter(hfmt)
plt.xlabel('Date@hours') # Not very elegant, but there is not room for MMM-DD-HH, an alternative is HH before present.
plt.ylabel('Pressure [hPa]')
while True:
pr=np.genfromtxt('logg.dta', dtype=('str'), delimiter=',')
x=pr[-48*2:,0] # Data is logged every half hour.
y=pr[-48*2:,1] # We display the last 48 hours.
time = [datetime.strptime(i, time_format) for i in x]
p0=y[-1].astype(float)
p1=y[-2].astype(float)
if minp>y.astype(float).min():
minp=round(y.astype(float).min()-5,-1)
if maxp<y.astype(float).max():
maxp=round(y.astype(float).max()+5,-1)
plt.ylim(minp,maxp)
grad=(p0-p1) * 3600/(time[-1].timestamp()-time[-2].timestamp())
title='Air pressure trend : '+format(grad,'.2f')+' hPa/h'
plt.title(title)
plt.xlim(time[0],time[95]) # Rescale to only display the last 48 hours.
l=plt.plot_date(time,y,color='red')
plt.draw()
plt.pause(300)
l.pop(0).remove()
An axample of a barographic plot is given below, this is 48 hours of pressure data: