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

当家中老人儿童出门忘带钥匙,因此需要回家给老师和孩子送钥匙开门,但是成年人都需要上班,工作地点离家里不一定近,所以采用远程开门就可以让老人和孩子顺利进入家中。
![2].png](https://makelogimg.dfrobot.com.cn/makelog/5ae081a3cd4e023fd2f5fef8/06b04ff9a994a2d41ebee85d120a4b8a.png)
该项目主要测试扩展板的舵机控制能力及电池续航,因为前面制作了3个项目后一直没有充电,所以这次在使用中没有电了,用舵机对电压要求比较高,最终接上外接电源还是可以用的。行空板有了2个舵机接口,省去了接口转接的过程,非常的棒。

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

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

设置发送摄像头信息

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

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

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

代码如下:
# -*- 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
评论