物联网、人工智能以及机器学习在近几年中一直是最重要的趋势之一。其中物联网一直以惊人的速度发展,从用智能手机控制的智能恒温器到装有数百个传感器的先进无人驾驶汽车,从某种意义上来说改变了人类的生活形态。
近日,看到DFRobot新出了MIND+1.8测试版,增加了可视化面板组件,倍感兴奋。通过参加“玩转数据可视化-打造属于自己的物联网大屏”的培训,我也迫不及待的想试试,于是从角落里再次拿出吃灰已久的行空板,开始尝试做一块自己定制版的”物联网大屏“。
设计构思:
本轮比赛的主题为智慧校园可视化数据平台,之前在参观省移动公司的时候,看到过智慧校园可视化数据平台的例子,科技感十足,效果令人震撼,印象深刻。但考虑到自己手头的硬件和自身技术水平,我想结合我们学校”开心农场“来制作一个”智慧校园开心农场“的可视化数据平台。可以实时显示声音、光线、温湿度、水分等,还可以通过摄像头实时显示植物的情况。可以通过物联网大屏来给校园”开心农场“的大棚蔬菜实现灯光、通风、浇水等控制。
智慧校园“开心农场“可视化数据平台界面组件和布局设计效果:
硬件连接展示:
程序运行后效果展示:
通过测试后发现可以实现以下功能 :
1.利用鼠标点击灯开关按钮实现对LED灯的打开和关闭。
2.利用鼠标点击排气扇开和关单选按钮实现对风扇的开和关的操作。
3.折线统计图表可以实时显示当前音量值和环境光亮度值。
4.土壤湿度检测指针可以实时显示当前土地湿度数值。
5. 屏幕中央的时钟组件可以实时显示当前时间。
6.屏幕右上角可以显示摄像头画面,模拟监控图像实现远程对植物的监控。
7.屏幕右下角可以实时显示日历。
制作体会:
经过测试发现MIND+1.8中的数据可视化面板功能非常强大。虽然实际使用中发现还有一些需要改进的地方,但已经非常值得赞扬了。相信后续推出的版本中会逐渐更新得更加强大易用!
为了让可视化数据平台的界面更具科技感,我上网找了一些相关的背景图片,使用PS自己进行了一些修改,还制作加入了一些透明背景的灯光、风扇、土壤水分等的图标,力求让界面更具科技感。测试成功后,自己还真有一点点小得意呢!不过,我制作的这个可视化界面的功能还很简单,和专业的物联网大数据可视化界面与功能相比,还只是小儿科。下一步,我将会进一步完善。
制作反思及下一步待实现的功能:
1.当水份值小于某个数值时,自动启动水泵实现对”开心农场“的智慧化浇灌。
2.当鼠标移动到某个组件上能,能语音播放相关组件的数据。
3.添加更多的显示组件和传感器数据。
4.美化可视化数据大屏的界面,进一步完善物联网功能。
以下是程序截图:
# -*- 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 unihiker import Audio
import siot
import cv2
# 事件回调函数
def on_message_callback(client, userdata, msg):
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)
if (msg.payload.decode() == (str("1"))):
p_p23_out=Pin(Pin.P23, Pin.OUT)
p_p23_out.write_digital(1)
if (msg.payload.decode() == (str("2"))):
p_p23_out=Pin(Pin.P23, Pin.OUT)
p_p23_out.write_digital(0)
if (msg.payload.decode() == (str("Jon"))):
p_p24_out=Pin(Pin.P24, Pin.OUT)
p_p24_out.write_digital(1)
if (msg.payload.decode() == (str("Joff"))):
p_p24_out=Pin(Pin.P24, Pin.OUT)
p_p24_out.write_digital(0)
siot.init(client_id="486047238250674",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
u_audio = Audio()
Board().begin()
siot.connect()
siot.loop()
p_p21_analog=Pin(Pin.P21, Pin.ANALOG)
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("摄像头初始完成")
siot.getsubscribe(topic="siot/行空板")
siot.getsubscribe(topic="siot/声音光线值")
siot.getsubscribe(topic="siot/摄像头")
siot.getsubscribe(topic="topic/水分值")
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=p_p21_analog.read_analog())
x0mJha8Hx6eO2023.10.25
附件导入不了 大佬能指点一下吗
花生编程2023.08.01
赞赞赞赞赞
花生编程2023.08.01
厉害厉害
三春牛-创客2023.07.29
赞赞赞赞赞
三春牛-创客2023.07.29
不错不错