Arduino 101 实验05 - 光照传感器,做一个自动小夜灯

« 返回 Arduino101 平台  IoT 专题

实验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_SENSORLED 都设为 ENABLED,其余 DISABLED。

这一篇要同时用两个模块,是唯一需要开两项的实验。其余实验按各自篇里说的只开一项。


三、界面组件

组件 命名 关键属性
标签 标签_光强 字号 40、粗体,文本「–」
标签 标签_明暗 字号 20,文本「等待数据」
滑动条 滑动条_阈值 最小值 0、最大值 800、初始 200
标签 标签_阈值 文本「阈值:200」
Arduino101LightSensor Arduino101LightSensor1 不可见,BluetoothDevice = BluetoothLE1Pin = 1
Arduino101Led Arduino101Led1 不可见,BluetoothDevice = BluetoothLE1Pin = 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

六、下一步


相关文档

文档反馈