Arduino 101 实验03 - 读一个按钮,数据从板子推到手机

« 返回 Arduino101 平台  IoT 专题

实验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 = BluetoothLE1Pin = 4

Pin4,对应 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 毫秒的忽略
PressedReleased 反了 接法导致电平相反。改用 ButtonStateReceived 自己判断,或把按钮的另一脚改接 VCC
断开后再连收不到数据 订阅是连接级的,断开就失效。确保订阅写在 Connected 事件里

六、下一步


相关文档

文档反馈