一、项目背景
家里没有好一点的鱼缸,孩子特别喜欢养鱼,于是从网上买了一个小鱼缸以及一些小鱼。起初还好好的,一天过去后小鱼陆陆续续走向生命的尽头。我一脸无奈加悲伤,又添了几分罪孽...
鱼缸一般有增氧系统、排污系统、换水系统,可是这样的小鱼缸加这样的东西非常不方便。为了解决增氧问题,无意间发现了鲶鱼效应,于是根据这个思路想自己制作一个,让小鱼不在悠闲,而是加速游动,这样可以解决缺氧的问题。说干就干,利用这次“物联网创新应用专项挑战赛”,制作一个小型鱼缸鲶鱼效应养鱼可视化系统。
二、项目思路
1. mind+1.8 模拟环境监测大屏。
2.SIOT2.0物联网平台,存储和物联通信,转发消息。
3.项目共设计了大屏数据监测、鱼缸实时图像监控、鱼缸补光及鲶鱼效应惊吓等组成。
三、项目步骤
1、使用电子模块
行空板 ×1
SCI采集模块 ×1
ENS160 空气质量传感器 ×1
环境光传感器 ×1
防水温度传感器 ×1
温湿度传感器 ×1
LED灯 ×1
电池盒(9V) ×1
摄像头(带USB线) ×1
直流电机驱动模块 ×1
小电机 ×1
3pin线及4pin连接线 若干
2、连接行空板电路
3、设置SIOT服务器
利用行空板自带的SIot,设计了以下的数据:
程序运行后上传到SIOT服务器的数据有
还可以通过大屏系统的按钮开关控制LED灯的亮与灭,以及小电机的旋转。
4、数据大屏监控系统设计
5、图形化编程积木程序
四、效果及其改进方向
本人通过录屏及拍摄视频的方式还原该系统的效果,并做了点修改上传至B站,敬请各位观看。
本人做的该系统中缺少鱼缸中水的含氧量,水清澈程度的监测,在一定程度上缺乏掌握全面的鱼儿生长的环境。应该加入水溶解氧浓度的监测,水质监测等等。
五、其他补充资料
python代码如下
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import base64
from io import BytesIO
from PIL import Image
from pinpong.board import DS18B20
from dfrobot_rp2040_sci import *
from pinpong.board import DHT11
from pinpong.board import Board
from pinpong.board import Pin
from unihiker import GUI
import math
import time
import siot
import cv2
# 事件回调函数
def on_message_callback(client, userdata, msg):
aq.config(text=(str(msg.topic) + str(msg.payload.decode())))
if (msg.topic == "siot/LED"):
if (msg.payload.decode() == "on"):
pin3.write_analog(255)
elif (msg.payload.decode() == "off"):
pin3.write_analog(0)
if (msg.topic == "siot/电机"):
if (msg.payload.decode() == "on"):
pin4.write_analog(255)
time.sleep(10)
pin4.write_analog(0)
def u_thread1_function():
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 True:
ret, grab = vd.read()
siot.publish(topic="siot/video", data=base642base64(grab))
if cv2.waitKey(20) & 0xff== 27:
break
siot.init(client_id="4181806564474069",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
Board().begin()
u_gui=GUI()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
pin1 = Pin(22)
ds1 = DS18B20(pin1)
pin2 = Pin(24)
dht1 = DHT11(pin2)
# pin3 LED灯
pin3 = Pin(23, Pin.PWM)
pin4 = Pin(21, Pin.PWM)
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.")
siot.getsubscribe(topic="siot/电机")
siot.getsubscribe(topic="siot/LED")
thread1=u_gui.start_thread(u_thread1_function)
aq=u_gui.draw_text(text="行空板",x=0,y=0,font_size=20, color="#0000FF")
while True:
AQI = (int(SCI1.get_value0("AQI")))
if (AQI < 50):
siot.publish_save(topic="siot/空气质量指数", data="优")
elif (AQI < 100):
siot.publish_save(topic="siot/空气质量指数", data="良好")
else:
siot.publish_save(topic="siot/空气质量指数", data="受污染")
siot.publish_save(topic="siot/水温", data=ds1.temp_c())
siot.publish_save(topic="siot/光照", data=SCI1.get_value0("Light"))
siot.publish_save(topic="siot/温湿度", data=(str(dht1.temp_c()) + str((str(",") + str(dht1.humidity())))))
time.sleep(2)
hacker_2023.08.30
666
hacker_2023.08.30
66