回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

#新物联网挑战三#物联网室内甲醛监控和智能遥控窗户通风系统 简单

头像 江志灏 2023.08.19 797 6

            新房子装修好后,因新买的家具,窗帘,还有铺地板,墙面扇灰等,会释放很多甲醛。甲醛是一种有机化合物,化学式为CH2O。它是一种无色气体,具有刺激性的刺鼻气味。甲醛在室温下是气态的,但可以很容易地溶解在水中。甲醛是一种常见的化学物质,在许多日常生活中的产品和装饰材料中都可被发现。由于其具有防腐和杀菌的特性,甲醛常被用作建筑材料、木制品、家具、地板、油漆和胶水等的制造过程中。然而,甲醛也是一种空气污染物,它释放到室内空气中后容易被人们吸入。高浓度的甲醛对人体健康有害,可能引起眼睛、鼻腔和喉咙的刺激,以及头痛、呼吸困难、皮肤过敏等不适症状。长时间暴露在高浓度甲醛环境中,甚至可能导致更严重的健康问题。

因此,对于新装修的房屋或新家具,了解并采取有效的通风措施至关重要,以减少甲醛的浓度,保护室内空气质量和人体健康。所以新装修好的房屋需要开窗通风一断时间才可以入住。通过研究表明,甲醛在室温超过19°C挥发性比较好,当室温低于19°C度时挥发性比较差。所以对新装修好的房子进行甲醛及环境温度的检测是十分有必要的。这次检测的数据如下:空气中的甲醛浓度,空气质量指数,空气中的有机化合物含量,空气中的二氧化碳浓度,环境温度,环境湿度机环境光和环境声音的强度。

        还有一个问题就是每当下雷阵雨的时候,因雨来的比较急促,没有人在家里,可能导致没有人关窗,导致家里进水或者衣物被淋湿。

        针对以上两个问题我设计一款物联网可以在电脑远程监测家里的甲醛浓度,及空气质量指数,空气中二氧化碳含量,环境温度和环境湿度等重要数据。然后可以通过这些数据值,进行远程物联网控制家居的窗户的关和开进行通风处理。当检测到室内的甲醛过高的时候,人可以通过远程遥控窗户的开和关,减少了人进入新装修的房子,减少人与甲醛接触的机会。增加雨滴传感器,当雨滴传感器器监测到下雨的时候,在行空板上会提醒人下雨了,并且会自动关窗。这个自动开窗系统结构简便,易于安装。

    下面是我的设计步骤。

步骤1 测量窗户尺寸,设计控制窗户的动力结构。

1.png

步骤2 根据测量尺寸绘制尺寸图纸,绘制图纸尺寸如下。

image.png

步骤3 根据图纸尺寸用电脑进行三维模型建模。

image.png

步骤4 连接好基本电路,电路如下图所示。

image.png

 

掌控板连接电路图

dbe2273e012b7fa84fd99635df0ab7a.jpg

步骤5 编写程序,主要程序如下图所示。第一部分是行空板程序。

image.png
image.png

步骤6 接下来编写掌控板的程序。程序如下图所示。

image.png
image.png
image.png

步骤7 搭建SIOT服务器。

image.png

步骤8 设计可视化大屏幕,用大屏幕作为一个控制终端。

image.png

步骤9 运行程序,测试机械结构和动力结构。

image.png

步骤10 剪辑好视频素材,下面看一下制作过程和展示效果。

步骤11 总结这次制作的历程和解决的问题

           总结:室内甲醛监测与智能遥控窗户系统,可以实时监测新装修房子里面的甲醛含量,个人可以根据屋里面的甲醛含量远程遥控家里面的窗户开关,达到及时通风的目的,避免人进入房间里面与甲醛有接触,保护人们的身体健康。还有就是在下雨的时候,雨滴传感器检测到下雨,窗户会自动关闭。当无人在家里面的时候刮大风了,也可以通过手机APP实现远程遥控关窗,解决了人们生活中的两个实际问题。

材料清单

  • 行空板 X1
  • SCI采集模块 X1
  • 掌控板 X1
  • 语音识别传感器 X1
  • 掌控板扩展板 X1
  • 步进电机 X1
  • 雨滴传感器 X1
  • 甲醛传感器 X1
  • 空气质量传感器 X1
代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
import base64
from io import BytesIO
from PIL import Image
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from dfrobot_rp2040_sci import *
from pinpong.board import DHT11
from pinpong.board import Board
from unihiker import Audio
from unihiker import GUI
import time
import siot
import cv2

# 事件回调函数
def button_click1():
    siot.publish_save(topic="siot/topicone", data=(str("kc")))
def button_click2():
    siot.publish_save(topic="siot/topicone", data=(str("gc")))


u_gui=GUI()
Board().begin()
siot.init(client_id="891069372750547",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
u_audio = Audio()
siot.connect()
siot.loop()

def frame2base64(frame):
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(frame) #将每一帧转为Image
    output_buffer = BytesIO() #创建一个BytesIO
    img.save(output_buffer, format='JPEG') #写入output_buffer
    byte_data = output_buffer.getvalue() #在内存中读取
    base64_data = base64.b64encode(byte_data) #转为BASE64
    return base64_data #转码成功 返回base64编码

def base642base64(frame):
    data=str('data:image/png;base64,')
    base64data = str(frame2base64(frame))
    framedata = base64data[2:(len(base64data)-1)]
    base642base64_data = data + str(framedata)
    return base642base64_data
hcho=u_gui.draw_text(text="3",x=10,y=5,font_size=15, color="#FF0000")
aqi=u_gui.draw_text(text="4",x=10,y=35,font_size=15, color="#006600")
tuoc=u_gui.draw_text(text="5",x=10,y=65,font_size=15, color="#CC0000")
Eco2=u_gui.draw_text(text="6",x=10,y=95,font_size=15, color="#3333FF")
wd=u_gui.draw_text(text="7",x=10,y=125,font_size=15, color="#FF0000")
sd=u_gui.draw_text(text="8",x=10,y=155,font_size=15, color="#006600")
gx=u_gui.draw_text(text="9",x=10,y=185,font_size=15, color="#006600")
sy=u_gui.draw_text(text="10",x=10,y=215,font_size=15, color="#006600")
KC=u_gui.add_button(text="打开窗户",x=10,y=250,w=70,h=40,onclick=button_click1)
GC=u_gui.add_button(text="关闭窗户",x=100,y=250,w=70,h=40,onclick=button_click2)
dht1 = DHT11(Pin((Pin.P22)))
siot.getsubscribe(topic="siot/topicone")
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
    print("Initialization Sensor Universal Adapter Board failed.")
    time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")
vd = cv2.VideoCapture()
vd.open(0)
while not (vd.isOpened()):
    print("摄像头初始化中")
print("摄像头初始化完成")

while True:
    ret, grab = vd.read()
    siot.publish(topic="siot/实时监控画面", data=base642base64(grab))
    hcho.config(text=(str("甲醛浓度:") + str((str(SCI1.get_value1(SCI1.ePort1,"HCHO")) + str(SCI1.get_unit1(SCI1.ePort1,"HCHO"))))))
    aqi.config(text=(str("空气质量指数:") + str((str(SCI1.get_value1(SCI1.ePort2,"AQI")) + str(SCI1.get_unit1(SCI1.ePort2,"AQI"))))))
    tuoc.config(text=(str("有机化合物:") + str((str(SCI1.get_value1(SCI1.ePort2,"TVOC")) + str(SCI1.get_unit1(SCI1.ePort2,"TVOC"))))))
    Eco2.config(text=(str("二氧化碳浓度:") + str((str(SCI1.get_value1(SCI1.ePort2,"ECO2")) + str(SCI1.get_unit1(SCI1.ePort2,"ECO2"))))))
    wd.config(text=(str("环境温度:") + str((str(dht1.temp_c()) + str("°C")))))
    sd.config(text=(str("环境湿度:") + str((str(dht1.humidity()) + str("%")))))
    gx.config(text=(str("环境光强度") + str((str(light.read()) + str("lx")))))
    sy.config(text=(str("声音强度") + str((str(u_audio.sound_level()) + str("dB")))))
    siot.publish_save(topic="siot/室内甲醛值", data=SCI1.get_value1(SCI1.ePort1,"HCHO"))
    siot.publish_save(topic="siot/空气质量指数", data=SCI1.get_value1(SCI1.ePort2,"AQI"))
    siot.publish_save(topic="siot/总挥发性有机化合物", data=SCI1.get_value1(SCI1.ePort2,"TVOC"))
    siot.publish_save(topic="siot/eCO2指数", data=SCI1.get_value1(SCI1.ePort2,"ECO2"))
    siot.publish_save(topic="siot/环境温度", data=dht1.temp_c())
    siot.publish_save(topic="siot/环境湿度", data=dht1.humidity())
    siot.publish_save(topic="siot/环境光强度", data=light.read())
    siot.publish_save(topic="siot/声音强度", data=u_audio.sound_level())

评论

user-avatar
  • 腿毛利小五郎

    腿毛利小五郎2023.10.25

    666

    0
    • SJT

      SJT2023.10.22

      点赞

      0
      • 昊盟

        昊盟2023.10.07

        期待推广

        1
        • 江志灏

          江志灏2023.11.28

          谢谢

      • 星辰之子

        星辰之子2023.08.22

        牛牛牛

        0
        • hacker_

          hacker_2023.08.22

          666

          0