AIGC辅助北京市公园室外环境监测系统V2
北京市公园室外环境监测系统是一种用于监测公园室外环境的设备和软件系统。该系统由多个传感器组成,可以收集公园内的温度、湿度、气压、风速、风向(此五项数据来自云雀气象仪)、 PM1.0、PM2.5、PM10(此三项来自Gravity: PM2.5空气质量传感器)AQI、TVOC、eCO2(此三项来自Gravity: ENS160 空气质量传感器)等多种环境参数数据。这些数据经过采集、传输、处理和分析后,可以在监测系统的控制中心显示和存储。
该系统的控制中心是行空板,由Gravity: SCI采集模块、云雀气象仪、Gravity: PM2.5空气质量传感器和Gravity: ENS160 空气质量传感器组成。控制中心可以实现对公园内各个区域的环境数据进行实时监测和分析,同时还可以生成历史数据报告和趋势分析报告。
在上一个版本的系统中,大屏显示的内容略显专业性,一般人民群众看到以后可能不知所云。所以在V2版本里对这个问题进行了大幅修改,将所有不容易理解的概念全部转化为容易理解的文字。这个过程由科大讯飞提供的“星火大模型”来解决,把生硬的专业文字转化为大众容易阅读的文字。大量简化了可视化大屏中的专业显示,使用更简约的布局
DFRobot提供的传感器采用高精度的传感器技术,具有高度的稳定性和可靠性。该系统不仅可以为公园管理者提供环境监测数据,还可以为公众提供实时的环境信息,提高公园管理的透明度和公众参与度。
开发环境
1. mind+ 1.8
2. 行空板SIOT 2.0
3. SCI
可视化大屏
此处文字由科大讯飞星火大模型输出:
今天的天气状况相当宜人。一股温和的西南风正在吹拂,其强度达到了5级,带来了清新而凉爽的气息。温度方面,当前的气温为11度,这是一个适中的温度,既不会让人感到过热也不会过于寒冷。 湿度方面,目前空气的相对湿度为5%,这意味着空气中的水分较少,是一个干燥的环境。气压方面,我们所在的地区的气压为733百帕斯卡,处于正常范围内。 空气质量指数(AQI)为1,显示出当前空气质量良好。尽管有机气态物质浓度略高,达到了66ppb,但这在一天的大部分时间里应该不会造成太大的影响。二氧化碳浓度为400ppm,这个数值也处于正常范围之内。 然而,PM2.5浓度却值得关注,它达到了每立方米83毫克,这是一种非常小的颗粒物,对人体健康的影响尤其明显。长时间暴露在这种环境下可能会引发呼吸道疾病或其他健康问题。因此,即使在空气质量良好的日子里,也需要注意避免长时间暴露在PM2.5浓度较高的环境中。
物件链接图
行空板显示
SIOT
问题描述
多行文字显示依然没有合适的显示控件,如果用“多行文字“ 那么字体依然不能修改,字少的时候就感觉有很大的空白区域
下一阶段,科大讯飞星火大模型2.0即将开放api测试,我在除了生成文字描述之外还可以生成相应的图片来描述天气状况,例如
此时可以配合文字写在图片上以达到图文并茂的效果
#注意:调用免费的星火大模型是有token限制的。每一次调用都需要消耗约300左右的token,所以每次调用后都会等待360秒(一小时10次)间隔大家自己掌握,有钞能力的请忽略此提示
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import random
from io import BytesIO
from PIL import Image
from DFRobot_Atmospherlum import *
from dfrobot_rp2040_sci import *
from pinpong.board import Board
from unihiker import GUI
import siot
import time
import SparkApi
#以下密钥信息从控制台获取
appid = "xxxx" #填写控制台中获取的 APPID 信息
api_secret = "xxxx" #填写控制台中获取的 APISecret 信息
api_key ="xxxx" #填写控制台中获取的 APIKey 信息
#用于配置大模型版本,默认“general/generalv2”
domain = "general" # v1.5版本
# domain = "generalv2" # v2.0版本
#云端环境的服务地址
Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat" # v1.5环境的地址
# Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat" # v2.0环境的地址
# length = 0
def getText(role,content):
jsoncon = {}
jsoncon["role"] = role
jsoncon["content"] = content
text = []
text.append(jsoncon)
return text
def getlength(text):
length = 0
for content in text:
temp = content["content"]
leng = len(temp)
length += leng
return length
def checklen(text):
while (getlength(text) > 8000):
del text[0]
return text
# 自定义函数
def getWindStr(windSpeed, windDir):
windStr = "无风"
level = 1
if (windSpeed > 0.2):
for index in range(11):
if (windSpeed > (windSpeedList[level])):
windStr = (str(level) + str("级"))
level = (level + 1)
windStr = (str((windDirDict[windDir])) + str(windStr))
return windStr
Board().begin()
siot.init(client_id="48400305158203416",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
u_gui=GUI()
siot.connect()
siot.loop()
windSpeedList = [0,0.2,1.5,3.3,5.4,7.9,10.7,13.8,17.1,20.7,24.4,28.4,32.6,36.9]
windDirDict = {"N":"北风","S":"南风","W":"西风","E":"东风","NW":"西北风", "NE":"东北风", "SW":"东南风", "SE":"西南风", "C":"无风"}
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.")
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)
siot.getsubscribe(topic="topic/AQI")
siot.getsubscribe(topic="topic/TVOC")
siot.getsubscribe(topic="topic/eCO2")
speed=u_gui.draw_text(text="无风",x=15,y=0,font_size=20, color="#0000FF")
temperature=u_gui.draw_text(text="温度:",x=15,y=30,font_size=20, color="#0000FF")
humidity=u_gui.draw_text(text="湿度:",x=15,y=60,font_size=20, color="#0000FF")
pressure=u_gui.draw_text(text="压力:",x=15,y=90,font_size=20, color="#0000FF")
aqi=u_gui.draw_text(text="AQI:",x=15,y=120,font_size=20, color="#0000FF")
tvoc=u_gui.draw_text(text="行空板",x=15,y=150,font_size=20, color="#0000FF")
eco2=u_gui.draw_text(text="eCO2",x=15,y=180,font_size=20, color="#0000FF")
pm1=u_gui.draw_text(text="PM1.0:",x=15,y=210,font_size=20, color="#0000FF")
pm25=u_gui.draw_text(text="PM2.5:",x=15,y=240,font_size=20, color="#0000FF")
pm10=u_gui.draw_text(text="PM10:",x=15,y=270,font_size=20, color="#0000FF")
while True:
wind_speed, wind_dir = yunque_i2c.get_value("speed"), (yunque_i2c.get_value("dir")
wind = getWindStr(eval(wind_speed), wind_dir)
speed.config(text=wind)
yq_temp, yu_humi, yu_pressure = yunque_i2c.get_value("Temp"), yunque_i2c.get_value("Humi"), yunque_i2c.get_value("Pressure")
temperature.config(text="温度:" + yq_temp)
humidity.config(text="湿度:" + yu_humi)
pressure.config(text="压力:" + yu_pressure)
sci_aqi, sci_tvoc, sci_eco2 = SCI1.get_value1(SCI1.eALL,"AQI"), SCI1.get_value1(SCI1.eALL,"TVOC"), SCI1.get_value1(SCI1.eALL,"TVOC")
aqi.config(text="AQI:" + sci_aqi)
tvoc.config(text="TVOC:" + sci_tvoc + " ppb")
eco2.config(text="eCO2:" + sci_eco2 + " ppm")
sci_pm1, sci_pm25, sci_pm10 = SCI1.get_value1(SCI1.eALL,"PM1.0"), str(SCI1.get_value1(SCI1.eALL,"PM2.5"), str(SCI1.get_value1(SCI1.eALL,"PM10")
pm1.config(text="PM1.0:" + sci_pm1 + " ug/m3")
pm25.config(text="PM2.5::" + sci_pm25 + " ug/m3")
pm10.config(text="PM10:" + sci_pm10 + " ug/m3")
question = "用" + wind +",温度" + yq_temp +"度,湿度" + yu_humi +"%,气压" + yu_pressure +"hpa,空气质量" + sci_aqi +",有机气态物质" + sci_tvoc +"ppb,二氧化碳浓度" + sci_eco2 +"ppm, PM2.5 " + sci_pm25 + "毫克每立方米 写一段描述"
#print(question)
question = checklen(getText("user",question))
SparkApi.answer = ""
SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
answer = SparkApi.answer
siot.publish_save(topic="siot/AQI", data=sci_aqi)
siot.publish_save(topic="siot/TVOC", data=sci_tvoc)
siot.publish_save(topic="siot/eCO2", data=sci_eco2)
siot.publish_save(topic="siot/PM", data=sci_pm1 + "," + sci_pm25 + "," + sci_pm10)
siot.publish_save(topic="siot/Speed", data=wind_speed)
siot.publish_save(topic="siot/Direction", data=wind_dir)
siot.publish_save(topic="siot/Temperature", data=yq_temp)
siot.publish_save(topic="siot/Humidity", data=yu_humi)
siot.publish_save(topic="siot/Pressure", data=yu_pressure)
if len(answer) > 0 :
print(answer)
siot.publish_save(topic="siot/realXingHuo", data=answer)
time.sleep(360)
hacker_2023.08.22
666