First steps to my RPi weather station

Python

report After my fist Pi experiment I finally decided what my final project will be: a weather station. After the temperature I thought humidity and atmospheric pressure will be the next task: To do that I needed two new sensors: DHT11 (don’t waste your money like I did on DHT11 buy DHT22) and BMP180.

dht-11 BMP180

In order to get the sensor working there is no better place then the Adafruit (thanks be to god!) website, I found there all I needed to get my reading:

  53bc258dc6c0425cb44870b50ab30621 This is how I connected the two sensors:

  • DHT11 gnd pin6
  • DHT11 vcc pin1
  • DHT11 data pin 7(gpio 4)
  • BMP180 gnd pin9
  • BMP180 vcc pin17
  • BMP180 scl pin 5 (gpio 3 scl)
  • BMP180 sda pin3 (gpio 2 sda)

I then modified the monitor.py script from my previous post (first raspberry pi project):

!/usr/bin/python

import sys

import Adafruit_DHT import Adafruit_BMP.BMP085 as BMP085 import sqlite3

import os import time import glob

dbname='/home/pi/templog.db'

store the temperature in the database

def log_temperature(temp, pitemp, humi ,batemp, press, alt, seapress):

conn=sqlite3.connect(dbname) curs=conn.cursor()

curs.execute("INSERT INTO temps values(datetime('now'), (%s), (%s), (%s), (%s), (%s), (%s), (%s))" % (temp,pitemp,humi,batemp, press, alt, seapress))

commit the changes

conn.commit()

conn.close()

display the contents of the database

def display_data():

conn=sqlite3.connect(dbname) curs=conn.cursor()

for row in curs.execute("SELECT * FROM temps"): print str(row[0])+" "+str(row[1])+" "+str(row[2])+" "+str(row[3])+" "+str(row[4])+" "+str(row[5])+" "+str(row[6])+" "+str(row[7])

conn.close()

def getCPUtemperature(): res = os.popen('vcgencmd measure_temp').readline() return(res.replace("temp=","").replace("'C\n",""))

main function

This is where the program starts

def main():

sensor = BMP085.BMP085() humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, '4') log_temperature(temperature,getCPUtemperature(),humidity,sensor.read_temperature(),sensor.read_pressure(),sensor.read_altitude(),sensor.read_sealevel_pressure())

display_data()

if __name__=="__main__": main()

I then modified the web services rest.py code:

!/usr/bin/env python

import web from web.template import render

db = web.database(dbn='sqlite', db='/home/pi/templog.db')

urls = ( '/home/', 'index', '/home/(.*)','get_temp', '/pi/', 'piindex', '/pi/(.*)','get_pitemp', '/humi/', 'humiindex', '/humi/(.*)','get_humi', '/pressure/', 'pressureindex', '/pressure/(.*)','get_pressure', '/altitude/', 'altitudeindex', '/altitude/(.*)','get_altitude', '/seapressure/', 'seapressureindex', '/seapressure/(.*)','get_seapressure' )

app = web.application(urls, globals())

class index: def GET(self): temps = db.query("select timestamp, IFNULL(temp, '10') as temp, IFNULL(batemp, '10') as batemp from temps where timestamp>datetime('now','-24 hours')") #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.temp)+","+str(temp.batemp)+"]"

return output

class get_temp: def GET(self,hours): temps = db.query("select timestamp, IFNULL(temp, '10') as temp, IFNULL(batemp, '10') as batemp from temps where timestamp>datetime('now','-%s hours')" % hours) #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.temp)+","+str(temp.batemp)+"]"

return output

class piindex: def GET(self): temps = db.query("select timestamp, IFNULL(pitemp, '40') as pitemp from temps where timestamp>datetime('now','-24 hours')") #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class get_pitemp: def GET(self,hours): temps = db.query("select timestamp, IFNULL(pitemp, '40') as pitemp from temps where timestamp>datetime('now','-%s hours')" % hours) #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class humiindex: def GET(self): temps = db.query("select timestamp, IFNULL(humi, '40') as pitemp from temps where timestamp>datetime('now','-24 hours')") #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class get_humi: def GET(self,hours): temps = db.query("select timestamp, IFNULL(humi, '40') as pitemp from temps where timestamp>datetime('now','-%s hours')" % hours) #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class pressureindex: def GET(self): temps = db.query("select timestamp, IFNULL(pressure, '0') as pitemp from temps where timestamp>datetime('now','-24 hours')") #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class get_pressure: def GET(self,hours): temps = db.query("select timestamp, IFNULL(pressure, '0') as pitemp from temps where timestamp>datetime('now','-%s hours')" % hours) #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class altitudeindex: def GET(self): temps = db.query("select timestamp, IFNULL(altitude, '0') as pitemp from temps where timestamp>datetime('now','-24 hours')") #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class get_altitude: def GET(self,hours): temps = db.query("select timestamp, IFNULL(altitude, '0') as pitemp from temps where timestamp>datetime('now','-%s hours')" % hours) #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class seapressureindex: def GET(self): temps = db.query("select timestamp, IFNULL(seapressure, '0') as pitemp from temps where timestamp>datetime('now','-24 hours')") #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

class get_seapressure: def GET(self,hours): temps = db.query("select timestamp, IFNULL(seapressure, '0') as pitemp from temps where timestamp>datetime('now','-%s hours')" % hours) #select('temps') output= '' for temp in temps: output += ",['"+str(temp.timestamp)+"',"+str(temp.pitemp)+"]"

return output

if __name__ == "__main__": app.run()

Last but not list the index.php page on my LAMP server: Temperature Report Here is were I got so far, next step is rain detection and wind direction and speed. I will probably need to get my breadboard for the next few steps and looking forward to get my hands on a Pi A+ (better suited Pi for this project due to the low power consumption) Bye for now.