news 2026/9/14 1:51:23

基于 Raspberry Pi 与 Grove 光敏传感器的夜灯实战:从硬件接线到 Python 数据采集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 Raspberry Pi 与 Grove 光敏传感器的夜灯实战:从硬件接线到 Python 数据采集

基于 Raspberry Pi 与 Grove 光敏传感器的夜灯实战:从硬件接线到 Python 数据采集

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

本教程是 IoT-For-Beginners 课程第 3 课「使用传感器与执行器与物理世界交互」的 Raspberry Pi 实战篇。你将学习如何将一个基于光电二极管(photodiode)的 Grove 模拟光敏传感器连接到树莓派(Raspberry Pi)的 Grove Base hat,并通过 Python 程序持续读取环境光强度,为后续「光线变暗时自动点亮 LED」的夜灯(nightlight)应用打下基础。完成本部分后,你将掌握模拟传感器的接线方法、Grove Python 库的调用方式,以及如何编写一个低功耗的轮询循环读取传感器数据。

传感器概述:基于光电二极管的模拟光敏传感器

本节使用的传感器是光敏传感器(light sensor),其核心元件是光电二极管——当光线照射到二极管上时,会产生与光照强度成正比的电流,从而将光信号转换为电信号。

这是一个模拟传感器(analog sensor):它返回一个 0 到 1,000 之间的整数值,用于表示相对光照强度。需要特别注意的是,这个数值并不映射到任何标准的物理光照单位(如 lux),它只是一个相对的、可比较的读数。例如,数值从 634 降到 104,说明环境光显著变暗,但 634 具体对应多少 lux 是无法直接换算的。

在硬件层级上,该传感器是 Seeed Grove 生态系统的外部模块,需要连接到 Raspberry Pi 上的 Grove Base hat(扩展板)才能工作。

模拟信号为何需要 ADC 转换

Raspberry Pi 是数字设备,只能处理 0 和 1,无法直接理解模拟电压值。因此,Grove Base hat 上内置了模数转换器(ADC,Analog-to-Digital Converter):模拟传感器接入 hat 上特定的模拟端口,hat 将电压值转换为数字信号后再通过 GPIO 引脚传给 Pi。

以本课的 Seeed Grove 光敏传感器为例,其输出数值范围为 0 到 1,023。假设传感器运行在 3.3V 电压下,返回 1V 电压,换算得到的模拟值约为 300;Grove hat 会将其转换为二进制0000000100101100(即十进制 300)交给设备处理。值得庆幸的是,从编码角度看,这一转换过程通常被传感器附带的库函数封装好了——正如后文所示,我们只需要调用GroveLightSensor类的light属性即可拿到最终数值,无需自己处理 ADC 细节。这部分原理的完整论述可参见本课主文档 1-getting-started/lessons/3-sensors-and-actuators/README.md。

硬件接线:将光敏传感器连接到 Grove Base hat

Grove 光敏传感器通过 Grove 标准化线缆与 Raspberry Pi 连接,整个过程非常简单。

任务:连接光敏传感器

  1. 将 Grove 线缆的一端插入光敏传感器模块上的插座。该插座有防反插设计,只有一个方向能插入。

  2. 在 Raspberry Pi断电的状态下,将 Grove 线缆的另一端连接到 Pi 上 Grove Base hat 的模拟插座A0。该插座位于 GPIO 引脚旁边那一排插座的右起第二个位置。

⚠️ 接线时务必在 Pi 断电后进行,避免热插拔对传感器或扩展板造成损伤。

连接完成后,硬件部分即告完成:光敏传感器通过 A0 模拟端口接入 Grove Base hat,hat 内置的 ADC 会将模拟电压数字化,供后续 Python 程序读取。

编写 Python 程序读取光强数据

在上一部分(1-getting-started系列前序课程)中,你应该已经在 Pi 上创建了nightlight项目目录。接下来将app.py改写为光强采集程序。

任务:编程实现光强读取

  1. 启动 Pi 并等待系统启动完成。

  2. 在 VS Code 中打开之前创建的nightlight项目(既可以在 Pi 上直接运行 VS Code,也可以通过 Remote SSH 扩展远程连接)。

  3. 打开app.py文件,清空其中所有代码。

  4. 在文件顶部添加如下代码,导入所需库:

    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 环境搭建阶段被全局安装。
  5. 在导入语句之后,创建管理光敏传感器的类实例:

    light_sensor = GroveLightSensor(0)

    构造函数参数0表示该传感器连接在A0模拟 Grove 引脚上——正是上一步硬件接线所使用的端口。

  6. 添加一个无限循环,持续轮询传感器数值并输出到控制台:

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

    lightGroveLightSensor类的属性,每次访问都会从引脚读取当前的模拟值(范围 0–1,023)。该值随后被打印到控制台。

  7. while循环末尾添加 1 秒的休眠:

    time.sleep(1)

    环境光不需要连续不断地被采样,加入休眠可以显著降低设备功耗。这是低功耗 IoT 编程中的常见实践:传感器读数频率越慢,设备耗电越少,电池续航越长。

  8. 在 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

从输出可以看到:手遮住传感器时数值骤降至 104 附近,移开后恢复到 200–600 以上的水平。这些相对数值正是后续夜灯逻辑判断的输入依据。

仓库源码对照:完整的 app.py 实现

本教程的完整示例代码保存在仓库的code-sensor/pi目录中,即 1-getting-started/lessons/3-sensors-and-actuators/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)

这段代码与上述分步讲解完全一致,可以直接复制运行。通过对照仓库源码,可以确认:

  • 程序结构为「导入库 → 实例化传感器 → 无限循环读取」的标准模式;
  • GroveLightSensor(0)的构造参数 0 即对应 Grove Base hat 上的 A0 模拟端口;
  • while循环内依次完成读取、打印、休眠三步,循环周期约 1 秒。

进阶:将传感器与执行器结合,完成夜灯闭环

本部分只完成了「感知」环节。在下一步 pi-actuator.md 中,你将添加一个数字执行器——LED,构建完整的夜灯逻辑:

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

即将 LED 连接到 Grove Base hat 的D5数字插座,然后在循环中加入if light < 300: led.on() else: led.off()的判断。完整的传感器 + 执行器实现参见仓库中的 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)

这正是本课核心作业的完整闭环:传感器读取物理世界(光照)→ 程序决策 → 执行器改变物理世界(点亮 LED)。整个流程可参考课程主文档中的 作业流程图。

故障排查要点

  • 数值始终不变:检查 Grove 线缆是否完全插入、是否接在 A0 端口(而非数字端口)。
  • 数值异常偏高/偏低:用手遮挡传感器表面测试响应,确认光电二极管朝向正确。
  • 运行报ModuleNotFoundError:确认 Grove Python 库已在 Pi 上全局安装(该库在课程 Pi 环境搭建阶段完成安装)。
  • 需要调整采样频率:修改time.sleep()的参数(单位秒),但注意采样越频繁功耗越高。

小结

通过本部分学习,你完成了以下关键技术动作:

  • 将基于光电二极管的模拟光敏传感器接入 Raspberry Pi 的 Grove Base hat A0 端口;
  • 理解了模拟传感器、ADC 模数转换与数字化读数(0–1,023)之间的对应关系;
  • 使用GroveLightSensor类与light属性编写了 1 秒间隔的轮询采集循环;
  • 为下一步「光强低于阈值时点亮 LED」的夜灯功能提供了可靠的传感器数据输入。

至此,你的夜灯项目已经拥有了「感知光线」的能力——接下来只需添加执行器,即可完成整个闭环。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 1:51:18

Ollama本地模型前端接入指南:从API调用到流式对话实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 1:49:39

PP-MattingV2 ONNX Runtime WinForms部署:实现高性能抠图

简介&#xff1a;面向 C# 桌面应用开发者&#xff0c;提供在 WinForm 中部署 PP-MattingV2 人像抠图 ONNX 模型的完整源码工程。项目基于 VS2019、.NET Framework 4.7.2&#xff0c;结合 OpenCvSharp4.8.0 与 ONNX Runtime 1.16.3 完成模型推理与图像处理&#xff0c;适合需要快…

作者头像 李华
网站建设 2026/9/14 1:47:53

BDS/GPS双模单点定位C语言实现与RINEX解析

简介&#xff1a;本资源是一套基于Visual Studio 2010开发的北斗卫星导航系统&#xff08;BDS&#xff09;单点定位C语言实现程序&#xff0c;面向GNSS导航算法学习者、测绘与地理信息专业学生及嵌入式定位开发初学者&#xff0c;用于理解伪距观测、坐标解算、误差修正等单点定…

作者头像 李华
网站建设 2026/9/14 1:43:10

基于微信小程序的设备故障报修系统:SSM框架实践

简介&#xff1a;一套基于微信小程序与SSM框架&#xff08;SpringSpring MVCMyBatis&#xff09;完成的设备故障报修管理系统项目源码&#xff0c;面向计算机相关专业毕业设计、课程设计以及需要快速搭建内部报修平台的技术开发者。系统覆盖设备台账管理、故障单提交、维修任务…

作者头像 李华