Day8:一款无线抢答系统的实现过程

基于LoRa+蓝牙+掌控板+AppInventor方案实现的一款无线抢答系统,通过手机App下达答题命令到裁判端,再由裁判端分发命令并捕捉抢答信息。

演示视频

详见:《基于LoRa与蓝牙技术的无线抢答器》http://aciano.top/redirect/?target=http://www.bilibili.com/video/BV1jw41197UH

设计思路

详见 Day7:一款无线抢答系统的设计思路

目标实现

  • 主持人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设计

ui.png

程序编写

连接蓝牙

蓝牙连接.png
其中唯一编号为:00001101-0000-1000-8000-00805F9B34FB

发送指令

蓝牙发送.png
App端的程序十分简单,只需要连接上蓝牙后发送我们前面定义好的消息即可。

主持人掌控板端

初始化

初始化.png
首先初始化蓝牙LoRa语音合成模块

接收正确选项

在主持人手机App端,主持人会先发送正确选项到掌控板上,当掌控板上接收到正确选项后,开始抢答指令才会生效:
接收正确选项.png
掌控板蓝牙接收到AB后,便开始执行清空变量发送程序接收程序三个函数,接下来我们一个一个来慢慢讲。

这里还有一个判断,如果判断模式这个变量等于0的话就一直在屏幕上显示等待出题中...字样,因为我们上面初始化的时候已经将这个变量设为0,所以现在会一直显示。

函数:清空变量

啊这…😅这个没有什么好讲的了,就是将所有的变量设为原始值,这样做的目的是防止第二次执行程序时变量还为第一次的值,影响程序正常运行。
清空变量.png

函数:发送程序

发送程序
首先通过LoRa发送正确选项给选手端,接着进入一个循环中,重复读取蓝牙数据,

当掌控板接收到App端发出的开始抢答指令,同时也发送这个消息到选手端,然后跳出循环。

函数:接收程序

接收程序
和上面发送程序的函数一个套路,进入一个循环,同时接收蓝牙及LoRa的消息,

当选手端完成答题发送1或者0后;亦或者App端发送下一题指令后,才会跳出循环。

接着判断收到的消息,如果LoRa收到选手端发来的1,代表选手回答正确;反之,如果收到的是0,代表选手回答错误,进入完成答题函数。

如果接收到蓝牙发来的t,代表无人抢答*,主持人手动进入下一题。

*因为考虑到一种情况,即发出开始抢答指令后,可能会出现无人抢答的局面,这时程序也无法继续运行下去,所以我们设定了可以由主持人通过App端手动进入下一题。

函数:完成答题

完成答题
同时显示正确选项与选手的回答情况在掌控板屏幕上。

函数:下一题程序

下一题程序
很简单,就是发送下一题指令给选手端。

选手端

整体代码

screenshots-抢答端

这部分代码由岭南师范学院的吴兆明老师编写,我在其代码上加了一点小注释方便理解,这里不进行详细阐述了。

改进方向

  • 选手端抢答后反馈选手编号到主持人掌控板端;
    (本来测试的时候一点问题没有,一录视频这个功能就出bug了,无奈只能阉割掉...)
    
  • 统计选手得分及答题情况上物联网平台(SIoT);
  • 通过数据库随机抽题发送到选手端;
  • 加入语音合成模块,播报指令和答题情况;

End