回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

行空板M10扩展板项目—“快乐狗”可视化门禁系统 简单

头像 于恺 2025.07.02 15 0

“快乐狗”可视化门禁系统,代表一只快乐的小狗帮助主人看护货物,让自己人进入家中。

人们购物所买的东西,因为家中无人一般会将快递放置门口,时常会有快递丢失或者快递小哥放错位置的情况,设计一款智慧快递柜,能够在远程查看快递是否到达,而且开启快递柜门,让快递小哥将快递放入柜中,防止被别人拿走,他人盗窃。主人可以实时查看门口情况,并给快递小哥打开快递柜。

1png.png

当家中老人儿童出门忘带钥匙,因此需要回家给老师和孩子送钥匙开门,但是成年人都需要上班,工作地点离家里不一定近,所以采用远程开门就可以让老人和孩子顺利进入家中。

2].png

该项目主要测试扩展板的舵机控制能力及电池续航,因为前面制作了3个项目后一直没有充电,所以这次在使用中没有电了,用舵机对电压要求比较高,最终接上外接电源还是可以用的。行空板有了2个舵机接口,省去了接口转接的过程,非常的棒。

先用SIOT制作物联网服务,这次使用的主题一个是视频监控,一个远程控制命令,这次使用的5275的新版本IOT,看是7月4日更新的,估计会更加稳定。添加topic名为camera(传输视频图像),第二个topic为news(传输指令)。

5ed29324d7c55549c05d39f91be32e7d.png

首先对行空板进行初始化,初始化物联网连接属性、初始化舵机接口、初始化摄像头设备、设计系统界面,订阅命令消息。

image.png

设置发送摄像头信息

image.png

设置命令,当接收到“dooropen”开门;接收到“doorclose”关门;接收到“on”开快递柜;接收到“off"关快递柜,这些都是由舵机角度进行控制的。

image.png

然后设计可视化界面,一共使用了四个按钮和一个网络图片模块,效果如下图。

CD3520D59902D9447ED903EFD005B424.png

开门按钮发送指令设置的topic为news,发送内容为dooropen;关门按钮设置发送内容为doorclose;开快递柜内容为open;关快递柜内容为off。

image.png

代码如下:

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
import cv2
import siot
from unihiker import GUI
from pinpong.board import Servo
from pinpong.board import Board
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
import base64
from io import BytesIO
from PIL import Image

# 事件回调函数
def u_thread1_function():
    while True:
        if vd.grab():
            ret, grab = vd.read()
            siot.publish_save(topic="siot/camera", data=base642base64(grab))
        else:
            print("没有下一帧")
def on_message_callback(client, userdata, msg):
    if (msg.payload.decode() == (str("dooropen"))):
        servo1.write_angle(90)
        t2.config(text="门已开")
    else:
        if (msg.payload.decode() == (str("doorclose"))):
            servo1.write_angle(0)
            t2.config(text="门已关")
        else:
            if (msg.payload.decode() == (str("on"))):
                servo2.write_angle(90)
                t2.config(text="快递柜已开")
            else:
                if (msg.payload.decode() == (str("off"))):
                    servo2.write_angle(0)
                    t2.config(text="快递柜已关")
                else:
                    pass


siot.init(client_id="14118991178544893",server="192.168.0.107",port=1883,user="siot",password="dfrobot")
Board().begin()
u_gui=GUI()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
servo1 = Servo(Pin((Pin.P0)))
servo2 = Servo(Pin((Pin.P3)))

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(0)
t0=u_gui.draw_text(text="“快乐狗”",x=20,y=20,font_size=25, color="#FF0000")
t1=u_gui.draw_text(text="可视化门禁系统",x=0,y=50,font_size=25, color="#FF0000")
t2=u_gui.draw_text(text="",x=50,y=80,font_size=20, color="#0000FF")
while not (vd.isOpened()):
    print("摄像头初始化中……")
thread1=u_gui.start_thread(u_thread1_function)
siot.getsubscribe(topic="siot/news")
while True:
    pass

评论

user-avatar