[AI2+IoT]《数据采集和分析》- 项目一:给我发消息之Part 4
本帖最后由 szjuliet 于 2025-2-24 15:27 编辑# 项目一:给我发消息之Part 4
## 制作 猜7秒 游戏App
**猜7秒** 游戏使用 Microbit 向移动App发送消息。本课我们要处理附带了数据的消息。那什么是数据?
> 数据:物体、人(甚至宠物!)在现实世界的值。
在第 1 课中,我们将物联网(IoT)定义为一种收集现实世界中事物数据的策略。在物联网中,传感器可以发送有关降雨量、阳光、热量、运动或磁场强度的数据,以帮助理解和解决现实世界中的问题。人们利用物联网数据来改善农业、保护濒危动物、建造更安全的房屋、节约能源以及完成许多其他任务。
**猜7秒 游戏**:Microbit 能够精确计时,那你呢?玩 **猜7秒** 游戏来比试比试!
完成后的App是这样:

* App顶部的各个按钮用来与Microbit进行蓝牙连接
* 中间部分是游戏指南
* 下方的seconds标签用来显示从Microbit发送的数据,即玩家按下Microbit上的按钮的反应时间。
## 一、从这里开始
### 1. 获取 App Inventor 的初始代码。
* 该代码可让你快速将 **猜7秒** App连接到 Microbit。
* 找到老师提供的文件(Seven_Seconds_STARTER.aia)或在包含本课程的文件夹中找到的文件。 (请在文末下载附件)
* 将文件下载到电脑。注意保存文件的位置。
* 进入 App Inventor AI2 界面设计和逻辑设计界面(http://ai2.appinventor.mit.edu)。
* 从电脑中导入文件。
### 2. 查看“猜7秒”App的界面设计。
你能找到显示玩家反应时间(以秒为单位)的标签组件吗?

**这个标签组件有什么作用?猜猜各个组件的功能是什么。**

* 手机下方两个非可视组件都是App Inventor的外部扩展,为了更清楚组件的用途进行了重命名,原始组件的名字是:
* BluetoothLE1
* Microbit_Uart_Simple1
### 3. 在 App Inventor 中点击“Blocks(逻辑设计)”按钮查看初始代码。

* 这6组代码块设置了所有蓝牙功能,如扫描和连接。这些代码块被折叠了,你可以双击代码块查看折叠的内容。
*添加一个事件代码块,在Microbit收到消息时响应。使其以秒为单位显示数值。
### 4. 如何编写代码以接收玩家数据?
* 还记得在“Message Me Back”(给我回消息)App(Part 3)中用于接收消息的代码块吗?将相同的代码块拖入你的代码中。
* 编写代码,然后对照下面的代码看看你的编写成果。
* 你的任务是使用 **reactionTimeDataLabel** 标签组件来显示玩家的反应时间。还记得如何在 App Inventor 中更新标签的文本吗?
* 另一个提示:玩家的反应时间会从 Microbit 发送到App。你只需以正确的格式显示该值即可。

**你编写的代码是不是和上图一样?不错!*几乎* 全对了……在设置标签之前,来自 Microbit 的数据需要进行一些特殊处理。具体见下文**:
* 你从“MicrobitDataChannel”抽屉里拖入了 **<font class="text-color-14" color="#ffc107">when MicrobitDataChannel.MessageReceived</font>** 代码块吗?对!这个代码块会等待新消息传达到App。
* 你拖入了 **<font class="text-color-9" color="#009688">set reactionTimeDataLabel.Text</font>** 代码块吗?太棒了!你希望App显示玩家的反应时间。
* 如果你在 **<font class="text-color-9" color="#009688">set messageReceivedDataLabel.Text</font>** 中添加了 **<font class="text-color-1" color="#f44336">取消息</font>** 代码块,离成功就差一点点!唯一的问题是 **<font class="text-color-1" color="#f44336">消息</font>** 不会以秒为单位。

**1 秒 = 1000 毫秒**
* 来自 Microbit 的数据将在几毫秒内到达你的App。如何将消息数据转换为秒?使用一个数学代码块通过代码展示你的最佳猜测,接下来检查你编写的程序。

* 当来自 Microbit 的新消息传入时,通过除以 1000 将变量 **<font class="text-color-1" color="#f44336">消息</font>** 的单位从毫秒转换为秒。现在该值将在App中以秒为单位显示。
* App已准备就绪。在测试之前完成 Microbit 代码!
* 提示:请在浏览器中同时打开 Microbit MakeCode 和 App Inventor 选项卡。你需要在两者之间来回切换以修改代码。
## 二、编写 Microbit 代码以发送玩家数据
### 1. 获取 猜7秒 游戏的 Microbit MakeCode。
* 找到老师提供的文件(microbit-Seven_Seconds_STARTER.hex)或在包含本课程的文件夹中找到该文件。(请在文末的附件中下载)
* 按照之前课程中的相同步骤在 makecode.microbit.org 导入代码。(重要提示:如果使用的是比 V2 版本更早的 Microbit,如Part 0_准备文档中所述,请转至 *https://makecode.microbit.org/v4* )
### 2. 查看代码。

* 当玩家按下 A 键时,代码块 **<font class="text-color-6" color="#2196f3">显示图标</font>** 会呈现出一个棋盘图案:。很简单对吧!
* 但是为什么这个代码块会将变量 **<font class="text-color-1" color="#f44336">start</font>** 设置为一个叫做 **<font class="text-color-2" color="#e91e63">运行时间(ms)</font>** 的值呢?
**计算机只知道运行时间Running Time**

像 Microbit 这样的小型计算机在断电后无法保持时间。
每次 Microbit 开机时,计算机都认为时间是 0 毫秒(ms)。
每次 Microbit 唤醒时,它都会从 0 毫秒、1 毫秒、2 毫秒、3 毫秒……开始计数。

“生日快乐,我已经17ms大了”
### 3. 与你的团队讨论:在游戏里,Microbit 是如何使用运行时间的?
* 可以这样想:运行时间是记录已用时间的一种方式。
* 已用时间是两个事件之间的时间差:

用较晚发生的事件(按钮 B)的时间减去较早发生的事件(按钮 A)的时间就是已用时间:

* 上图中,从按钮 A 到按钮 B 所经过的时间为 6978 毫秒(44189 - 37211),约为 7 秒。玩家距离赢得 7 秒游戏仅差 22 毫秒!
* 你知道在 Microbit 代码中这是如何实现的吗?
**再看一下代码:**
* 当玩家按下 A 按钮时,Microbit 会将当前运行时间保存到变量 **<font class="text-color-1" color="#f44336">start</font>**中。
* 当玩家按下 B 按钮时,Microbit 会用新的当前运行时间减去之前的 **<font class="text-color-1" color="#f44336">start</font>**时间,并将结果设置到变量 **<font class="text-color-1" color="#f44336">elapsed</font>**中。

### 4. 将包含玩家数据的消息发送到你的App。
* 如何把数据发送到App?
* 你还记得那个用于发送消息的代码块抽屉吗?
* 你使用此代码块发送了一个字符串——一个单词或一个字母。

* 玩家数据将会是类似 130 或 2356 这样的消息。这是字符串数据类型还是数字数据类型?
* 在 **<font class="text-color-51" color="#2196f3">蓝牙</font>** 抽屉下方打开抽屉 **<font class="text-color-6" color="#2196f3">…更多</font>** 。 (如有需要,请查看Part 3 详细说明)寻找一个发送数字数据类型的代码块:

* 你即将完成 Microbit 代码。为了展示玩家与 7 秒的接近程度,请使用Starter中提供的代码块,从玩家的用时中减去 7 秒。

* 为什么代码块要从已用时间中减去 7000?如果游戏是猜 7 秒,为什么不直接用 7 ?
* 请注意,玩家的反应时间可能是正数也可能是负数。(你可能还没有接触过负数!)在测试过程中,想想负数对玩家反应时间意味着什么。
## 三、将你的“7 Seconds”代码烧录到 micro:bit 中。
* 按照 Part0 准备材料中“为学生团队设置 micro:bit”的说明,将新代码下载(或“烧录”)到你的 micro:bit 中。

* 使用电池、USB 或电源适配器为 micro:bit 供电。
## 四、将App加载到 AI伴侣 中
* 将7 Seconds App加载到设备上的 AI伴侣 中。

## 五、将 Microbit 连接到App
* 如Part 1 所示,通过蓝牙将 App Inventor 和 Microbit 连接起来。(在App中点击“扫描”,在列表中找到你的 Microbit,然后点击“连接”。)


## 六、按照App中的说明玩 猜7秒 游戏
* 你的反应时间能多接近 7 秒?这取决于你的心情吗?这取决于一天中的时间吗?
* 当玩家超过 7 秒时,反应时间在App中是如何显示的?当玩家少于 7 秒时,又是如何显示的?为什么?
* 能否在 App Inventor 代码中而不是 Microbit 代码中计算已用时间?这两个计算出来的已用时间有不同吗?为什么? (译注:实际编程试一下看看有没有不同,是否和你的推理一致)
## 七、进一步的编程挑战:
* 如果游戏不是固定在 7 秒,那该怎么办?如何在 App Inventor 中使用滑块将目标时间更改为任何值?
* 如何始终将反应时间显示为正数,无论玩家是少于还是超过 7 秒?
* 如何使用 CloudDB 记录每个玩家的最高分?
页:
[1]