Day8:一款无线抢答系统的实现过程
Day8:一款无线抢答系统的实现过程
Aciano基于LoRa+蓝牙+掌控板+AppInventor方案实现的一款无线抢答系统,通过手机App下达答题命令到裁判端,再由裁判端分发命令并捕捉抢答信息。
演示视频
详见:《基于LoRa与蓝牙技术的无线抢答器》http://aciano.top/redirect/?target=http://www.bilibili.com/video/BV1jw41197UH
设计思路
目标实现
主持人App端可以通过蓝牙与掌控板通讯;
主持人掌控板端可以通过LoRa发出指令;
两个选手端可以通过LoRa发送消息确定抢答方;
选手端自动判断选手回答正确与否;
选手端自动统计选手得分;
消息定义
因为使用了LoRa与蓝牙进行通讯,所以我们需要定义消息,用来判断程序该做什么:
蓝牙接收
s(115)开始抢答 发送C
t(116)下一题 发送D
A(65) 发送正确选项 发送A
B(66) 发送正确选项 发送B
LoRa接收
1(49)选手回答正确
0(48)选手回答错误
a(97)选手1抢答成功
b(98)选手2抢答成功
主持人App端
UI设计
程序编写
连接蓝牙
其中唯一编号为:00001101-0000-1000-8000-00805F9B34FB
发送指令
App端的程序十分简单,只需要连接上蓝牙后发送我们前面定义好的消息即可。
主持人掌控板端
初始化
首先初始化蓝牙
,LoRa
与语音合成模块
接收正确选项
在主持人手机App端,主持人会先发送正确选项到掌控板上,当掌控板上接收到正确选项后,开始抢答指令才会生效:
掌控板蓝牙接收到A
或B
后,便开始执行清空变量
,发送程序
与接收程序
三个函数,接下来我们一个一个来慢慢讲。
这里还有一个判断,如果判断模式
这个变量等于0的话就一直在屏幕上显示等待出题中...
字样,因为我们上面初始化的时候已经将这个变量设为0,所以现在会一直显示。
函数:清空变量
啊这…😅这个没有什么好讲的了,就是将所有的变量设为原始值,这样做的目的是防止第二次执行程序时变量还为第一次的值,影响程序正常运行。
函数:发送程序
首先通过LoRa发送正确选项给选手端,接着进入一个循环中,重复读取蓝牙数据,
当掌控板接收到App端发出的开始抢答
指令,同时也发送这个消息到选手端,然后跳出循环。
函数:接收程序
和上面发送程序的函数一个套路,进入一个循环,同时接收蓝牙及LoRa的消息,
当选手端完成答题发送1
或者0
后;亦或者App端发送下一题
指令后,才会跳出循环。
接着判断收到的消息,如果LoRa收到选手端发来的1
,代表选手回答正确;反之,如果收到的是0
,代表选手回答错误,进入完成答题
函数。
如果接收到蓝牙发来的t
,代表无人抢答*,主持人手动进入下一题。
*因为考虑到一种情况,即发出开始抢答指令后,可能会出现无人抢答的局面,这时程序也无法继续运行下去,所以我们设定了可以由主持人通过App端手动进入下一题。
函数:完成答题
同时显示正确选项与选手的回答情况在掌控板屏幕上。
函数:下一题程序
很简单,就是发送下一题指令给选手端。
选手端
整体代码
这部分代码由岭南师范学院的吴兆明老师编写,我在其代码上加了一点小注释方便理解,这里不进行详细阐述了。
改进方向
- 选手端抢答后反馈选手编号到主持人掌控板端;
(本来测试的时候一点问题没有,一录视频这个功能就出bug了,无奈只能阉割掉...)
- 统计选手得分及答题情况上物联网平台(SIoT);
- 通过数据库随机抽题发送到选手端;
- 加入语音合成模块,播报指令和答题情况;