实验07:接近传感器与非接触开关
这个实验做完你会得到什么
手在传感器上方一挥,手机上的数字跳变并触发一次动作(弹提示 / 变色 / 计数), 手拿开恢复 —— 一个不用碰的开关。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 30 分钟 |
| 前置 | 实验05:光照传感器 |
改编自 MIT 官方教程 App Inventor + IoT: Proximity Sensor。 完成品工程:Arduino101ProximitySensor.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | |
| Seeed Grove 扩展板 | 1 | |
| Grove 接近传感器 | 1 | 插 A0 插座 |
二、接线(⚠️ 这一篇最大的坑)
传感器插在 Grove 扩展板的 A0 插座,代码里 Pin 一般填 0(只填数字,不写 A)。
⚠️ 但有一种线序的模块要填 1。官方教程的原话是:如果你的传感器线长成教程图里那样, 黄色信号线实际接到的是 A1 而不是 A0,这时
Pin要填1。填错的表现是连得上、订阅成功、但数字永远不动 —— 最难查的那种问题,因为哪里都不报错。 拿不准就 0 和 1 各试一次,数字会动的那个就是对的,十秒钟的事。
固件:.ino 里把 PROXIMITY 设为 ENABLED,其余 DISABLED。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 标签 | 标签_距离 |
字号 40、粗体,文本「–」 |
| 标签 | 标签_触发 |
字号 20,文本「等待」 |
| 标签 | 标签_次数 |
文本「触发次数:0」 |
| 滑动条 | 滑动条_阈值 |
最小值 0、最大值 500、初始 100 |
| Arduino101ProximitySensor | Arduino101ProximitySensor1 |
不可见,BluetoothDevice = BluetoothLE1、Pin = 0(部分线序的模块要填 1,见第二节) |
四、分步搭代码块
第 1 步:订阅并看数值
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接,把手放上去试试"
Arduino101ProximitySensor1.RequestProximityUpdates()
}
when Arduino101ProximitySensor1.ProximityReceived(proximity) {
标签_距离.Text = round(proximity)
}
中途验证:这一步是接线坑的检验点 —— 手在传感器上方来回移动,数字必须有变化。
一动不动就把 Pin 在 0 和 1 之间换一个再试(见第二节)。
数值是相对接近度,不是厘米。越近数值越大(或越小,取决于模块型号)。 先手动比划几下,记下”有手”和”没手”两种情况各是多少。
第 2 步:过阈值就触发一次
global 阈值 = 100
global 已触发 = false
global 次数 = 0
when 滑动条_阈值.PositionChanged(thumbPosition) {
global 阈值 = round(thumbPosition)
标签_状态.Text = join("阈值:", 阈值)
}
when Arduino101ProximitySensor1.ProximityReceived(proximity) {
标签_距离.Text = round(proximity)
if proximity > 阈值 and not 已触发 {
global 已触发 = true
global 次数 = 次数 + 1
标签_触发.Text = "检测到!"
标签_触发.TextColor = "&HFF43A047"
标签_次数.Text = join("触发次数:", 次数)
} else if proximity <= 阈值 and 已触发 {
global 已触发 = false
标签_触发.Text = "等待"
标签_触发.TextColor = "&HFF757575"
}
}
中途验证:手放上去触发一次、计数加一;手拿开恢复「等待」;手一直放着不会连续计数。
已触发这个标志是边沿检测 —— 只在「从没有到有」那一刻动作一次。 不加的话,手放着不动的每一次数据推送都会计一次数,一秒钟加好几十。这个模式在实验05(小夜灯)里也用过,硬件交互里到处都是它。
第 3 步:收尾
when Screen1.BackPressed() {
Arduino101ProximitySensor1.StopProximityUpdates()
BluetoothLE1.Disconnect()
}
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 连上了、订阅了,但数字纹丝不动 | Pin 填错了。0 和 1 各试一次(见第二节:部分线序的模块黄线落在 A1) |
| 收不到任何数据 | 没订阅;或固件 PROXIMITY 没 ENABLED |
| 手放上去数字反而变小 | 模块型号不同,方向相反。判断改成 < 阈值即可 |
| 手不动却反复触发 | 少了 已触发 边沿标志;或数值在阈值附近抖,把阈值挪开一点 |
| 触发不灵敏 | 阈值定得太高。先记录”有手/没手”的实测值,取中间 |
| 数值受环境光影响 | 红外型接近传感器会受强光干扰,避开阳光直射和白炽灯 |
六、下一步
- 实验08:板载加速度计 —— 不用接线的板载六轴
- 实验09:PWM 电机 —— 开始驱动会动的东西
相关文档
- Arduino101ProximitySensor 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_Proximity_Sensor.pdf
扫码添加客服咨询