'''
Humidity and temperature monitor
In addition, an LED and a button have been added for testing purposes
Tested on Raspberry Pi Zero W
Connections:
+-------------------------------+
| PCB PRi Zero W |
+-------------------------------+
| - Button --------> GPIO 27 |
| - LED <----------- GPIO 17 |
| - DHT-22 (Data) -> GPIO 4 |
| - Vcc (3.3V) <---- Pin 1 |
| - GND <----------- Pin 9 |
+-------------------------------+
Author: Vassilis Serasidis
Created: 18 Nov 2020
'''
import RPi.GPIO as GPIO
from flask import Flask, render_template, request
from flask_socketio import SocketIO, emit
import Adafruit_DHT
import datetime
app = Flask(__name__)
socketio = SocketIO(app)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#Button setup
button_pin = 27
button_state = 'off'
GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP )
#LED setup
led_pin = 17
led_state = 'off'
GPIO.setup(led_pin, GPIO.OUT)
GPIO.output(led_pin, GPIO.LOW)
#DHT-22 setup
sensor = Adafruit_DHT.AM2302
pin = 4
humidity = -1
temperature = -1
counter = 0
def my_callback(channel):
#print("-> ", channel) #Print the pin number
if GPIO.input(channel):
socketio.emit('server_message', {'message':'btn_off'})
button_state = "off"
print ("OFF")
else:
socketio.emit('server_message', {'message':'btn_on'})
button_state = "on"
print ("ON")
GPIO.add_event_detect(button_pin, GPIO.BOTH, callback=my_callback)
@app.route("/", methods=['GET', 'POST'])
def main():
global humidity, temperature
global button_state, led_state
if humidity == -1: #Initialize humidity and temperature content
humidity, temperature = read_dht()
print("\n")
if request.method=='GET':
print("-= GET =-")
req = request.args.get("led")
print("LED-REQ: ", req)
if req == 'on':
led_state = 'off'
GPIO.output(led_pin, GPIO.LOW)
socketio.emit('server_message', {'message':'led_off'})
else:
led_state = 'on'
GPIO.output(led_pin, GPIO.HIGH)
socketio.emit('server_message', {'message':'led_on'})
req = request.args.get("btn")
print("BUT-REQ: ", req)
if req == 'on':
button_state = 'off'
socketio.emit('server_message', {'message':'btn_off'})
else:
button_state_state = 'on'
socketio.emit('server_message', {'message':'btn_on'})
req = request.args.get("dht")
print("DHT-REQ: ", req)
if req == "ref":
humidity, temperature = read_dht()
templateData = {
'temperature' : temperature,
'humidity': humidity,
'led' : led_state,
'btn' : button_state
}
return render_template('index.html', **templateData)
@app.route('/favicon.ico')
def favicon():
return app.send_static_file('pic/favicon.ico')
@socketio.on('client_message')
def receive_message (client_msg):
emit('server_message', client_msg)
def scheduleTask():
global humidity, temperature
dt_now = datetime.datetime.now().strftime("%d/%m/%Y, %H:%M:%S")
humidity, temperature = read_dht()
socketio.emit('server_message',
{'message':'sensor',
't_val':temperature,
'h_val':humidity,
'dt_val':dt_now
})
print(dt_now)
def read_dht():
#read_retry(sensor, pin, retries=15, delay_seconds=0.5, platform=None)
t=t2=h=h2= 0
for s in range (3): #Read 3 times the DHT2302 (DHT-22)
h, t = Adafruit_DHT.read_retry(sensor, pin, 15, 0.5)
t2 += t
h2 += h
t2 /= 3
h2 /= 4
print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(t2, h2))
return h2, t2
if __name__ == "__main__":
socketio.run(app, host='0.0.0.0', port=5000, debug=True)