树莓派——工厂安防系统

因为当时突然要比赛,还要关于树莓派,当时规定的题材有三个,最后搞了整了这个。

环境:版本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()

有点串,主要当时懒还有就是时间赶了一点 拼接的一点其他项目内容,最后没记错的话加了一个人体红外传感器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难得糊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值