基于 Raspberry Pi 构建 IoT 夜灯:Grove 光传感器接入与 Python 编程实战(IoT-For-Beginners 课程)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇技术指南出自 GitHub 精选项目IoT-For-Beginners(12 周、24 课时的物联网入门课程)第 3 课「传感器与执行器」,聚焦于在 Raspberry Pi(树莓派)单板计算机上接入 Grove 光传感器并编写 Python 程序读取环境光照,为后续用 LED 构建自动夜灯打下基础。读完本篇,你将掌握光电二极管传感器的硬件接线方法、模拟传感器与 ADC 转换原理,以及使用 Grove Python 库轮询传感器并打印光照数值的完整实操流程。
硬件准备:Grove 光传感器与光电二极管
本课使用的传感器是光传感器(light sensor),其核心元件是 光电二极管。光电二极管能够将光转换为电信号,光越强,产生的电流或电压变化越大。这是一个模拟传感器:它输出一个0 到 1,023 之间的整数值,表示相对光照量,而不是映射到 lux 这样的标准照度单位——也就是说,该读数只在同一颗传感器、同一个电路条件下具有相对比较意义。
Grove 光传感器是 Seeed Studio Grove 生态中的外部传感器模块,需要借助 Grove Base Hat(树莓派扩展帽)接入 Raspberry Pi。Grove Base Hat 插在 Pi 的 GPIO 引脚上,将 Grove 模块的 4 针接口(VCC、GND、SIG 等)统一转为易于插拔的 Grove 线缆接口,无需焊接。
传感器在课程中的定位
在本课所在的完整项目中,传感器是夜灯系统的「输入」:它负责感知物理世界的光照变化,并将信息传送给 IoT 设备。正如本课 README.md 所述,传感器是感知物理世界的硬件设备,可测量温度、按钮按压、光照、图像、加速度、声音等属性,其共同点是将感知到的物理量转换为 IoT 设备可解释的电信号。
硬件连接:将光传感器接入 Grove Base Hat 的 A0 模拟接口
连接步骤
按照 pi-sensor.md 的说明,将 Grove 光传感器连接到 Raspberry Pi,全程需要保证安全断电操作:
- 将 Grove 线缆的一端插入光传感器模块上的插座。该插座有防呆设计,只能以一个方向插入。
- 保持 Raspberry Pi 处于断电状态,将 Grove 线缆的另一端连接到 Grove Base Hat 上标有A0的模拟插座。这个插座位于 GPIO 引脚旁边那排插座的右数第二个位置。
注意:A0 属于模拟引脚。在 Grove Base Hat 中,模拟传感器必须连接到标有 A(Analog)的端口,因为该端口经过板载 ADC(模拟-数字转换器)后,才能通过 GPIO 引脚把数字信号送给 Pi。
为什么模拟传感器必须走 A0 端口:ADC 转换原理
Raspberry Pi 的 GPIO 是纯数字接口,只能处理 0 和 1,无法直接读取 1V、2.5V 这类连续模拟电压。因此 Grove Base Hat 板载了ADC(模拟-数字转换器),负责把模拟电压转换为数字量:
- 课程 README.md 中给出了一个直观示例:假设光传感器在 3.3V 供电下输出 1V,按 Seeed Grove 光传感器 0–1,023 的量程换算,1V 对应数值300;
- ADC 会把 300 转换为其二进制表示
0000000100101100,再通过 GPIO 引脚送入 Pi 处理; - 从编码角度看,这种转换完全由传感器配套库封装,开发者无需自行处理——这正是我们接下来直接调用
light属性即可拿到整数值的原因。
编程实现:读取光照值的完整 Python 代码
现在可以对设备编程了。代码文件位于仓库的 code-sensor/pi/nightlight/app.py,完整代码如下:
import time from grove.grove_light_sensor_v1_2 import GroveLightSensor light_sensor = GroveLightSensor(0) while True: light = light_sensor.light print('Light level:', light) time.sleep(1)下面按文档中的任务步骤逐步拆解这段代码的每一部分及其原理。
第一步:导入所需库
在 VS Code 中打开上一课创建的 nightlight 项目(可直接在 Pi 上运行 VS Code,或通过 Remote SSH 扩展远程连接),清空app.py后,先加入两行导入语句:
import time from grove.grove_light_sensor_v1_2 import GroveLightSensorimport time:导入 Python 标准库的time模块,稍后用于在循环末尾添加休眠,降低设备功耗;from grove.grove_light_sensor_v1_2 import GroveLightSensor:从 Grove Python 库中导入GroveLightSensor类。该库封装了与 Grove 光传感器交互的全部底层代码,在 Pi 的初始化设置阶段已被全局安装,因此无需额外安装依赖。
第二步:创建传感器实例
light_sensor = GroveLightSensor(0)这行代码创建GroveLightSensor类的实例,参数0表示连接到A0引脚——即光传感器实际插入的模拟 Grove 端口。类库内部会通过 A0 对应的 ADC 通道读取电压并转换为 0–1,023 的整数值。
第三步:无限循环轮询光照值
while True: light = light_sensor.light print('Light level:', light)light_sensor.light属性从引脚读取当前的模拟转换值,量程为0–1,023;print('Light level:', light)将读数输出到控制台。
第四步:添加一秒休眠
time.sleep(1)在循环末尾加入 1 秒休眠。光照水平不需要被持续不间断地检测,加入休眠既能避免刷屏,也能显著降低设备的功耗,这对电池供电的 IoT 设备尤为重要。该语句必须缩进在while循环体内部。
第五步:运行程序
在 VS Code 终端中执行:
python3 app.py光照值会持续输出到控制台。用手遮住再移开光传感器,数值会随之变化,典型输出如下:
pi@raspberrypi:~/nightlight $ python3 app.py Light level: 634 Light level: 634 Light level: 634 Light level: 230 Light level: 104 Light level: 290可以观察到:当手遮住传感器时(如数值 230、104),光照值明显下降;移开遮挡后(如数值 634、290),数值回升。由于该值是相对量而非 lux 绝对照度,不同光线环境下数值范围会不同,这是正常现象。
源码佐证与下一步:从传感器到完整夜灯
仓库中 code-sensor/pi/nightlight/app.py 与该指南中的代码完全一致,可作为对照参考;同目录下还提供了 Wio Terminal 版本(使用analogRead读取 A0)以及虚拟设备版本,方便不同硬件路线的学习者对照学习。
在 pi-actuator.md 中,本课继续用数字引脚D5接入 Grove LED,通过如下逻辑完成完整的夜灯:
Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off即在本段光传感器代码的基础上,导入GroveLed、创建led = GroveLed(5)实例,并在while循环内(time.sleep之前)加入if light < 300: led.on() else: led.off()的阈值判断,使 LED 在光照低于 300 时自动点亮——至此,「感知物理世界(光传感器)+ 影响物理世界(LED 执行器)」的完整 IoT 闭环便构建完成。
排障要点小结
- 数值不变化:检查 Grove 线缆是否完全插紧、是否插反(插座防呆设计下反插是插不进去的);
- 数值为 0 或异常跳变:确认传感器插在A0模拟端口而非数字端口;
- 程序报 ModuleNotFoundError:确认 Grove Python 库已在 Pi 全局安装(设置阶段完成),或尝试重新执行
pip3 install grove.py(以 Pi 环境的实际安装方式为准); - 调试期间建议保持休眠:
time.sleep(1)不仅省电,也让输出便于肉眼观察遮挡与移开时的数值变化。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考