
基于 Raspberry Pi 构建物联网小夜灯用 Grove LED 执行器实现光线驱动的开关控制【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本篇文章以《IoT-For-Beginners》课程第 1 项目Getting Started第 3 课《与传感器和执行器交互》的 Raspberry Pi 路径为核心讲解如何为树莓派接入一个 Grove LED 执行器actuator并配合上一节已接入的 Grove 光传感器编写一个完整的「小夜灯nightlight」程序。读完本文后你将掌握 LED 这种典型数字执行器的硬件接线方法含二极管极性判断、GroveLedPython 库的调用方式以及基于阈值light 300的简单控制逻辑并能把完整的夜灯代码运行在树莓派上。一、课程背景与本次任务在第 3 课中课程导读 已经系统介绍了 IoT 中的两个核心概念传感器sensor负责感知物理世界并把信息送给设备执行器actuator则反过来——把设备发出的电信号转换成物理世界的动作如发光、发声、驱动电机等。本篇文章对应的关联文档 pi-actuator.md 正是其中「Raspberry Pi Grove 生态」这条硬件路径的实操指南。在上一节pi-sensor.md中你已经把 Grove 光传感器接到树莓派的A0 模拟引脚并通过GroveLightSensor读取了 0–1,023 量级的光照值。本节的最终目标就是在此基础上新增一个 LED 执行器把树莓派变成一个根据环境光线自动开关的小夜灯。整个作业的流程关系可以用课程中的这张流程图概括光传感器采集光强 → 代码判断光强是否过低 → 控制 LED 点亮或熄灭。 如果你没有实体硬件可以改走 虚拟设备路径基于 CounterFit 模拟器本文聚焦树莓派实体硬件路径。全部设备代码均为 Python。二、硬件准备理解 LED 这个数字执行器本次新增的执行器是LED发光二极管。与光传感器这类「模拟传感器」不同LED 是一个数字执行器只有两个状态开和关。向它发送数字值1LED 点亮向它发送数字值0LED 熄灭。对应到电压层面当给执行器发送数字值时0对应 0V1对应设备的最大电压。对于接在 Grove 生态上的树莓派而言1对应的是3.3V。 更广义地看数字执行器digital actuator与数字传感器类似要么只有受高低电压控制的两个状态要么内置 DAC数字-模拟转换器把数字信号转成模拟信号。LED 属于最简单的两态数字执行器而屏幕、舵机等更复杂的数字执行器通常需要按特定格式发送数据且一般都会配套官方库来简化控制。详见 课程导读的执行器类型一节。本夜灯的完整逻辑用伪代码表达如下Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off也就是光强低于 300 就开灯否则关灯。300 是课程中选定的经验阈值你可以后续自行调整。所需硬件清单参照仓库根目录的 硬件说明Raspberry Pi 路径需要的关键硬件包括硬件用途Raspberry Pi2B 及以上建议 4 代 2GB主控单板计算机运行 Python 代码Grove Base hat扩展板通过 GPIO 引脚提供 Grove 标准接口Grove 光传感器上一节已接入接模拟引脚 A0Grove LED 模块本节新增接数字引脚 D5Grove 连接线连接传感器/执行器模块与 Base hat其中 Grove LED 以模块形式提供模块内附带多种颜色的 LED 灯珠你可以自由选择喜欢的颜色。三、硬件连接把 Grove LED 接到 D5 引脚3.1 认识 Grove LED 模块Grove LED 模块外观如下其自带一个旋钮式电位器spin button用于调节 LED 亮度3.2 接线步骤Task - connect the LED第 1 步把 LED 灯珠插入模块。选择一颗你喜欢的 LED把两支引脚插入 LED 模块上的两个孔位。这里有一个关键注意事项——二极管的方向性LED 是发光二极管二极管属于只能单向导电的电子器件因此 LED 必须按正确方向接入否则不会亮LED 的两条引脚分别是正极positive pin和负极negative pinLED 并非完美圆形其中一侧略微扁平扁平一侧对应负极引脚插入模块时让圆弧一侧的引脚对准模块外侧标有的插孔让扁平一侧的引脚对准更靠近模块中间的插孔。第 2 步把亮度旋钮调到最大。模块上的旋钮用于控制亮度。用一把小号十字螺丝刀把旋钮逆时针拧到底先把亮度调到最大便于后续观察效果。第 3 步插入 Grove 连接线。把 Grove 连接线的一端插入 LED 模块的插座该接口有防呆设计只能按一个方向插入。第 4 步连接树莓派上的 D5 插座。在树莓派断电状态下把 Grove 连接线的另一端插入 Grove Base hat 上的数字插座 D5。D5 位于靠近 GPIO 引脚那一排插座中从左数第二个位置。3.3 引脚编号速查 Base hat 上的所有插座都有唯一的引脚编号。其中0、2、4、6 是模拟引脚5、16、18、22、24、26 是数字引脚。这也解释了为什么光传感器接 A0模拟而 LED 接 D5数字光传感器输出的是连续变化的模拟电压需要经过 Base hat 内置的 ADC模拟-数字转换器转换为数字量而 LED 只接受开/关两种数字信号直接占用一个数字 GPIO。四、编写夜灯程序Task - program the nightlight4.1 准备运行环境给树莓派上电并等待系统启动完成在 VS Code 中打开上一节创建的 nightlight 项目既可以直接在树莓派上运行 VS Code也可以通过 Remote SSH 扩展远程连接打开项目中的app.py文件开始编辑。 上一节结束时app.py里已经含有读取光传感器的代码import time、GroveLightSensor导入、light_sensor GroveLightSensor(0)、以及每秒打印一次光强的while循环本节在此基础上追加 LED 相关代码。4.2 导入 GroveLed 库在app.py顶部、已有import行的下方添加如下代码from grove.grove_led import GroveLedfrom grove.grove_led import GroveLed语句从 Grove Python 库中导入GroveLed类。该库封装了与 Grove LED 交互的底层逻辑向指定数字引脚输出高低电平与光传感器一样Grove Python 库已在树莓派环境初始化时全局安装。4.3 创建 LED 实例在light_sensor声明的下方添加如下代码创建管理 LED 的类实例led GroveLed(5)led GroveLed(5)创建了一个GroveLed类的实例并将其绑定到引脚 D5——也就是上一节接线中 LED 实际连接的 Grove 数字引脚。4.4 在循环中加入开关判断在while循环内部、time.sleep之前加入光强判断并控制 LED 开关if light 300: led.on() else: led.off()这段代码的含义检查light变量的值若小于 300调用GroveLed类的on方法向 LED 发送数字值13.3VLED 点亮若大于等于 300调用off方法发送数字值00VLED 熄灭。 注意缩进这段代码必须与print(Light level:, light)处于相同的缩进层级才能保证它在while循环内部、每次循环都会执行。4.5 完整程序参考合并以上片段后完整的app.py应与仓库中 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)从这段完整代码可以清晰地看到整个数据流GroveLightSensor(0)从 A0 模拟引脚读取光强0–1,023led GroveLed(5)绑定 D5 数字引脚主循环每秒采样一次根据light 300阈值决定调用led.on()还是led.off()最后time.sleep(1)暂停一秒降低设备功耗——因为光线的变化并不需要连续不间断地检测。4.6 运行程序在 VS Code 的终端中运行python3 app.py程序运行后光照值会持续输出到控制台效果类似piraspberrypi:~/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 时即用手或物体遮住光传感器LED 应被点亮数值回到 300 以上时LED 熄灭。五、验证与调试完成编码后做如下验证遮挡/放开光传感器观察 LED 是否在光照值 ≤ 300 时点亮、 300 时熄灭检查反向问题如果 LED 不亮优先排查两点——LED 灯珠是否插反扁平侧对应负极、模块上的亮度旋钮是否已调到最大。实际运行效果如下方动图所示——LED 随着光线变化自动点亮与熄灭 本节的完整可运行代码存放在仓库的 code-actuator/pi 目录下即上述nightlight/app.py文件虚拟设备版本的对照代码位于 code-actuator/virtual-device 目录。六、进一步思考与延伸阈值可调300是课程预设的经验阈值。你可以根据实际环境光线下传感器返回的数值把这个阈值调高或调低让夜灯更灵敏或更迟钝双态 vs 模拟执行器本课 LED 是典型的两态数字执行器而在 课程导读 中还介绍了模拟执行器与 PWM脉冲宽度调制技术——例如通过改变数字脉冲的占空比来无级调节 LED 亮度或电机转速这是本节的进阶方向后续课程衔接下一个项目章节第 4 课连接互联网中同样的夜灯程序将被接入 MQTT 与云服务你可以提前思考当把 LED 的控制权从本地代码迁移到云端命令时led.on()/led.off()这两个调用应该如何被远程触发。至此你的树莓派小夜灯程序已经成功运行——它能够感知环境光并在光线不足时自动点亮 LED这也是物联网「感知-决策-执行」闭环的一个最小可运行范例。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考