【项目介绍】
一、【背景介绍】
在课堂教学过程中,经常会出现教师需要定时做练习,并进行倒计时;教师有事无法及时到教室通知;教室环境较差等问题。相信解决这些问题能够让学生多注意教室内的环境,及时通风;教师解决除教学外的问题将会用更多的精力用在教学上,提高教学质量,将对教学事业有重大意义。利用主办方提供的硬件包(DHT11温湿度传感器、行空板主板、21键遥控器、红外线接收模块、带功放喇叭模块、数字传感线),通过传感器以及可视化面板进行输入,可以实现远程传递信息,显示温湿度以及倒计时操作,对教学事业提供一些便捷的地方。
该系统能实时检测室内温度湿度以及当天天气,并为教师提供便捷倒计时方式和远程发送紧急信息或延时消息的功能。
具体来说,我们可以将这个装置放在教室内,于教室距地面1.5米处,保证DHT11温湿度传感器的效果较为正确,显示在行空板主板相应位置以及时让学生,特别是夏天和冬天,自觉通风保证学生的健康。
通过21键遥控器设置倒计时时间以及开始倒计时并显示在行空板相应位置,待到达指定时间用带功放喇叭模块发出声响提醒,减少教师在教学过程中需要再添加或打开其他计时软件,将课堂的有效时间提高。
充分利用SIoT联网优势,结合行空板显示和带功放喇叭模块播报,在可视化面板进行输入,具体分紧急消息,即时发时报;延时消息针对不那么着急的消息,即在课堂上不发出声音或显示,按程序等下课时间后开始播报并显示文字。
二、【遇到的问题】
由于整个项目时间有限,有还有很多可以改进的方面,因此本文仅讲述现有的技术。
【制作过程】
步骤1 硬件准备
硬件连接:温湿度传感器、红外线接收模块、带功放喇叭模块连接行空板,行空板连接电源。
步骤2 软件准备
mind+版本:V1.8.0 RC1.0
1.行空板连接电脑待启动成功,点击连接远程终端中连接10.1.2.3连接行空板,连接成功后点击运行,等待行空板重启完成即可(编程实验过程),若用WiFi连接则要与所处底WiFi地址连接。
2.打开SIoT网页,登录账号时siot,密码dfrobot。
连接行空板上的SIoT服务器
在可视化平台输入行空板的IP,USB线连接电脑时为10.1.2.3,点击完成即连接到了行空板上的SIoT服务器。(当WiFi连接时,则要连接场景内的WiFi地址)
点击色块在平行板中增加一个方框
拉入输入框,输入信息按发送符号即发送
步骤3 SIoT服务器设置
打开http://10.1.2.3:8080/topics网址,新建主题如下:
步骤4 Mind+
1.官方库添加
2.pinpong库添加
步骤5 编程
1.初始化、变量设置、行空板屏幕内容设置模块
2.MQTT订阅
3.温湿度天气实时检测显示设置
4.倒计时遥控部分设置
4.倒计时显示部分设置
5.紧急通知部分设置
6.延时通知部分
(判断)
(执行,这里使用的方法是将上下课的时间分别列出区间,通过系统时间与区间时间的比较得出进行程序)
# -*- 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 IRRecv
from pinpong.board import DHT11
from pinpong.board import Board
from unihiker import GUI
import requests
import time
import siot
# 自定义函数
def YanShiTongZhi(TongZhiNaRong):
if ((time.strftime("%H:%M") > "12:00") and (time.strftime("%H:%M") <= "12:40")):
while not ((time.strftime("%H:%M") > "12:40")):
pass
xiaoxi.config(text=TongZhiNaRong)
xiaoxi.config(w=220)
print(TongZhiNaRong)
p_gravitysynthesis.speak(TongZhiNaRong)
elif ((time.strftime("%H:%M") > "14:00") and (time.strftime("%H:%M") <= "14:40")):
while not ((time.strftime("%H:%M") > "14:40")):
pass
xiaoxi.config(text=TongZhiNaRong)
xiaoxi.config(w=220)
print(TongZhiNaRong)
p_gravitysynthesis.speak(TongZhiNaRong)
elif ((time.strftime("%H:%M") > "15:00") and (time.strftime("%H:%M") <= "15:40")):
while not ((time.strftime("%H:%M") > "15:40")):
pass
xiaoxi.config(text=TongZhiNaRong)
xiaoxi.config(w=220)
print(TongZhiNaRong)
p_gravitysynthesis.speak(TongZhiNaRong)
elif ((time.strftime("%H:%M") > "16:00") and (time.strftime("%H:%M") <= "16:40")):
while not ((time.strftime("%H:%M") > "16:40")):
pass
xiaoxi.config(text=TongZhiNaRong)
xiaoxi.config(w=220)
print(TongZhiNaRong)
p_gravitysynthesis.speak(TongZhiNaRong)
elif ((time.strftime("%H:%M") > "17:00") and (time.strftime("%H:%M") <= "17:40")):
xiaoxi.config(text=TongZhiNaRong)
xiaoxi.config(w=220)
print(TongZhiNaRong)
p_gravitysynthesis.speak(TongZhiNaRong)
else:
xiaoxi.config(text=HuoDeXiaoXi)
xiaoxi.config(w=220)
p_gravitysynthesis.speak(HuoDeXiaoXi)
# 事件回调函数
def u_thread1_function():
global time_C
global time_S
global stop
global flag
flag = 0
time_S = 59
if (time_C == 0):
while not ((time_S <= 0)):
time_S = (time_S - 1)
timeprint.config(text=(str(((str((100 + time_C)))[1:4])) + str((str(":") + str(((str((100 + time_S)))[1:4]))))))
time.sleep(1)
else:
while not ((time_C < 0)):
time_C = (time_C - 1)
while not ((time_S <= 0)):
time_S = (time_S - 1)
timeprint.config(text=(str(((str((100 + time_C)))[1:4])) + str((str(":") + str(((str((100 + time_S)))[1:4]))))))
time.sleep(1)
flag = 1
if (flag == 1):
timeprint.config(text=(str("00") + str((str(":") + str("00")))))
p_gravitysynthesis.speak("时间到")
time_C = 0
time_S = 0
def event(data):
global time_C
global time_S
global true_1
global stop
global thread1
if (data == 0xfd10ef):
stop = 0
flag = 0
thread1=u_gui.start_thread(u_thread1_function)
if (data == 0xfd40bf):
stop = 1
if (data == 0xfd08f7):
time_C = (time_C + 1)
if (data == 0xfd8877):
time_C = (time_C + 2)
if (data == 0xfd48b7):
time_C = (time_C + 3)
if (data == 0xfd28d7):
time_C = (time_C + 4)
if (data == 0xfda857):
time_C = (time_C + 5)
if (data == 0xfd6897):
time_C = (time_C + 6)
if (data == 0xfd18e7):
time_C = (time_C + 7)
if (data == 0xfd9867):
time_C = (time_C + 8)
if (data == 0xfd58a7):
time_C = (time_C + 9)
timeprint.config(text=(str(((str((100 + time_C)))[1:4])) + str((str(":") + str(((str((100 + time_S)))[1:4]))))))
def on_message_callback(client, userdata, msg):
global HuoDeXiaoXi
if (msg.topic == "siot/班级消息"):
if (len(msg.payload.decode()) > 0):
xiaoxi.config(text=msg.payload.decode())
xiaoxi.config(w=220)
p_gravitysynthesis.speak(msg.payload.decode())
if (msg.topic == "siot/延时通知"):
HuoDeXiaoXi = msg.payload.decode()
YanShiTongZhi(HuoDeXiaoXi)
Board().begin()
u_gui=GUI()
siot.init(client_id="9982856382724157",server="192.168.43.209",port=1883,user="siot",password="dfrobot")
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
global xiaoxi
time_S = 0
time_C = 0
state_time = 0
count = 0
true_1 = 1
response_1 = requests.get("https://v0.yiketianqi.com/api?unescape=1&version=v61&appid= 47393427&appsecret= Lyekq1aA&unescape=1")
weath_1 = response_1.json()
DangQianShiJian = requests.get("http://mindplus.cc/")
XianShiShiJian = DangQianShiJian.text
stop = 0
HuoDeXiaoXi = ""
dht1 = DHT11(Pin((Pin.P22)))
xiaoxi=u_gui.draw_text(text="",x=12,y=220,font_size=13, color="#0000FF")
tongzhi=u_gui.draw_text(text="消息通知",x=70,y=170,font_size=18, color="#FF0000")
xiaoxi1=u_gui.draw_round_rect(x=10,y=210,w=220,h=100,r=5,width=2,color="#000000")
time1=u_gui.draw_text(text="倒计时",x=60,y=0,font_size=30, color="#FF0000")
timeprint=u_gui.draw_text(text="00:00",x=60,y=40,font_size=30, color="#FF0000")
temp1=u_gui.draw_text(text=(str("温度:") + str((str(dht1.temp_c()) + str("℃")))),x=20,y=100,font_size=15, color="#0000FF")
humi1=u_gui.draw_text(text=(str("湿度: ") + str(dht1.humidity())),x=20,y=130,font_size=15, color="#0000FF")
weather1=u_gui.draw_text(text=(weath_1["wea"]),x=160,y=130,font_size=15, color="#FF0000")
ir1 = IRRecv(Pin((Pin.P21)),event)
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)
siot.getsubscribe(topic="siot/班级消息")
siot.getsubscribe(topic="siot/延时通知")
global thread1
while True:
temp1.config(text=(str("温度:") + str((str(dht1.temp_c()) + str("℃")))))
humi1.config(text=(str("湿度:") + str(dht1.humidity())))
if (stop == 1):
u_gui.stop_thread(thread1)
timeprint.config(text=(str("00") + str((str(":") + str("00")))))
flag = 0
stop = 0
time_C = 0
time_S = 0
步骤6 完善成品
1.成品展示
【总结】
通过本次项目制作,能够初步入门Mind+数据可视化以及编程逻辑。由于要实现消息通知的功能,因此需要将行空板另接一个电源,开始时是用可充电电池供电,后为充电宝供电,在这过程很容易发现行空板是很耗电的。并且本作品还可以进一步的深化功能,例如,可以加入摄像头实时监控;延时消息通知不够灵活;声音提示时较小,可以用音响来取代等等。总之,这暂时还是一个不够成熟的项目,还需要继续思考其发展前景。
宗静2023.08.15
OK
宗静2023.07.29
OK
hacker_2023.07.26
666
Amos Young2023.07.20
6666
hacker_2023.07.18
666
Amos Young2023.07.17
666