回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

#新物联网挑战二#智慧校园气象站物联网可视化平台 简单

头像 HOPE 2023.06.20 270 3

【项目背景】

         近年来,随着工业化和城市化的快速发展,大气污染问题日益严重,对人类健康和生态环境造成了巨大的影响。尤其近年来极端天气频频出现,已成为全球共同面临的威胁,引起了各国政府和公民的忧虑。一份由联合国气候变化秘书处发布的报告,指出全球的极端天气增多、强度增强,预示着地球的气候格局正在面临着前所未有的变革。

         因此,我们应及时采取应对气候变化的措施,以减缓极端天气带来的影响。例如减少温室气体排放和采用可再生能源,加强水资源管理,采取更健康的饮食和生活方式等。

         在研究天气变化和大气污染的过程中,气象科学在这方面发挥着重要作用,可以帮助我们更好地了解和预测大气污染的形成、扩散和演变过程。

        近期,我利用DF公司的云雀气象仪和Gravity ENS160 Air Quality Sensor空气质量传感器及Gravity PM2.5 Air Quality Sensor空气质量传感器和行空板为主要设备,我尝试制作一个智慧校园气象站物联网平台。可以实时显示一些空气质量监测和PM2.5及气象方面的实时指标,通过这个平台,旨在可以在校园中让学生直观感受到物联网平台的作用,激发学生对气象知识和环境保护方面知识的兴趣,同时鼓励学生能深入研究气象科学与大气污染之间的关系,探讨如何利用先进的技术与方法,提高大气污染监测、预报与治理能力,为构建绿色、宜居的城市环境贡献智慧与力量。

         

 

材料清单

  • 云雀气象仪 X1
  • Gravity ENS160 Air Quality Sensor空气质量传感器 X1 链接
  • Gravity PM2.5 Air Quality Sensor空气质量传感器 X1 链接
  • 行空板 X1 链接
  • SCI采集模块 X1 链接

【资料卡】

      由于初次使用云雀传感器和空气质量传感器及SCI数据采集模块,我对这方面的一些相关的指标非常的陌生。因此,我觉得作为一名非气象非环保专业的人,我个人很有必要学习(科普)下这方面知识,如果您对此不感兴趣,可直接略过此部分。

 

(注:以下资料来自网络,如有版权方面的问题,请联系我删除。)

 

空气质量监测相关指标参考:

AQI是空气质量指数

空气质量指数(Air Quality Index,简称AQI),简单来说就是能够对空气质量进行定量描述的数据。

AQI(Air Quality Index,空气质量指数)描述了空气清洁或者污染的程度,以及对健康的影响。空气质量指数的重点是评估呼吸几小时或者几天污染空气对健康的影响,可能呼吸污染的空气后,在几个小时或几天的经验。

f1531cd21099c69791bb3d942b9b842d_77094b36acaf2edd3c23b4969d1001e9380193fb.jpg

空气质量划分

针对单项污染物的规定了空气质量分指数。参与空气质量评价的主要污染物为细颗粒物、可吸入颗粒物、二氧化硫、二氧化氮、臭氧、一氧化碳等六项。

1、一级: 空气污染指数 ≤50优级

2、二级: 空气污染指数 ≤100良好

3、三级: 空气污染指数 ≤150轻度污染

4、四级: 空气污染指数 ≤200中度污染

AQI等级参考


 

eCO2/CO2浓度参考


 

TVOC浓度参考

 

TVOC

是指挥发性有机物。挥发性有机物的标准范围是0.60mg/m^3如果超出该标准范围,说明空气中存在较严重的污染,会损害人体健康,甚至危及生命。挥发性有机物是除一氧化碳、二氧化碳、碳酸和碳酸盐以外,室内挥发性有机气体物质的统称,主要包括苯类、烷类、芳烃类、烯类、卤烃类等。其具有臭味和刺激性,主要影响中枢神经系统和消化系统,严重时甚至可损伤肝脏和造血系统,出现变态反应。如果挥发性有机物浓度超出0.60mg/m^3,可能会出现头晕、头痛、嗜睡、乏力、胸闷、食欲缺乏、恶心等症状。

 

HCHO

是指甲醛:甲醛是一种可挥发的有机化合物,具有强烈的刺激性。甲醛的标准范围是0.10mg/m^3。人的甲醛嗅觉值约为0.06mg/m^3,但个体差异很大,当室内空气中的甲醛浓度超过0.15mg/m^3,人体接触后,会表现出眼结膜和呼吸道黏膜的刺激症状,出现眼睛红肿、畏光流泪、咽干发痒、咳嗽、喷嚏、气喘、胸闷、皮肤干燥发痒等表现。此外,甲醛还可引起变态反应,诱发过敏性哮喘,甚至引起过敏性紫癜。而长期接触空气中超过1.34mg/m^3浓度的甲醛,会出现类神经症状,甚至引起肝功能异常,同时也可出现呼气性功能障碍,并且遗传毒性研究发现,甲醛能引起基因突变和染色体损伤。

 

PM2.5空气质量国际标准表

image.png

空气污染指数(AQI)与PM1.0,PM2.5污染物浓度值对应表

image.png

风力:

风力是指风吹到物体上所表现出的力量的大小。一般根据风吹到地面或水面的物体上所产生的各种现象,把风力大小分为13个等级,最小是0级,最大为12级。根据我国2012年6月发布的《风力等级》国家标准,依据标准气象观测场10米高度处的风速大小,将风力等级依次划分为18个等级,表达风速的常用单位有三个,分别为海里/小时、米/秒、公里/小时,我国台风预报时常用单位为米/秒。

b361c607827c703b112cd82b2ecca43b_W020140718624079696373.jpg

  中国气象局于2001年下发《台风业务和服务规定》,以蒲福风力等级将12级以上台风补充到17级。12级台风定为 32.4-36.9米/秒;13级为37.0-41.4米/秒;14级为41.5-46.1米/秒,15级为46.2-50.9米/秒,16级为51.0-56.0米/秒,17级为56.1-61.2米/秒。琼海30年前那场台风,中心附近最大风力为73米/秒,已超过17级的最高标准。称之为18级,也是国际航海界关于特大台风的普遍说法。

 

 

海拔高度与大气压力对照表

 

663797a46fe2c12e3348e2be0932f84b_1cbc8d5e-6e1f-4b25-a6db-3a7612f41c441.gif

我国部分地区海拔高度和大气压力

eee92019bd69b668668ff66254fcdc26_u=1501282873,3683367192&fm=253&fmt=auto&app=138&f=JPEG_w=621&h=500.webp

硬件连接情况:

QQ图片20230711223132.jpg

 

 

SIOT后台topic展示

QQ截图20230711220232.jpg

物联网数据可视化平台的界面效果展示

QQ截图20230711212711.jpg

在项目制作和测试过程中我发现等级登记表盘组件在调整分段后在全屏时会显示不全,这可能是MIND+数据可视化面板的一个小BUG。另外,云雀气象仪风向的数值有时候会显示得和风速一样。SCI数据采集模块有时候连接上不能识别,需要拔下来重新插上或者换一下位置。

 

本次项目我在制作可视化平台的界面上费了一定的功夫,想制作一个兼具科技感和实用的可视化平台的界面,充分使用了MIND+可视化平台各种功能,自己使用PS软件制作了一些透明背景的装饰图标来进行界面美化。

【主要功能】

       1.实时显示当前温度、湿度、亮度值和音量值。

       2.实时显示当前空气质量监测的TVOC和ECO2两项指标。

       3.实时显示空气质量指数AQI等级指标。

       4.实时显示HCHO指标。

       5.实时显示PM1.0/PM10指标。

       6.实时显示风速、风向、气压、PM2.5指标。

       7.实时显示摄像头视频监控画面。

       8.实时显示当前时间(表盘和数字两种)。

       9.通过鼠标控制风扇和门禁(灯光)的打开和关闭。

 

【教学中的主要作用】

       1.通过物联网大屏展示物联网的功能和作用,使学生进一步了解物联网平台系统的组成。

       2.激发学生对信息科技和创客教育及对环境保护、气象科学方面的学习兴趣。

       3.学习相关传感器(比如SCI采集模块、云雀气象仪和PM2.5空气质量传感器等)的使用方法和相关知识。

【程序截图】

screenshots-气象站.mp-1689084227938.png

代码
#  -*- coding: UTF-8 -*-

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

# 事件回调函数
def on_message_callback(client, userdata, msg):
    if (msg.payload.decode() == (str("don"))):
        p_p24_out=Pin(Pin.P24, Pin.OUT)
        p_p24_out.write_digital(1)
    if (msg.payload.decode() == (str("doff"))):
        p_p24_out=Pin(Pin.P24, Pin.OUT)
        p_p24_out.write_digital(0)
    if (msg.payload.decode() == (str("on"))):
        p_p22_out=Pin(Pin.P22, Pin.OUT)
        p_p22_out.write_digital(1)
    if (msg.payload.decode() == (str("off"))):
        p_p22_out=Pin(Pin.P22, Pin.OUT)
        p_p22_out.write_digital(0)


Board().begin()
siot.init(client_id="731635259563777",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
u_audio = Audio()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)

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
vd = cv2.VideoCapture()
vd.open(-1)
while not (vd.isOpened()):
    print("摄像头初始化中....")
print("摄像头初始完成")
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.")
SCI1.enable_record()
print("SCI初始化成功")
yunque_i2c = DFRobot_Atmospherlum_I2C(0x42)
while (yunque_i2c.begin() != 0):
    print("yunque_i2c initialize failed!!")
    time.sleep(1)
print("Sensor initialize success!!")
yunque_i2c.set_local_time()
time.sleep(1)

print("云雀初始化成功")
p_gravitypm25 = DFRobot_GravityPM25()
print("PM2.5空气质量传感器初始化成功")
siot.getsubscribe(topic="siot/声音光线值")
siot.getsubscribe(topic="siot/温度")
siot.getsubscribe(topic="siot/湿度")
siot.getsubscribe(topic="siot/气压")
siot.getsubscribe(topic="siot/气压")
siot.getsubscribe(topic="siot/HCHO")
siot.getsubscribe(topic="siot/AQI")
siot.getsubscribe(topic="siot/TVOC")
siot.getsubscribe(topic="siot/ECO2")
siot.getsubscribe(topic="siot/PM1.0")
siot.getsubscribe(topic="siot/PM2.5")
siot.getsubscribe(topic="siot/PM10")
siot.getsubscribe(topic="siot/door")
siot.getsubscribe(topic="siot/风扇")
siot.getsubscribe(topic="siot/风速")
siot.getsubscribe(topic="siot/风向")

while True:
    if vd.grab():
        ret, grab = vd.read()
        siot.publish(topic="siot/摄像头", data=base642base64(grab))
    else:
        print("没有下一帧")
    siot.publish_save(topic="siot/声音光线值", data=(str((str(u_audio.sound_level()) + str(","))) + str(light.read())))
    siot.publish_save(topic="siot/风速", data=(yunque_i2c.get_value("speed")))
    siot.publish_save(topic="siot/风向", data=(yunque_i2c.get_value("speed")))
    siot.publish_save(topic="siot/温度", data=(yunque_i2c.get_value("Temp")))
    siot.publish_save(topic="siot/湿度", data=(yunque_i2c.get_value("Humi")))
    siot.publish_save(topic="siot/气压", data=(yunque_i2c.get_value("Pressure")))
    siot.publish_save(topic="siot/HCHO", data=SCI1.get_value0("HCHO"))
    siot.publish_save(topic="siot/AQI", data=SCI1.get_value0("AQI"))
    siot.publish_save(topic="siot/TVOC", data=SCI1.get_value0("TVOC"))
    siot.publish_save(topic="siot/ECO2", data=SCI1.get_value0("ECO2"))
    siot.publish_save(topic="siot/PM1.0", data=SCI1.get_value0("PM1.0"))
    siot.publish_save(topic="siot/PM2.5", data=SCI1.get_value0("PM2.5"))
    siot.publish_save(topic="siot/PM10", data=SCI1.get_value0("PM10"))
    siot.publish_save(topic="siot/声音", data=u_audio.sound_level())
    siot.publish_save(topic="siot/亮度", data=light.read())
    print((str("气压") + str((str((yunque_i2c.get_value("Pressure"))) + str((yunque_i2c.get_unit("Pressure")))))))
    print((str("风速") + str((str((yunque_i2c.get_value("speed"))) + str((yunque_i2c.get_unit("speed")))))))
    print((str("风向") + str((yunque_i2c.get_value("speed")))))

【功能设想】

      1.深入研究气象数据的逻辑之后,能通过已知的数据大概推算出天气情况或对天气情况进行预测。

      2.当某些空气质量数据不利于健康的时候,及时进行预警或警示。

      3.增加更多的互动,如利用舵机对摄像头的角度进行调节等。

      4.利用两台行空板进行数据的远程传输。

 

 

【制作反思】

        由于气象科学空气质量检测等方面的知识专业性比较强,我作为一名外行。对这些参数和指标非常不熟悉,对于气象科学与大气污染之间的关系还没有足够深入的认识。本来打算查阅一些这方面的资料,想得出一些之间的因果关系,然后进而能模拟进行天气预报等的推理,比如根据当前的气温、风力、风速、气压、空气污染等指标可以推出天气方面的分析,同时能对一些极端天气和空气质量存在问题时进行警示或提醒,但由于水平和技术以及时间所限,未能完成。

 

评论

user-avatar
  • 三春牛-创客

    三春牛-创客2024.04.05

    赞赞赞

    0
    • 三春牛-创客

      三春牛-创客2024.04.05

      厉害

      0
      • hacker_

        hacker_2023.08.18

        666

        0