树莓派夜灯项目实战:接入 Grove 光传感器(IoT-For-Beginners 第 3 课 Raspberry Pi 篇)
2026/9/15 17:46:30 网站建设 项目流程

树莓派夜灯项目实战:接入 Grove 光传感器(IoT-For-Beginners 第 3 课 Raspberry Pi 篇)

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

本篇技术指南是 Microsoft IoT-For-Beginners 课程《3-sensors-and-actuators》中 Raspberry Pi 路线的核心实践部分,讲解如何为树莓派接入一个 Grove 光传感器,并通过 Python 代码实时读取环境光照强度。读完本文,你将掌握 Grove 模拟传感器的硬件接线方法、GroveLightSensor类的编程用法,以及模拟量到数字量(ADC)转换的底层原理,为后续用光敏值控制 LED 构建完整夜灯应用打下基础。本指南对应的孟加拉语文档位于 translations/bn/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md,其英文权威版本位于 1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md。

硬件:Grove 光传感器

本课使用的传感器是光传感器(light sensor),它内部利用 光敏二极管(photodiode) 将光照转换为电信号。它是一个模拟传感器(analog sensor),输出一个表示相对光照强度的整数值。需要说明的是,该数值不对应 lux(勒克斯) 这类标准光照度量单位,课程文档中将其描述为 0 到 1,000 之间的相对值,而实际编程读取时使用的量程为 0–1,023(详见下文源码分析),两者都只是"相对亮度"的数字化表示。

该光传感器是一个外部 Grove 模块,必须通过 Grove 线缆连接到树莓派上的Grove Base Hat才能工作。硬件清单可参见仓库根目录的 hardware.md,其中确认了 Grove Base Hat 与 Grove Light Sensor v1.2 是该课程树莓派路线所需的官方配件。

连接光传感器

将 Grove 光传感器连接到树莓派的操作步骤如下(对应原文档中的 Task 环节):

  1. 将 Grove 线缆的一端插入光传感器模块的插槽中。插槽有方向限制,只能以一个方向插入。
  2. 树莓派断电状态下,将 Grove 线缆的另一端连接到 Grove Base Hat 上标注为A0的模拟插槽。该插槽位于 GPIO 引脚旁那排插槽中,从右侧数第二个。

提示:为什么强调"断电连接"?因为树莓派 GPIO 与 Grove Base Hat 的模拟接口在带电插拔时可能产生浪涌电流,损坏传感器或引脚,规范的硬件操作应遵循断电接线原则。

编程:读取光传感器数值

传感器接线完成后,即可对树莓派进行编程。整个流程分为五步:导入库、创建传感器实例、编写无限读取循环、加入休眠延时、运行程序。

第一步:导入所需库

打开 VS Code 中之前创建的 nightlight 项目(既可以在树莓派上直接运行 VS Code,也可以通过 Remote SSH 扩展远程连接),打开app.py并清空原有代码,然后添加以下导入语句:

import time from grove.grove_light_sensor_v1_2 import GroveLightSensor
  • import time导入 Python 的time模块,稍后用于在循环中插入休眠延时。
  • from grove.grove_light_sensor_v1_2 import GroveLightSensor从 Grove Python 库中导入GroveLightSensor类。该库封装了与 Grove 光传感器交互的代码,在课程前序"树莓派环境搭建"环节中已被全局安装到 Pi 系统里。

第二步:创建传感器实例

在导入语句之后添加如下代码,创建管理光传感器的类实例:

light_sensor = GroveLightSensor(0)

GroveLightSensor(0)创建了连接到A0引脚的实例——A0 正是光传感器所接的 Grove 模拟引脚。这里传入的0是 Grove 引脚编号,在 Grove Base Hat 的寻址体系中对应 A0 模拟通道。

第三步:编写无限读取循环

接着添加一个无限循环,持续读取传感器值并打印到控制台:

while True: light = light_sensor.light print('Light level:', light)

通过GroveLightSensor类的light属性读取当前光照值。该属性读取的是引脚上的模拟值,量程为 0–1,023。读取到的数值随后被打印到控制台。

第四步:加入一秒延时

在循环末尾追加time.sleep(1),让程序每秒采样一次:

time.sleep(1)

光照水平并不需要被无间断地轮询,加入延时可以显著降低设备功耗,这也是真实 IoT 设备低功耗设计的基本手法。

第五步:运行程序

在 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,遮挡传感器后骤降至 230、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)

这段代码与教程步骤一一对应,是"硬件接线 → 实例化 → 轮询读取"这一传感器编程范式的标准模板,后续课程(如连接互联网、上报遥测)都会在此基础上扩展。例如,仓库中 4-connect-internet/code-mqtt/pi/nightlight/app.py 就是在本例基础上叠加 MQTT 消息发布逻辑,足见本节代码是整条课程链路的基石。

原理纵深:模拟信号如何变成数字量

为什么光传感器返回的是 0–1,023 的整数,而不是电压值?这背后是模拟/数字转换(ADC)机制。在课程 3-sensors-and-actuators 课程总览 中有详细解释:

  • IoT 设备本质上是数字设备,只能处理 0 和 1,无法直接理解模拟电压,因此模拟传感器的读数必须被转换为数字信号后才能被程序处理。
  • 在 Seeed Grove + 树莓派的组合中,模拟传感器连接到的 Grove Base Hat 内建了 ADC:光传感器输出某个电压(例如 3.3V 供电下输出 1V),Hat 上的 ADC 按量程将其换算成 0–1,023 之间的整数(1V 对应数值约 300),再以二进制0000000100101100形式送入树莓派 GPIO 处理。
  • 从编码角度看,这一转换完全被 Grove 传感器库封装——对开发者而言只需调用light属性即可,无需关心底层换算。

此外,从同课的 pi-actuator.md 可以确认 Grove Base Hat 的完整引脚布局:0、2、4、6 为模拟引脚,5、16、18、22、24、26 为数字引脚。光传感器必须接在模拟引脚(A0)上,而 LED 等数字执行器则接在 D5 等数字引脚,接错端口类型将无法正常读取。

延伸:把传感器升级为夜灯

读懂光传感器之后,下一步就是把读数变成动作——这正是传感器(感知)与执行器(行动)协同的 IoT 核心模式。课程 pi-actuator.md 展示了完整的夜灯逻辑伪代码:

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

实现时引入GroveLed类并复用本节创建的光传感器实例,在while循环内判断光照阈值并调用led.on()/led.off()即可。这也解释了为什么本节读取到的数值要能被反复、快速地刷新——它将成为控制执行器的判断依据。完成本节的传感器接入,你就已经具备了构建完整树莓派夜灯应用的核心传感能力。

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

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

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

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

立即咨询