一、项目介绍
每年的8月23日前后,太阳到达黄经150°时是二十四节气的处暑。
处暑是反映气温变化的一个节气。
“处”含有躲藏、终止意思,“处暑”表示炎热暑天结束了。
太空探索永无止境,
某年8月22日,云雀天宫空间站投入使用。
为了保证中国宇航员的安全,
空间站实现无人值守环境监测系统,
检测实验舱土壤水分,统计回收空间站水量多少,
对空间站核心舱的温度、湿度、噪音、压强监测等功能。
今天分享一下《云雀天宫物联可视化系统》
二、项目介绍实现功能
1.云雀气象仪测量核心舱的温度、湿度、气压,
2.RGB灯带点亮数目映射反映空间站噪音的大小,
3.雨量传感器检测实验舱水分搜集的多少,
4.土壤传感器检测实验舱植物土壤中水分,
5.行空板检测核心舱噪音的大小。
三、制作过程
(1)升级行空板SIoTV2,
1.升级行空板siotv2参照我的帖子,
2.测试SIOTV2。账号:siot , 密码:dfrobot
3.进入siot界面,新建气象相关主题
4.行空板网络设置,保证行空板WiFi与电脑WiFi在同一个网段,在实时显示相关数据。
(记录下WiFi状态下IP地址:192.168.58.212, 为编程做准备)。
(2)编写程序
步骤1 步骤1 打开mind+1.8.0,窗口右上角,选择python模式,点击左下角“扩展”,在官方库中找到“行空板”、"MQTT-PY"
步骤2 右下角点击左下角“扩展”,在pingpong库中添加pingpong、WS2812 RGB灯
步骤3 在Mind+右下角点击左下角“扩展”,在用户库中添加 SCI、云雀气象仪、雨量模块
步骤4 程序编写
1.程序初始化
2.将相关参数发送MQTT服务器中
3.设置变量,核心舱噪音值映射灯带
4.通过电脑远程桌面,输入IP地址:10.1.2.3,登陆进入。
远程访问行空板效果图
步骤5 设置可视化面板
4.打开Mind+1.8.0,在顶部菜单栏点击进入可视化面板,进入弹出新窗口
5.点击新建项目,选择新建空白项目,输入项目名称和描述后点击确认即可新建一个项目,点击编辑即可进入面板编辑页面。
6.进入页面后会弹出提示选择数据源,连接行空板上的SIoT V2,则ip可以填写行空板的ip。其他设置保持默认,确认后会提示连接成功。
7.添加相关数据组件,绑定相关气象主题Topic
8.云雀天宫物联可视化面板
(3)进入siot界面,分析相关参数
(4)云雀天宫空间站模型制作
安装梦天、问天实验舱
安装梦天、问天实验舱
安装天和核心舱及天舟货运舱
安装天和核心舱及天舟货运舱
安装神舟载人飞船
安装各舱体连接件,在瓶盖上钻孔用螺丝固定
各舱合体
舱体安装太阳能电池板
云雀天宫空间站模型
四、总结
《云雀天宫物联可视化系统》项目基本可以实现功能
1.云雀气象仪测量核心舱的温度、湿度、气压,
2.RGB灯带点亮数目映射反映空间站噪音的大小,
3.雨量传感器检测实验舱水分搜集的多少,
4.土壤传感器检测实验舱植物土壤中水分,
5.行空板检测核心舱噪音的大小。
由于时间有限,将来该项目可以加入语音合成模块,让项目自动播放的功能,同时,项目添加摄像头实时查看空间站的噪音、雨水量等信息。
五、资源
附件
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from DFRobot_Atmospherlum import *
from pinpong.board import NeoPixel
from dfrobot_rp2040_sci import *
from pinpong.board import Board
from unihiker import Audio
from unihiker import GUI
import math
import siot
import time
def numberMap(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
Board().begin()
u_gui=GUI()
siot.init(client_id="24809568021678974",server="192.168.58.212",port=1883,user="siot",password="dfrobot")
u_audio = Audio()
siot.connect()
siot.loop()
np1 = NeoPixel(Pin((Pin.P0)),7)
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)
u_gui.fill_round_rect(x=10,y=10,w=220,h=40,r=5,color="#FFFF00")
aa=u_gui.draw_text(text="云雀天宫物联系统",x=20,y=15,font_size=18, color="#FF0000")
u_gui.fill_round_rect(x=10,y=60,w=220,h=28,r=5,color="#FF6600")
tr=u_gui.draw_text(text="土壤湿度",x=20,y=60,font_size=15, color="#0000FF")
u_gui.fill_round_rect(x=10,y=90,w=220,h=28,r=5,color="#FF6600")
yl=u_gui.draw_text(text="雨 量",x=20,y=90,font_size=15, color="#000000")
u_gui.fill_round_rect(x=10,y=120,w=220,h=28,r=5,color="#FF6600")
wd=u_gui.draw_text(text="温 度",x=20,y=120,font_size=15, color="#0000FF")
u_gui.fill_round_rect(x=10,y=150,w=220,h=28,r=5,color="#FF6600")
sd=u_gui.draw_text(text="湿 度",x=20,y=150,font_size=15, color="#000000")
u_gui.fill_round_rect(x=10,y=180,w=220,h=28,r=5,color="#FF6600")
qy=u_gui.draw_text(text="气 压",x=20,y=180,font_size=15, color="#0000FF")
u_gui.fill_round_rect(x=10,y=210,w=220,h=28,r=5,color="#FF6600")
sy=u_gui.draw_text(text="声 音",x=20,y=210,font_size=15, color="#000000")
u_gui.fill_round_rect(x=10,y=240,w=220,h=28,r=5,color="#FF6600")
time=u_gui.draw_text(text="更新时间:",x=20,y=240,font_size=15, color="#FFFFFF")
u_gui.fill_round_rect(x=10,y=270,w=220,h=28,r=5,color="#FF6600")
time1=u_gui.draw_text(text=" ",x=20,y=270,font_size=14, color="#0000FF")
siot.getsubscribe(topic="siot/yuliang")
siot.getsubscribe(topic="siot/turang")
siot.getsubscribe(topic="siot/shidu")
siot.getsubscribe(topic="siot/wendu")
siot.getsubscribe(topic="siot/qiya")
siot.getsubscribe(topic="siot/sy")
siot.publish_save(topic="siot/yuliang", data="hello")
siot.publish_save(topic="siot/turang", data="hello")
siot.publish_save(topic="siot/shidu", data="hello")
siot.publish_save(topic="siot/wendu", data="hello")
siot.publish_save(topic="siot/qiya", data="hello")
siot.publish_save(topic="siot/sy", data="hello")
QianDengShu = 0
while True:
TuRangShiDu = SCI1.get_value0("Moisture")
YuLiang = SCI1.get_value0("Rainfall")
QiYa = (yunque_i2c.get_value("Pressure"))
ShiDu = (yunque_i2c.get_value("Humi"))
WenDu = (yunque_i2c.get_value("Temp"))
GengXinShiJian = (yunque_i2c.get_time_stamp())
ShengYin = (int(u_audio.sound_level()))
XianDengShu = (numberMap(ShengYin, 0, 80, 0, 6))
XianDengShu = (math.floor(XianDengShu))
print(XianDengShu)
if (QianDengShu < XianDengShu):
np1.range_color(0,XianDengShu,0xFF0000)
elif (QianDengShu > XianDengShu):
np1.range_color((XianDengShu + 1),QianDengShu,0x000000)
elif (XianDengShu == 0):
np1.range_color(0,0,0x000000)
QianDengShu = XianDengShu
tr.config(text=(str((str("土壤湿度 :") + str(TuRangShiDu))) + str(SCI1.get_unit1(SCI1.eALL,"Moisture"))))
yl.config(text=(str((str("雨 量 :") + str(YuLiang))) + str(SCI1.get_unit1(SCI1.eALL,"Rainfall"))))
wd.config(text=(str("温 度 :") + str((str(WenDu) + str((yunque_i2c.get_unit("Temp")))))))
sd.config(text=(str("湿 度 :") + str((str(ShiDu) + str((yunque_i2c.get_unit("Humi")))))))
qy.config(text=(str("气 压 :") + str((str(QiYa) + str((yunque_i2c.get_unit("Pressure")))))))
time1.config(text=GengXinShiJian)
sy.config(text=(str("声 音 :") + str((str(ShengYin) + str("dB")))))
siot.publish_save(topic="siot/turang", data=(str(TuRangShiDu)))
siot.publish_save(topic="siot/yuliang", data=(str(YuLiang)))
siot.publish_save(topic="siot/wendu", data=(str(WenDu)))
siot.publish_save(topic="siot/shidu", data=(str(ShiDu)))
siot.publish_save(topic="siot/qiya", data=(str(QiYa)))
siot.publish_save(topic="siot/sy", data=(str(ShengYin)))
hacker_2023.08.28
666