IoT-For-Beginners 实战:Wio Terminal + Grove LED 构建光敏小夜灯(数字执行器篇)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇技术指南聚焦于开源课程 IoT-For-Beginners 第 1 章第 3 课《传感器与执行器》中 Wio Terminal 的"执行器"环节:为上一课已经接入板载光敏传感器的 Wio Terminal 连接一颗 Grove LED,编写代码实现"光弱则亮、光强则灭"的智能小夜灯。读完本文,你将掌握数字执行器的驱动原理、Grove LED 的正确接线方法、pinMode与digitalWrite的 GPIO 控制方式,并能在 PlatformIO + VS Code 环境中完成代码上传与 Serial Monitor 联调验证。
一、硬件准备:数字执行器与 LED
小夜灯现在需要一个执行器(Actuator)。执行器与传感器正好相反——传感器把物理世界转成电信号,执行器则把 IoT 设备发出的电信号转化为对物理世界的干预,例如发光、发声或驱动电机。
本次使用的执行器是一颗LED(发光二极管):当电流流过它时就会发光。它属于数字执行器,只有"开"和"关"两个状态——发送值1点亮 LED,发送值0熄灭 LED。这是一颗外部 Grove 执行器,需要连接在 Wio Terminal 上。
小夜灯的完整逻辑用伪代码表示为:
检查光照强度。 如果光照强度小于 300 点亮 LED 否则 熄灭 LED该伪代码对应的真实源码位于 code-actuator/wio-terminal/nightlight/src/main.cpp,完整实现如下(含上一课的光敏传感器读取逻辑):
#include <Arduino.h> void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); pinMode(WIO_LIGHT, INPUT); pinMode(D0, OUTPUT); } void loop() { int light = analogRead(WIO_LIGHT); Serial.print("Light value: "); Serial.println(light); if (light < 300) { digitalWrite(D0, HIGH); } else { digitalWrite(D0, LOW); } delay(1000); }二、连接 Grove LED:从极性到 Grove 插座
Grove LED 以模块形式出货,附带多颗不同颜色的 LED 供你选择。整个接线过程分四步,其中极性方向是最容易出错、也是导致"接好了却不亮"的头号原因。
选择并插入 LED:挑一颗你喜欢的 LED,把两个引脚插入 LED 模块上的两个孔。LED 是二极管,而二极管是只能单向导通电流的电子元件,所以必须正反正确,否则不会工作。LED 的两个引脚一个为正极、一个为负极;LED 并非完美圆形,一侧略微扁平——扁平侧是负极引脚。连接时确保圆润侧的引脚插入模块外侧标有+的插孔,扁平侧插入靠近模块中心的插孔。
调高亮度:LED 模块上有一个旋钮用于控制亮度,先用小号十字螺丝刀逆时针旋到底,将亮度调至最大,便于后续观察亮灭变化。
插入 Grove 线缆:将 Grove 线缆一端插入 LED 模块的插座,线缆只有一个方向能插进去(防呆设计)。
连接 Wio Terminal:在 Wio Terminal 断开电脑或电源的状态下,将 Grove 线缆另一端插入 Wio Terminal 屏幕朝向你时的右侧 Grove 插座(离电源开关最远的那个插座)。
💁 右侧 Grove 插座可用于模拟或数字传感器/执行器;左侧插座仅供 I²C 与数字传感器/执行器使用(I²C 将在后续课程中讲解)。
三、编写小夜灯程序:GPIO 配置与开环控制
上一课已经完成了光敏传感器的读取(analogRead(WIO_LIGHT)返回 0~1023 的模拟值),本节只需为 LED 补上输出引脚配置和控制逻辑。
3.1 在setup函数中配置输出引脚
在setup函数末尾追加一行:
pinMode(D0, OUTPUT);这行代码配置了通过 Grove 端口与 LED 通信的引脚。D0是右侧 Grove 插座对应的数字引脚,将其设为OUTPUT表示它连接的是执行器,程序将向该引脚写入数据。与之对照,上一课光敏传感器用的pinMode(WIO_LIGHT, INPUT)表示引脚连接传感器并从中读取数据——INPUT/OUTPUT的方向语义正是传感器(读)与执行器(写)在代码层面的分界线。
3.2 在loop函数中加入控制逻辑
在loop函数中delay语句之前加入如下代码:
if (light < 300) { digitalWrite(D0, HIGH); } else { digitalWrite(D0, LOW); }这段代码检查light变量的值:若小于 300,则向数字引脚D0发送HIGH(值 1),点亮 LED;若光照值大于或等于 300,则发送LOW(值 0),熄灭 LED。
💁 向执行器发送数字值时,
LOW对应 0V,HIGH对应设备的最大电压。对 Wio Terminal 而言,HIGH电压为 3.3V。
由此形成的控制环是典型的"传感器 → 决策 → 执行器"闭环雏形:每 1 秒(delay(1000)保证的采样间隔)读取一次光照,根据阈值 300 决策 LED 状态。这个阈值与光敏传感器的输出范围(0~1023)直接相关,示例运行数据中环境光可低至 4、被手遮挡时约 158、正常光照约 343——因此 300 是一个能区分"暗环境/亮环境"的合理阈值,你完全可以根据实际光照环境调整它。
四、构建环境与平台配置说明
该示例是基于 PlatformIO + Arduino 框架构建的,工程的平台配置位于 platformio.ini:
[env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal framework = arduinoplatform = atmelsam:使用 Atmel SAM 系列(Wio Terminal 采用的 ATSAMD51 主控)的平台支持包;board = seeed_wio_terminal:指定目标开发板型号;framework = arduino:采用 Arduino 框架,因此代码中直接使用pinMode、digitalWrite、analogRead、Serial等标准 API。
工程目录结构(code-actuator/wio-terminal/nightlight/)遵循 PlatformIO 标准布局:src/main.cpp存放源代码,include/、lib/、test/分别为头文件、库依赖与测试目录。
五、烧录与联调验证:Serial Monitor 观察阈值行为
完成代码编写后,按以下步骤烧录并验证:
- 重新将 Wio Terminal 连接电脑,按之前的方式上传新代码;
- 打开 Serial Monitor(VS Code 中执行
platformio device monitor任务),光照值会持续输出到终端。
实际运行时终端输出如下(波特率 9600):
> Executing task: platformio device monitor < --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time --- More details at http://bit.ly/pio-monitor-filters --- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 --- --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- Light value: 4 Light value: 5 Light value: 4 Light value: 158 Light value: 343 Light value: 348 Light value: 344- 交替遮盖与揭开Wio Terminal 背面的光敏传感器(透过背面板的透明塑料窗可见),观察 LED 行为:当光照值 ≤ 300 时 LED 点亮,> 300 时熄灭。
💁 本节完整代码位于 code-actuator/wio-terminal,与之配套的传感器阶段代码位于 code-sensor/wio-terminal(仅含光敏读取,见 main.cpp),方便你对照"传感器阶段"与"执行器阶段"的代码差异。
六、原理纵深:数字执行器与信号方向
LED 是本课 "数字执行器" 的典型代表。在 本课主 README 的执行器类型章节中,数字执行器被归纳为两类:要么像 LED 一样仅有高/低电压两种状态,要么内置 DAC(数模转换器)可将数字信号转为模拟信号。本项目的数字 LED 属于前者——设备发送数字信号1时输出高电压点亮 LED,发送0时电压归零熄灭。
值得注意的是,右侧 Grove 插座同时支持模拟与数字器件(这也是把 LED 接到右侧而非左侧的原因),而 Wio Terminal 的HIGH输出为 3.3V,与板载逻辑电平一致,可直接驱动 Grove LED 模块。若要驱动需要更大电压的执行器(如继电器、电机),则需借助继电器等中间器件以小电压控制大电压——这是后续课程将展开的内容。
七、小结
至此,你的小夜灯已从"只读不控"进化为完整的感知-决策-执行闭环:板载光敏传感器采集光照(模拟输入),Arduino 程序基于阈值 300 做决策,Grove LED 通过D0引脚执行点亮/熄灭动作(数字输出)。这一最小闭环正是绝大多数物联网应用的基本骨架,后续课程中你将把同样的模式迁移到云端、边缘设备乃至基于视觉的检测系统上。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考