【项目背景】
在教学环境中,老师和同学们都希望生活在一个舒适整洁的环境,但在经过实际考察发现,教室卫生角的卫生情况并不好,不仅清洁工具乱摆乱放,还有部分卫生工具因未及时处理而导致滋生细菌或发霉发臭。因此,我们收集了相关数据和资料,决定制作一个智能劳动工具收纳装置,该项目有多位老师、学生和技术人员的创新实践,将会在收纳卫生工具,并及时处理拖把积水问题上发挥极大的作用。
本次项目利用主办方提供的各种硬件和技术进行智能劳动工具收纳装置的改造,兼有提醒当天值日的学生,并对该天使用的卫生工具进行分类回收及监督管理的功能,既能够激励学生养成回收工具的习惯,也减轻了班主任卫生工具检查的负担。
具体来说,产品采用干湿分离的方式分类回收卫生工具,其中在湿区有风扇促进空气流通;有排水装置及时清理拖把水。产品装置可以放在卫生角墙体处,便于学生察看当日值日生姓名;碰撞传感器的使用信息显示在行空板主板相应位置以及时让学生查看拖把归位情况。每次归位,都会有相应的语言合成模块进行夸奖,以激励学生自觉养成良好的行为习惯。同时,每日的值日信息也会同步至班主任的手机,侧面督促学生回收卫生工具。
【制作过程】
步骤1 硬件准备
步骤2 软件准备
1、下载Mind+
2、 打开mind+,行空板连接电脑待启动完成,点击连接远程终端中选择10.1.2.3连接行空板
3、连接行空板上的SIoT服务器,在可视化平台上输入行空板的IP,USB线连接电脑时为10.1.2.3,点击完成即连接到了行空板上的SIoT服务器。
步骤3 SIoT服务器设置
打开http://10.1.2.3:8080/topics网址,新建主题拖把
步骤4 Mind+扩展设置
进行库的导入,加载官方的行空板、MQTT、语音合成和pinpong库初始化
1.官方库添加
2.pinpong库添加
步骤5 编程
1、初始化
2、行空板显示界面设计

3、MQTT订阅及发布

4、变量设置
5、碰撞传感器、语音合成执行程序编写

6、值日生根据日期变更程序编写
7、手机端发送消息及合成语音程序编写
8、程序测试
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.libs.dfrobot_speech_synthesis import DFRobot_SpeechSynthesis_I2C
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from pinpong.board import Board
from unihiker import GUI
import datetime
import siot
import time
# 事件回调函数
def on_message_callback(client, userdata, msg):
if (msg.topic == "Kn-oLhj4g"):
if (len(msg.payload.decode()) > 0):
tongzhi.config(text=msg.payload.decode())
tongzhi.config(w=200)
p_gravitysynthesis.speak(msg.payload.decode())
Board().begin()
u_gui=GUI()
siot.init(client_id="07490837503563608",server="iot.dfrobot.com.cn",port=1883,user="L0SRk2unR",password="L0IgkhunRz")
siot.connect()
siot.loop()
p_p21_in=Pin(Pin.P21, Pin.IN)
p_p22_in=Pin(Pin.P22, Pin.IN)
p_p23_in=Pin(Pin.P23, Pin.IN)
siot.set_callback(on_message_callback)
p_gravitysynthesis = DFRobot_SpeechSynthesis_I2C()
p_gravitysynthesis.begin(p_gravitysynthesis.V2)
p_gravitysynthesis.set_voice(9)
p_gravitysynthesis.set_speed(5)
p_gravitysynthesis.set_tone(5)
p_gravitysynthesis.set_sound_type(p_gravitysynthesis.MALE2)
XingMing = ["杨乐天","李四"]
XueHao = 0
GengXin = 0
GengXin1 = 0
GengXin2 = 0
flag = 0
old_month = datetime.datetime.now().month
oldtime = datetime.datetime.now().day
time=u_gui.draw_text(text=(str("日期:") + str(time.strftime("%Y-%m-%d"))),x=20,y=10,font_size=15, color="#009900")
name=u_gui.draw_text(text=(str("值日生:") + str((XingMing[XueHao]))),x=20,y=40,font_size=20, color="#000099")
button1=u_gui.draw_text(text="①拖把未归位",x=35,y=75,font_size=18, color="#000000")
button2=u_gui.draw_text(text="②拖把未归位",x=35,y=105,font_size=18, color="#000000")
button3=u_gui.draw_text(text="③拖把未归位",x=35,y=135,font_size=18, color="#000000")
xiaoxitongzhi=u_gui.draw_text(text="消息通知",x=70,y=170,font_size=18, color="#FF0000")
xiaoxikuang=u_gui.draw_round_rect(x=10,y=210,w=220,h=100,r=5,width=2,color="#FF0000")
tongzhi=u_gui.draw_text(text="无消息",x=20,y=215,font_size=15, color="#0000FF")
# 拖把归位订阅号
siot.getsubscribe(topic="kX9gz2ung")
# 消息通知
siot.getsubscribe(topic="Kn-oLhj4g")
siot.publish(topic="kX9gz2ung", data=(str("值日生:") + str((XingMing[XueHao]))))
while True:
new_month = datetime.datetime.now().month
newtime = datetime.datetime.now().day
if (not (p_p21_in.read_digital()==True)):
if (GengXin == 0):
GengXin = 1
name.config(text=(str("值日生:") + str((XingMing[XueHao]))))
button1.config(text="①拖把已归位")
siot.publish(topic="kX9gz2ung", data="①拖把已归位")
p_gravitysynthesis.speak("1号拖把已归位,给你点赞!")
flag = 0
else:
GengXin = 0
button1.config(text="①拖把未归位")
if (flag == 0):
siot.publish(topic="kX9gz2ung", data="①拖把未归位")
flag = 1
if (not (p_p22_in.read_digital()==True)):
if (GengXin1 == 0):
GengXin1 = 1
name.config(text=(str("值日生:") + str((XingMing[XueHao]))))
button2.config(text="②拖把已归位")
siot.publish(topic="kX9gz2ung", data="②拖把已归位")
p_gravitysynthesis.speak("2号拖把已归位,给你点赞!")
flag = 0
else:
GengXin1 = 0
button2.config(text="②拖把未归位")
if (flag == 0):
siot.publish(topic="kX9gz2ung", data="②拖把未归位")
flag = 1
if (not (p_p23_in.read_digital()==True)):
if (GengXin2 == 0):
GengXin2 = 1
name.config(text=(str("值日生:") + str((XingMing[XueHao]))))
button3.config(text="③拖把已归位")
siot.publish(topic="kX9gz2ung", data="③拖把已归位")
p_gravitysynthesis.speak("3号拖把已归位,给你点赞!")
flag = 0
else:
GengXin2 = 0
button3.config(text="③拖把未归位")
if (flag == 0):
siot.publish(topic="kX9gz2ung", data="③拖把未归位")
flag = 1
if (oldtime < newtime):
XueHao = (XueHao + 1)
oldtime = newtime
else:
if (old_month < new_month):
XueHao = (XueHao + 1)
old_month = new_month
步骤6 整体外观设计
1、框架结构搭建


2、结构美化


3、行空板和传感器安装

4、成品展示

【项目总结】
本次项目历时3天完成,部分功能因耗能太大逐渐精简,能够使项目能更有效的为学生和老师服务,但项目的占地较大,不太适合于教室阳台使用,未来我们将考虑把装置嵌入墙体,实现既能收纳也能节省空间。其次,项目中用于空气流通的风扇也会在未来经过数据收集和整理,考虑其存在的必要性。
通过本次作品制作,我们了解到行空板及相关传感器的使用方式和代码书写逻辑,也从逐步从项目构思到制成项目作品,实现了阳台卫生工具的收纳和监督,并从行为学角度激励学生从日常的点滴小事中培养良好的行为习惯。总之,本次项目收获多多,但依旧有待改进,还需继续思考完善。
宗静2023.08.11
OK
hacker_2023.08.10
666
MaNia2023.07.28
有想法