符柏铖 发表于 2022-5-2 22:28:45

基于LoRa+蓝牙+掌控板+AppInventor方案的无线抢答系统

本帖最后由 符柏铖 于 2022-5-2 22:35 编辑

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


# 演示视频



http://www.bilibili.com/video/BV1jw41197UH




# 设计思路

详见 (http://amnesia-f.github.io/posts/997c/)


# 目标实现

- 主持人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);
- [ ] 通过数据库随机抽题发送到选手端;
- 加入语音合成模块,播报指令和答题情况;

# End

rzyzzxw 发表于 2022-5-6 17:02:53

赞一下。
页: [1]
查看完整版本: 基于LoRa+蓝牙+掌控板+AppInventor方案的无线抢答系统