【项目介绍】
一、【背景介绍】
随着全球气候变化和环境恶化问题日益严重,低碳环保已成为全球关注的焦点。实现低碳环保的生活方式和发展模式,对于缓解环境压力、保护生态系统具有重要意义。利用活动主办方提供的硬件包(水温传感器、水TDS传感器、空气温湿度传感器、氧气传感器、空气质量传感器、土壤湿度传感器、分贝传感器、环境光传感器、行空板、SCI采集模块),通过传感器联动控制,可以实现植物生长的智能化管理,提高植物苗期的生长质量和成活率,同时也为低碳环保事业贡献一份力量。
该系统能够实时监测植物生长所需的温度、湿度、光照强度、空气质量以及土壤湿度等参数,并通过数据分析技术为植物提供最佳的生长环境。
具体来说,我们可以将水温传感器安装在水箱中,用于实时监测水温,并控制加热和降温设备,以保证水温在植物生长所需的范围内。同时,水TDS传感器可以检测水中的溶解物质含量,从而判断水的质量是否符合植物的要求。如果水质不佳,系统会及时发出警报并进行处理。
空气温湿度传感器可以检测空气中的温度和湿度,从而精准控制环境温湿度,并自动开启或关闭空气加湿设备。氧气传感器可以检测室内氧气含量,避免植物缺氧或二氧化碳过高的情况。空气质量传感器可以检测室内空气中有害物质含量,并自动开启或关闭空气净化器。
土壤湿度传感器可以实时检测植物生长介质中的湿度,根据植物所需的水分量,自动调节灌溉设备。分贝传感器可以检测室内噪音水平,保证植物能够在安静的环境中生长。环境光传感器可以检测室内光照强度,自动调节灯光设备,保证植物得到足够的光照。
二、【遇到的问题】
因为缺少一些配套的硬件,只是在理论上实现一些效果,所以本作品主要讲了数据采集。
【制作过程】
步骤1 硬件准备
硬件连接:分贝传感器、光线传感器、氧气传感器、温湿度传感器接到SCI,SCI接到行空板,TDS传感器、空气质量传感器、水温传感器、土壤湿度传感器和摄像头连接到行空板,行空板连接到电脑。
如图:
步骤2 软件准备
Mind+1.8.0版本SIoT V2版本
下载链接:
1.腾讯微云下载(推荐): 链接: https://share.weiyun.com/6SFhgLQj
阿里云盘下载:
链接:https://www.aliyundrive.com/s/BXPfB9TpjEn
提取码: 49vj百度云盘下载:
链接:https://pan.baidu.com/s/1vjb8phx8wUf0BiLlEQV9oQ?pwd=mind
提取码:mind
行空板上默认内置的是SIoT V1,而Mind+可视化平台需要使用SIoT V2,因此需要先进行升级。
升级方法:
1.下载升级文件:升级行空板SIOTV2.mp
2.打开Mind+,在项目中打开上一步下载的升级行空板SIOTV2.mp文件。
3.行空板连接电脑待启动完成,点击连接远程终端中选择10.1.2.3连接行空板,连接成功之后点击运行,等待行空板重启完成即可。
4.此时打开行空板上的SIOT网页,按Ctrl+F5刷新页面,可以看到界面已经SIOTV2了,登录账号是siot,密码dfrobot。
连接行空板上的SIoT服务器
在可视化平台上输入行空板的IP,USB线连接电脑时为10.1.2.3,点击完成即连接到了行空板上的SIoT服务器。
开关按钮选择Topic为siot/测试,按钮开启发送on,关闭发送off
步骤3 SIoT服务器设置
打开http://10.1.2.3:8080/topics网址,新建主题如下:
步骤4 Mind+扩展设置
1.官方库添加
2.pinpong库添加
3.用户库添加
步骤5 编程
1.初始化
2.MQTT订阅
3.天气预报部分设置
本部分借鉴了[教程]【行空板图形化Python入门教程】第15课:天气助手请移步学习。
用自己的账号登录,地址改为兰山,主要变成如下:
4.变量设置
5.天气预报内容获取设置
6.传感器数据获取设置
7.摄像头图传设置
8.其他设置
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import base64
from io import BytesIO
from PIL import Image
from pinpong.libs.dfrobot_ens160 import Ens160
from pinpong.libs.dfrobot_tds import TDS
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from pinpong.board import DS18B20
from dfrobot_rp2040_sci import *
from pinpong.board import Board
from pinpong.board import Pin
import requests
import siot
import time
import cv2
Board().begin()
siot.init(client_id="8901479492667037",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
siot.connect()
siot.loop()
p_p21_analog=Pin(Pin.P21, Pin.ANALOG)
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.")
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()):
pass
p_ens160 = Ens160(0x52)
p_ens160.set_pwr_mode(p_ens160.ENS160_STANDARD_MODE)
p_ens160.set_temp_hum(27, 67)
tds1 = TDS(Pin((Pin.P22)))
ds1 = DS18B20(Pin((Pin.P24)))
siot.getsubscribe(topic="siot/天气情况")
siot.getsubscribe(topic="siot/实时温度")
siot.getsubscribe(topic="siot/最高温度")
siot.getsubscribe(topic="siot/最低温度")
siot.getsubscribe(topic="siot/湿度")
siot.getsubscribe(topic="siot/风向")
siot.getsubscribe(topic="siot/风力")
siot.getsubscribe(topic="siot/风速")
siot.getsubscribe(topic="siot/空气质量")
siot.getsubscribe(topic="siot/气压")
siot.getsubscribe(topic="siot/摄像头")
siot.getsubscribe(topic="siot/SHT31温度")
siot.getsubscribe(topic="siot/SHT31湿度")
siot.getsubscribe(topic="siot/ENS160二氧化碳")
siot.getsubscribe(topic="siot/氧气传感")
siot.getsubscribe(topic="siot/ENS160TVOC")
siot.getsubscribe(topic="siot/ENS160空气质量")
siot.getsubscribe(topic="siot/水温传感")
siot.getsubscribe(topic="siot/TDS传感")
siot.getsubscribe(topic="siot/土壤湿度")
siot.getsubscribe(topic="siot/分贝传感")
siot.getsubscribe(topic="siot/环境光")
siot.getsubscribe(topic="siot/学校公告栏")
siot.getsubscribe(topic="siot/值班教干")
siot.getsubscribe(topic="siot/联系电话")
siot.getsubscribe(topic="siot/日期")
siot.getsubscribe(topic="siot/星期")
siot.getsubscribe(topic="siot/时间")
siot.getsubscribe(topic="siot/传感器")
siot.getsubscribe(topic="siot/检修时间")
url = (str("https://www.yiketianqi.com/free/day?appid=29988737&appsecret=Jipy6ZPN&unescape=1&city=") + str("兰山"))
response = requests.get(url)
data = response.json()
while True:
ShuiWen = ds1.temp_c()
TDS = tds1.get_value()
SHT31WenDu = SCI1.get_value1(SCI1.eALL,"Temp_Air")
SHT31ShiDu = SCI1.get_value1(SCI1.eALL,"Humi_Air")
YangQi = SCI1.get_value1(SCI1.eALL,"O2")
ENS160CO2 = p_ens160.get_eco2()
ENS160TVOC = p_ens160.get_tvoc()
ENS160KongQiZhiLiang = p_ens160.get_aqi()
TuRangShiDu = p_p21_analog.read_analog()
FenBei = SCI1.get_value1(SCI1.eALL,"Sound")
HuanJingGuang = SCI1.get_value1(SCI1.eALL,"Light")
siot.publish(topic="siot/天气情况", data=(str("天气情况: ") + str((data["wea"]))))
siot.publish(topic="siot/实时温度", data=(str((str("实时温度: ") + str((data["tem"])))) + str("°C")))
siot.publish(topic="siot/最高温度", data=(str("最高温度: ") + str((str((data["tem_day"])) + str("°C")))))
siot.publish(topic="siot/最低温度", data=(str("最低温度: ") + str((str((data["tem_night"])) + str("°C")))))
siot.publish(topic="siot/湿度", data=(str("空气湿度: ") + str((data["humidity"]))))
siot.publish(topic="siot/风向", data=(str("风向: ") + str((data["win"]))))
siot.publish(topic="siot/风力", data=(str("风力: ") + str((data["win_speed"]))))
siot.publish(topic="siot/风速", data=(str("风速: ") + str((data["win_meter"]))))
siot.publish(topic="siot/空气质量", data=(str("空气质量: ") + str((data["air"]))))
siot.publish(topic="siot/气压", data=(str("气压: ") + str((data["pressure"]))))
siot.publish(topic="siot/日期", data=(data["date"]))
siot.publish(topic="siot/星期", data=(data["week"]))
siot.publish(topic="siot/时间", data=(data["update_time"]))
siot.publish_save(topic="siot/SHT31温度", data=SHT31WenDu)
siot.publish_save(topic="siot/SHT31湿度", data=SHT31ShiDu)
siot.publish_save(topic="siot/氧气传感", data=YangQi)
siot.publish_save(topic="siot/ENS160二氧化碳", data=ENS160CO2)
siot.publish_save(topic="siot/ENS160TVOC", data=ENS160TVOC)
siot.publish_save(topic="siot/ENS160空气质量", data=ENS160KongQiZhiLiang)
siot.publish_save(topic="siot/水温传感", data=ShuiWen)
siot.publish_save(topic="siot/TDS传感", data=TDS)
siot.publish_save(topic="siot/土壤湿度", data=TuRangShiDu)
siot.publish_save(topic="siot/分贝传感", data=FenBei)
siot.publish_save(topic="siot/环境光", data=HuanJingGuang)
ret, grab = vd.read()
siot.publish(topic="siot/摄像头", data=base642base64(grab))
siot.publish_save(topic="siot/值班教干", data=(str("值班人员:") + str("王二麻子")))
siot.publish_save(topic="siot/联系电话", data=(str("联系电话:") + str("13900000000")))
siot.publish_save(topic="siot/学校公告栏", data="今天下午5点全体员工到会议室集合开会")
siot.publish_save(topic="siot/检修时间", data="2023年6月29日")
siot.publish_save(topic="siot/传感器", data="水温传感器安装在水箱中,用于实时监测水温,并控制加热和降温设备,以保证水温在植物生长所需的范围内。TDS传感器可以检测水中的溶解物质含量,从而判断水的质量是否符合植物的要求,如果水质不佳及时发出警报并进行处理。空气温湿度传感器可以检测空气中的温湿度,从而精确控制环境温湿度,并自动开启或者关闭空气加湿设备;氧气传感器可以检测室内氧气含量,避免植物缺氧或者二氧化碳过高的情况;空气质量传感器可以检测室内空气的质量,并自动开启或者关闭空气净化器;土壤湿度传感器可以实时监测植物生长介质的湿度,根据植物所需的水份量,自动调节灌溉设备;分贝传感器可以检测室内噪音水品,保证植物能够在安静的环境中生长;环境光传感器可以检测室内光照强度,自动调节灯光设备,保证植物得到足够的光照。")
步骤6 可视化大屏设置
可视化大屏布局如下图:
背景用的是网络图片进行了PS。
【效果展示】
效果用录屏实现的
【总结】
通过本次作品制作,已经能熟练的使用SCI和Mind+数据可视化,确实是神器啊。由于传感器比较多,SCI和行空板预留接口有限,所以直接引出I2C,利用面包板进行了扩展,运行了几天,偶尔SCI有卡死,但是我感觉可能杜邦线连接不牢固问题,后来用交代粘牢后,没有再出现卡死现象。本作品主要是数据采集方面的运用,数据采集后如何运用实现自动化,后续需要大量时间来采集信息,例如不同植物对环境要求不一样,就得根据具体情况进行预警设置和自动化。
【资源】
花生编程2023.08.18
赞赞赞
花生编程2023.08.18
厉害
fablab于奇思2023.08.15
你好,请问这个实时画面是怎么获取的呢?
feng05392024.09.11
摄像头
三春牛-创客2023.08.14
赞赞赞赞
三春牛-创客2023.08.14
厉害
猪猪12322023.07.22
学习中
hacker_2023.07.16
666
腿毛利小五郎2023.07.04
这个界面好霸气
winn1232023.07.31
6666
winn1232023.07.31
666
winn1232023.07.31
6666