Arduino 101 实验07 - 接近传感器,做一个非接触开关

« 返回 Arduino101 平台  IoT 专题

实验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 = BluetoothLE1Pin = 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
手放上去数字反而变小 模块型号不同,方向相反。判断改成 < 阈值即可
手不动却反复触发 少了 已触发 边沿标志;或数值在阈值附近抖,把阈值挪开一点
触发不灵敏 阈值定得太高。先记录”有手/没手”的实测值,取中间
数值受环境光影响 红外型接近传感器会受强光干扰,避开阳光直射和白炽灯

六、下一步


相关文档

文档反馈