First steps to my RPi weather station

First steps to my RPi weather station

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.

Comments are closed.