在 Raspberry Pi 上用 Grove 光传感器构建智能小夜灯:硬件接线、Python 轮询与 ADC 原理实战(IoT-For-Beginners 第 3 课)
2026/9/17 21:01:39 网站建设 项目流程

在 Raspberry Pi 上用 Grove 光传感器构建智能小夜灯:硬件接线、Python 轮询与 ADC 原理实战(IoT-For-Beginners 第 3 课)

【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners

导读

本篇文章基于开源课程项目 IoT-For-Beginners 第 3 课(传感器与执行器)的 Raspberry Pi 分支文档,完整讲解如何在树莓派上接入一个 Grove 模拟光传感器:从 Grove 线缆与 Grove Base Hat 的 A0 模拟插槽接线,到用 Grove Python 库编写app.py轮询光照强度并在控制台输出读数。读完本文,你将掌握 Grove 生态中模拟传感器的接线规范、GroveLightSensor驱动的标准用法,以及模拟信号经 ADC 转成 0~1023 数字量的底层原理,为后续用光传感器驱动 LED 完成一个完整的小夜灯项目打下基础。

本篇在课程中的定位

IoT-For-Beginners 第 3 课《与物理世界交互:传感器与执行器》的教学目标是让读者先为 IoT 设备添加一个光传感器,再添加一个由光照控制的 LED,最终拼装出一个"小夜灯(nightlight)"。课程为不同硬件提供了三条分支路线,见 第 3 课 README:

  • Arduino(Wio Terminal)分支;
  • 单板计算机(Raspberry Pi)分支;
  • 单板计算机(虚拟设备)分支。

本篇讲解的是Raspberry Pi 分支的传感器部分,对应的原始文档为 pi-sensor.md(仓库内还提供该文档的多种语言翻译,本文依据的德文版位于 translations/de/.../pi-sensor.md)。传感器部分完成后,小夜灯的下一步——用 LED 作为执行器——请继续阅读 pi-actuator.md。

硬件:认识 Grove 光传感器

本课使用的传感器是光传感器(light sensor),其核心是一个 光电二极管(Photodiode),能够把照射到它上面的光转换成电信号。需要特别强调的是:

  • 这是一个模拟传感器(analog sensor),输出一个 0 到 1,000(课程硬件简介中的表述)左右的整数值,表示相对光照量
  • 该数值不映射任何标准计量单位,例如不表示 勒克斯(Lux) 这样的光照度单位——它只是一个相对的强弱指示;
  • 在实际编程读取时,代码注释与运行结果展示的取值区间为0~1,023(下文"ADC 原理"一节会解释这个区间与 12 位模数转换的关系)。

光传感器是外置 Grove 模块,不能像 Wio Terminal 那样直接使用板载传感器,它必须通过 Grove Base Hat 连接到树莓派的 GPIO 上。

把光传感器接到 A0 插槽

Grove 生态的特点是"模块 + 标准线缆 + 扩展板"即插即用。将光传感器接到树莓派的完整操作步骤如下:

  1. 插线到模块:取一根 Grove 线缆,将一端插入光传感器模块上的插座。Grove 线缆的插头有防呆设计,只能以一个方向插入,反了插不进去。
  2. 接线到 Base Hat先关闭树莓派电源(power off),再将 Grove 线缆的另一端连接到 Grove Base Hat 上标记为A0的模拟插座。在 Base Hat 上,这一排插座紧挨着 GPIO 引脚排针,A0 是从右数第二个的插座。

💡 为什么强调"断电接线"?Grove 模块和树莓派 GPIO 均属于低压电路,但热插拔时瞬间的电流冲击仍可能损坏传感器或主板的 GPIO 端口。先断电再插拔线缆是嵌入式开发的安全习惯,本项目文档同样遵循这一原则。

接线完成、上电启动后,就可以开始编程了。

软件编程:用 Python 轮询光照强度

树莓派分支使用 Python 与 Grove 官方驱动库进行编程。整个项目存放在nightlight目录中,核心文件是app.py。下面按文档给出的步骤逐步完成。

第 1 步:导入所需库

打开 VS Code 中的夜灯项目(可以在树莓派本机直接打开,也可以通过 Remote SSH 扩展远程连接),清空app.py后写入以下导入语句:

import time from grove.grove_light_sensor_v1_2 import GroveLightSensor
  • import time导入 Python 标准库time模块,稍后用于在循环末尾插入休眠(sleep);
  • from grove.grove_light_sensor_v1_2 import GroveLightSensorGrove Python 库中导入GroveLightSensor类。这套 Grove 驱动库封装了与 Grove 光传感器交互的底层代码(I/O 读写),并在树莓派的初始化设置(Pi setup)阶段就已经全局安装,因此这里无需再执行 pip 安装,直接 import 即可。

第 2 步:创建传感器实例

在导入语句之后追加:

light_sensor = GroveLightSensor(0)

GroveLightSensor(0)创建一个连接到引脚 0(即模拟 Grove 引脚A0)的实例——这正是上一步物理接线的位置。从源码结构看,该构造参数是树莓派 Grove Base Hat 上的通道号,0 对应文档所述 A0 插槽。

第 3 步:死循环轮询并打印读数

接着添加一个无限循环,持续读取光值并输出到控制台:

while True: light = light_sensor.light print('Light level:', light)
  • light_sensor.lightGroveLightSensor类的属性,读取的是引脚上的模拟值,取值范围0~1,023
  • 读取到的值通过print输出到控制台。

第 4 步:在循环末尾加 1 秒休眠

光照强度不需要每毫秒都去检查,因此在循环尾部追加:

time.sleep(1)

每次循环结束后休眠 1 秒,降低设备功耗——对电池供电或长期运行的 IoT 设备来说,合理的采样频率是节能的关键设计。

第 5 步:运行并观察

在 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

从输出可以看出:室内常光下读数稳定在 634 左右,遮光后骤降到 104,逐渐放开后又回升到 290——传感器响应灵敏,验证接线与驱动均正常。

完整代码(仓库源码验证)

本节完整代码可直接在仓库中查看: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)

原理深挖:模拟光值是如何变成 0~1023 的数字量的

很多初学者会好奇:为什么传感器输出的是 0~1023 的整数,而不是电压或 Lux?这涉及 IoT 设备处理模拟信号的通用机制——模数转换(ADC, Analog-to-Digital Conversion)。第 3 课 README(1-getting-started/lessons/3-sensors-and-actuators/README.md)对此有清晰的说明:

  1. IoT 设备是数字设备,只能处理 0 和 1,无法直接理解 1V、2.5V 这样的模拟电压;
  2. 因此模拟传感器的输出电压必须经过ADC转成数字表示。很多 IoT 设备板载 ADC,扩展板(hat)也可以自带 ADC;
  3. 在 Seeed Grove 生态中,模拟传感器接到树莓派 GPIO 之上的 Base Hat 特定端口,Hat 上的 ADC 负责把电压转成可经 GPIO 传输的数字信号

以文档给出的具体例子:一个模拟光传感器接到使用 3.3V 的 IoT 设备,返回 1V 电压。对于 Seeed Grove 光传感器,其输出范围是0 到 1,023,那么在 3.3V 供电下,1V 输出对应的数字量约为300。设备无法直接处理 300 这个"模拟值",于是 Grove Hat 把 300 转成其二进制表示0000000100101100(12 位二进制数)交给 IoT 设备处理——这正解释了读取区间为何是0~1023(即 2¹⁰−1 到 2¹² 相关的 12 位 ADC 满量程概念,Grove 传感器按此区间归一化)。

💡 从编码角度看,这一整套电压→数字的转换通常由随传感器提供的驱动库完成。就像本文使用的GroveLightSensor库,开发者只需读取light属性即可拿到 0~1023 的值,无需自行处理 ADC 细节——这是使用 Grove 生态开发时"库帮你屏蔽底层"的典型体现。

引脚规划:模拟口与数字口的配合

完成传感器后,如果继续做执行器部分,会涉及树莓派 Base Hat 的引脚分工。根据 pi-actuator.md 中的说明,所有插座都有唯一的引脚编号:

  • 模拟引脚:0、2、4、6(光传感器接的 A0 即引脚 0);
  • 数字引脚:5、16、18、22、24、26(LED 将接到 D5,即引脚 5)。

理解这一分工很重要:模拟传感器必须接模拟口才能经 ADC 量化,数字执行器(如 LED)则接数字口直接以高/低电平驱动。在 Grove Base Hat 上,向执行器发送数字值 1 对应设备最大电压(树莓派场景下为 3.3V),发送 0 对应 0V。

进阶:把传感器接进完整的小夜灯逻辑

传感器读数本身只是第一步。小夜灯的核心逻辑是:检测到光照不足时点亮 LED。课程给出的伪代码如下:

Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off

将 LED(接 D5)与光传感器(接 A0)组合后的完整代码如下,可在 code-actuator/pi/nightlight/app.py 中查看:

import time from grove.grove_light_sensor_v1_2 import GroveLightSensor from grove.grove_led import GroveLed light_sensor = GroveLightSensor(0) led = GroveLed(5) while True: light = light_sensor.light print('Light level:', light) if light < 300: led.on() else: led.off() time.sleep(1)
  • GroveLed(5)创建连接到数字引脚 5(D5)的 LED 实例;
  • light < 300时调用led.on()(发送数字值 1),否则调用led.off()(发送 0);
  • 阈值 300 是一个相对值,读者可以按实际环境光照自行调整。

课程文档以流程图概括了这一完整作业的数据流(读取光照 → 判断 → 控制 LED):

运行后遮住光传感器,可以观察到读数降到 300 以下时 LED 自动亮起,移开遮挡后 LED 熄灭——一个基于传感器的闭环 IoT 小夜灯就此完成。

常见问题与注意事项

  1. 数值范围表述差异:文档硬件简介中写"0 到 1,000",而代码说明与实测输出使用 0~1,023 区间。两者并不冲突——前者是产品文档对相对量级的粗略描述,后者是 ADC 量化后实际读取的真实范围,编程时应以 0~1023 为准。
  2. Grove 线缆方向:插头只能以一个方向插入模块插座,不要用力硬插。
  3. 接线必须断电:连接或断开 Grove 线缆前,务必先关闭树莓派电源。
  4. LED 不亮时排查:若后续执行器阶段 LED 不亮,请确认 LED 极性(扁平侧为负极)以及模块上的亮度旋钮是否已拧到最大。
  5. 依赖环境:本分支依赖 Grove Python 库(grove包),文档明确说明它已在 Pi 初始化设置阶段全局安装;若在全新环境运行,需确保该驱动已安装到全局或当前 Python 环境中。

小结

通过本文,你完成了 IoT-For-Beginners 第 3 课 Raspberry Pi 分支的传感器阶段:将 Grove 光传感器接线到 A0 模拟插槽,用GroveLightSensor驱动读取 0~1023 的相对光强并打印到控制台,同时理解了模拟信号经 Base Hat 上的 ADC 转成数字量的原理,以及模拟口(0/2/4/6)与数字口(5/16/18/22/24/26)的分工。下一步,配合 pi-actuator.md 与 code-actuator/pi/nightlight/app.py 中的 LED 控制代码,即可完成会随环境光线自动开关的完整小夜灯。本课还提供了 Wio Terminal(wio-terminal-sensor.md)与虚拟设备(virtual-device-sensor.md)两条平行分支,便于没有树莓派硬件的读者用模拟器完成同样的学习目标。

【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询