实验05:光照传感器与自动小夜灯
这个实验做完你会得到什么
手机上实时显示光照强度;用手遮住传感器,LED 自动亮起来;拿开手,LED 熄灭。
这是第一个模拟传感器(前面的按钮、DHT 都走数字口),也是第一次把 「读传感器」和「控执行器」串成一个自动化闭环。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 35 分钟 |
| 前置 | 实验02:LED 调光、实验04:温湿度 |
改编自 MIT 官方教程 App Inventor + IoT: Light Sensor。 完成品工程:Arduino101LightSensor.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | |
| Seeed Grove 扩展板 | 1 | |
| Grove 光照传感器 | 1 | 插 A1 |
| Grove LED 模块 | 1 | 插 D5,做小夜灯用 |
二、接线
| 模块 | Grove 接口 | 代码里的 Pin |
|---|---|---|
| 光照传感器 | A1 | 1 |
| LED | D5 | 5 |
固件:.ino 里把 LIGHT_SENSOR 和 LED 都设为 ENABLED,其余 DISABLED。
这一篇要同时用两个模块,是唯一需要开两项的实验。其余实验按各自篇里说的只开一项。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 标签 | 标签_光强 |
字号 40、粗体,文本「–」 |
| 标签 | 标签_明暗 |
字号 20,文本「等待数据」 |
| 滑动条 | 滑动条_阈值 |
最小值 0、最大值 800、初始 200 |
| 标签 | 标签_阈值 |
文本「阈值:200」 |
| Arduino101LightSensor | Arduino101LightSensor1 |
不可见,BluetoothDevice = BluetoothLE1、Pin = 1 |
| Arduino101Led | Arduino101Led1 |
不可见,BluetoothDevice = BluetoothLE1、Pin = 5 |
四、分步搭代码块
第 1 步:订阅光照数据
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接,遮一下传感器试试"
Arduino101LightSensor1.RequestLightSensorUpdates()
}
第 2 步:显示光强并判断明暗
global 阈值 = 200
when Arduino101LightSensor1.LightSensorDataReceived(intensity) {
标签_光强.Text = round(intensity)
if intensity < 阈值 {
标签_明暗.Text = "暗"
标签_明暗.TextColor = "&HFF1E88E5"
} else {
标签_明暗.Text = "亮"
标签_明暗.TextColor = "&HFFEF6C00"
}
}
中途验证:数字随环境光变化 —— 用手遮住变小,拿台灯照变大。 先记下你房间里”亮”和”暗”分别是多少,下一步的阈值要按这个来定。
光照传感器输出的是相对值,不是标准的勒克斯(lux)。不同模块、不同批次的量程都不一样, 所以文档里给的阈值只是起点,必须按你自己的实测值调。
第 3 步:阈值可调,并联动 LED
global 阈值 = 200
global 灯亮着 = false
when 滑动条_阈值.PositionChanged(thumbPosition) {
global 阈值 = round(thumbPosition)
标签_阈值.Text = join("阈值:", 阈值)
}
when Arduino101LightSensor1.LightSensorDataReceived(intensity) {
标签_光强.Text = round(intensity)
if intensity < 阈值 and not 灯亮着 {
Arduino101Led1.TurnOn()
global 灯亮着 = true
标签_明暗.Text = "暗 → 已开灯"
} else if intensity >= 阈值 and 灯亮着 {
Arduino101Led1.TurnOff()
global 灯亮着 = false
标签_明暗.Text = "亮 → 已关灯"
}
}
中途验证:拖阈值滑动条到当前光强附近,用手遮住传感器 —— LED 亮;拿开 —— LED 灭。
and not 灯亮着这个判断很关键:不加的话,只要环境是暗的,每来一次数据就发一次TurnOn,一秒好几条 BLE 指令把通道塞满。只在状态真正切换时才发指令。光强正好在阈值附近时会来回抖(一会儿开一会儿关)。想彻底解决要做滞回: 低于 180 才开、高于 220 才关,中间留一段死区。
第 4 步:收尾
when Screen1.BackPressed() {
Arduino101LightSensor1.StopLightSensorUpdates()
Arduino101Led1.TurnOff()
BluetoothLE1.Disconnect()
}
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 收不到数据 | ① 没订阅;② Pin 填成了 A1,应该只填数字 1;③ 固件里 LIGHT_SENSOR 没 ENABLED |
| 数值一直是 0 或不变 | 模块插在了 D 口。光照是模拟传感器,必须插 A 口 |
| 遮住了但灯不亮 | 阈值设得比”暗”的读数还低。先看第 2 步记下的实测值再定阈值 |
| 灯疯狂闪 | 光强在阈值附近抖动。加滞回(开/关用两个不同阈值),或加大滤波 |
| LED 没反应但光照有数据 | 固件里 LED 那项没同时 ENABLED;或 LED 的 Pin 不是 5 |
| 数字跳动厉害 | 用一阶低通滤一下:global 平滑 = 平滑 * 0.7 + intensity * 0.3 |
六、下一步
- 实验06:土壤湿度 —— 同样是模拟量,做一个浇水提醒
- 实验07:接近传感器 —— 有一个 PDF 明写的接线坑
相关文档
- Arduino101LightSensor 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_Light_Sensor.pdf
扫码添加客服咨询