因为当时突然要比赛,还要关于树莓派,当时规定的题材有三个,最后搞了整了这个。
环境:版本2.0.1:20210331发布
板载:树莓派4B+
拓展备件:温湿度传感器、火焰传感器、烟雾传感器、蜂鸣器,板载摄像头、RGB灯、PCF8591模块
显示效果:有excel表格记录温度,湿度,烟雾传感器,火焰传感器传出的数值,和报警信息,指示灯效果,报警效果,(注:最后加了一个人体红外传感器,有人就会蜂鸣器响,摄像头拍照,指示灯变色)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 编写人:小废物
# 编写时间:2022/10/18 10:41
import RPi.GPIO as GPIO
import importlib
import time
import sys
import adafruit_dht
import board
import datetime
import json
import os
import PCF8591 as ADC
这一部分主要是引用各种内置库
PIO.setmode(GPIO.BCM) # 管脚映射,采用BCM编码
GPIO.setwarnings(False) # 忽略GPIO 警告
# 三色LED灯管脚编号
LedR = 18
LedG = 27
LedB = 22
RelayPin = 16
# dht11Pin = 12 # 温湿度传感器口
dht_device = adafruit_dht.DHT11(board.D12, use_pulseio=False)
Smoke = 23 # 烟雾传感器数字IO口
Fire = 25 # 火焰传感器数字IO口
Buzz = 24 # 蜂鸣器数字IO口
sbname = ['设备1']
sbcod = ['sb01']
这一部分定义各个接口
# 载入python文件
buzzer = importlib.import_module('01_active_buzzer')
# 初始化工作
buzzer.setup(Buzz)
def setup():
global temperature_low, temperature_high, humidity_low, humidity_high # 定义温湿度上下限
temperature_low = 5
temperature_high = 30
humidity_low = 5
humidity_high = 70
# global sensor
# sensor = adafruit_dht.DHT11(dht11Pin)
ADC.setup(0x48) # 设置PCF8591模块地址
GPIO.setup(Smoke, GPIO.IN) # 烟雾传感器数字IO口,设置为输入模式
GPIO.setup(Fire, GPIO.IN) # 火焰传感器数字IO口,设置为输入模式
curdate = time.strftime('%Y%m%d', time.localtime())
history_file = '/var/www/html/main/datajson/' + str(curdate) + 'history.json'
monitor_file = '/var/www/html/main/datajson/' + str(curdate) + 'monitor.json'
config_file = '/home/pi/Desktop/kongtiao/config.json'
def update_history_data(filename, res):
"""历史数据存储首先判断是否存在,若不存在则创建并写入;若存在则先读取内容,转为json格式,再以append方式写入"""
if os.path.isfile(filename):
with open(filename, "r", encoding="utf-8") as f:
data_content = f.read()
data_list = json.loads(data_content)
data_list.extend(json.loads(res))
with open(filename, "w+", encoding="utf-8") as f:
f.write(json.dumps(data_list, ensure_ascii=False))
else:
with open(filename, "w+", encoding="utf-8") as f:
# with open("/home/pi/hi.json", "w+", encoding="utf-8") as f:
data_list = json.loads(res)
f.write(json.dumps(data_list, ensure_ascii=False))
def update_monitor_data(filename, res):
"""实时数据直接替换并写入即可"""
with open(filename, 'w+', encoding='utf-8') as f:
f.write(json.dumps(res, ensure_ascii=False))
def read_config_data(filename):
with open(filename, 'r+', encoding='utf-8') as f:
settime = json.load(f)
return settime
def loop():
flag = 0
while True:
time.sleep(2)
GPIO.setup(RelayPin, GPIO.OUT)
GPIO.output(RelayPin, GPIO.LOW)
settime = read_config_data(config_file)
curtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
settime = datetime.datetime.strptime(settime, "%Y-%m-%d %H:%M:%S")
curtime = datetime.datetime.strptime(curtime, "%Y-%m-%d %H:%M:%S")
if flag == 0:
if 0 <= (settime - curtime).total_seconds() <= 8:
GPIO.output(RelayPin, GPIO.HIGH)
print(1)
flag = 1
time.sleep(0.5)
GPIO.output(RelayPin, GPIO.LOW)
try:
current_temperature = dht_device.temperature
current_humidity = dht_device.humidity
except RuntimeError as error:
print(error.args[0])
continue
except Exception as error:
dht_device.exit()
raise error
# current_temperature, current_humidity = Adafruit_DHT.read(sensor, dht11Pin) # 读取温湿度值
current_status_somke = GPIO.input(Smoke) # 读取烟雾传感器数字IO口值
current_status_fire = GPIO.input(Fire) # 读取火焰传感器数字IO口值
total_data = [] # 保存实时数据
for i in range(len(sbname)):
if current_temperature is not None and current_humidity is not None:
if current_status_somke == 0:
my_smoke = '有烟'
else:
my_smoke = '无烟'
if current_status_fire == 0:
my_fire = '有火'
else:
my_fire = '无火'
my_temperature = round(current_temperature, 2)
my_humidity = round(current_humidity, 2)
if temperature_low < float(my_temperature) < temperature_high:
temperature_state = '温度正常'
# state = '状态正常'
elif float(my_temperature) <= temperature_low:
temperature_state = '温度过低,请打开空调制热!'
# state = '异常告警'
else:
temperature_state = '温度过高,请打开空调制冷!'
# state = '异常告警'
if humidity_low < float(my_humidity) < humidity_high:
humidity_state = '湿度正常'
# state = '状态正常'
elif float(my_humidity) <= humidity_low:
humidity_state = '环境过于干燥!'
# state = '异常告警'
else:
humidity_state = '环境过失,请打开空调除湿!'
# state = '异常告警'
if current_status_somke == 0 or current_status_fire == 0 or float(
my_temperature) <= temperature_low or float(my_temperature) >= temperature_high or float(
my_humidity) <= humidity_low or float(my_humidity) >= humidity_high:
state = '异常告警'
else:
state = '状态正常'
res = '[{"name":"%s","bm":"%s","temperature":{"value":"%s ℃","state":"%s"},' \
'"humidity":{"value":"%s rh","state":"%s"},"time":"%s","state":"%s","smoke":"%s","fire":"%s"}]' % (
sbname[i], sbcod[i], my_temperature, temperature_state, my_humidity, humidity_state,
str(datetime.datetime.now()), state, my_smoke, my_fire)
total_data.extend(json.loads(res))
update_history_data(history_file, res)
update_monitor_data(monitor_file, total_data)
print(str(datetime.datetime.now()))
print('当前温度为:', current_temperature)
print('当前湿度为:', current_humidity)
if current_status_somke == 0:
print('检测到烟雾!')
if current_status_fire == 0:
print('检测到火焰!')
# LED灯初始管脚状态设置
GPIO.setup(LedR, GPIO.OUT)
GPIO.setup(LedG, GPIO.OUT)
GPIO.setup(LedB, GPIO.OUT)
GPIO.output(LedR, GPIO.LOW)
GPIO.output(LedG, GPIO.LOW)
GPIO.output(LedB, GPIO.LOW)
# 状态告警
if float(current_temperature) <= float(temperature_low) or float(current_humidity) <= float(humidity_low):
GPIO.output(LedR, GPIO.LOW)
GPIO.output(LedG, GPIO.LOW)
GPIO.output(LedB, GPIO.HIGH)
for i in range(0, 3):
buzzer.beep(0.5)
if float(temperature_low) < float(current_temperature) < float(temperature_high) and float(
humidity_low) < float(current_humidity) < float(humidity_high):
GPIO.output(LedR, GPIO.LOW)
GPIO.output(LedG, GPIO.HIGH)
GPIO.output(LedB, GPIO.LOW)
if float(current_temperature) >= float(temperature_high) or float(current_humidity) >= float(humidity_high):
GPIO.output(LedR, GPIO.LOW)
GPIO.output(LedG, GPIO.LOW)
GPIO.output(LedB, GPIO.HIGH)
for i in range(0, 3):
buzzer.beep(0.5)
if current_status_somke == 0 or current_status_fire == 0:
GPIO.output(LedR, GPIO.LOW)
GPIO.output(LedG, GPIO.LOW)
GPIO.output(LedB, GPIO.HIGH)
for i in range(0, 3):
buzzer.beep(0.5)
def destroy():
buzzer.destroy()
GPIO.cleanup()
if __name__ == "__main__":
try:
setup()
loop()
except KeyboardInterrupt:
destroy()
有点串,主要当时懒还有就是时间赶了一点 拼接的一点其他项目内容,最后没记错的话加了一个人体红外传感器。