实验03:读一个按钮
这个实验做完你会得到什么
按下接在板子上的按钮,手机上立刻显示「按下」并把计数加一;松开显示「松开」。
前两篇都是手机→板子(写),这一篇是板子→手机(读)。所有传感器实验都是这个方向, 套路完全一样:订阅 → 等事件 → 处理数据。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 30 分钟 |
| 前置 | 实验01:板载 LED 闪烁 |
改编自 MIT 官方教程 App Inventor + IoT: Button,扩展改用本站本地文件。 完成品工程:Arduino101Button.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | |
| Seeed Grove 扩展板 | 1 | 非必需 |
| Grove 按钮模块 | 1 |
二、接线
按钮模块插在 Grove 扩展板的 D4 接口。
不用 Grove 板的话:按钮一脚接 D4,另一脚接 GND(模块版内部已有上拉电阻,裸按钮建议 另接一个 10kΩ 上拉到 5V,否则读数会飘)。
固件:.ino 里把 BUTTON 设为 ENABLED,其余 DISABLED,上传。
三、界面组件
在实验01 的连接界面基础上加:
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 标签 | 标签_按钮状态 |
字号 32、居中,文本「–」 |
| 标签 | 标签_计数 |
文本「按下次数:0」 |
| 按钮 | 按钮_清零 |
文本「计数清零」 |
| Arduino101Button | Arduino101Button1 |
不可见,BluetoothDevice = BluetoothLE1、Pin = 4 |
Pin填 4,对应 Grove 板上印的D4。只填数字,不要写D4。
四、分步搭代码块
第 1 步:连上就订阅按钮状态
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接,按一下试试"
Arduino101Button1.RequestButtonStateUpdates()
}
中途验证:状态标签更新。此时按按钮还没反应,正常 —— 订阅了但还没写处理逻辑。
第 2 步:按下 / 松开分别响应
Arduino101Button 提供了两个现成的事件,比自己判断数值省事:
global 次数 = 0
when Arduino101Button1.Pressed() {
标签_按钮状态.Text = "按下"
标签_按钮状态.TextColor = "&HFF43A047"
global 次数 = 次数 + 1
标签_计数.Text = join("按下次数:", 次数)
}
when Arduino101Button1.Released() {
标签_按钮状态.Text = "松开"
标签_按钮状态.TextColor = "&HFF757575"
}
中途验证:按住按钮显示绿色「按下」且计数加一,松开变灰色「松开」。
Pressed/Released是语义事件,组件内部已经帮你判断了电平。 想拿原始值就用下面这个。
第 3 步:看原始数值(可选)
when Arduino101Button1.ButtonStateReceived(Button_State) {
标签_状态.Text = join("原始值:", Button_State)
}
中途验证:按下和松开时原始值在 0 和 1 之间切换。
具体哪个值代表按下,取决于模块的接法(是否上拉)。不要猜,按一下看一眼, 然后再写判断。这也是为什么优先用
Pressed/Released—— 不用管这件事。
第 4 步:清零与收尾
when 按钮_清零.Click() {
global 次数 = 0
标签_计数.Text = "按下次数:0"
}
when BluetoothLE1.Disconnected() {
标签_状态.Text = "已断开"
}
when Screen1.BackPressed() {
Arduino101Button1.StopButtonStateUpdates()
BluetoothLE1.Disconnect()
}
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 连上了但按键没反应 | ① 没调 RequestButtonStateUpdates(订阅是必须的,不是可选);② Pin 不是 4,或写成了 D4;③ 固件里 BUTTON 没设 ENABLED |
| 按钮模块插错口 | Grove 板上每个插座都印着编号,Pin=4 就得插 D4 |
| 数值一直不变 | 模块没插稳;或用了裸按钮但没接上拉电阻 |
| 一按计数跳好几下 | 机械按钮抖动。用计时器记录上次触发时刻,间隔小于 200 毫秒的忽略 |
Pressed 和 Released 反了 |
接法导致电平相反。改用 ButtonStateReceived 自己判断,或把按钮的另一脚改接 VCC |
| 断开后再连收不到数据 | 订阅是连接级的,断开就失效。确保订阅写在 Connected 事件里 |
六、下一步
- 实验04:温湿度传感器 —— 从开关量到连续数值
- 实验08:加速度计 —— 板载六轴,不用接线
相关文档
- Arduino101Button 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_Button.pdf
扫码添加客服咨询