ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 Wio Terminal 构建夜灯:从光敏传感器到 LED 执行器实战指南(IoT-For-Beginners 第 3 课)

2026/9/13 12:31:13 拓冰建站 浏览量
使用 Wio Terminal 构建夜灯:从光敏传感器到 LED 执行器实战指南(IoT-For-Beginners 第 3 课) 使用 Wio Terminal 构建夜灯从光敏传感器到 LED 执行器实战指南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 的传感器与执行器章节聚焦于Wio Terminal硬件平台在上一节用板载光传感器读取光照强度的基础上本文将为设备添加一个 Grove LED 执行器并编写完整的 Arduino 程序实现光线变暗自动开灯的夜灯逻辑。读完本文你将掌握数字执行器的接线原理、pinMode/digitalWrite的 GPIO 控制方式、HIGH/LOW 电平语义以及通过 PlatformIO 完成代码上传与串口监视的完整流程。硬件需求为夜灯引入执行器传感器负责感知执行器Actuator则相反——它把 IoT 设备发出的电信号转换为对外部世界的物理作用例如发光、发声或驱动电机。本课使用的执行器是一个LED发光二极管Light-Emitting Diode当电流流过时它会发光。从控制角度看这是一个数字执行器只有两个状态——1点亮、0熄灭。它属于外接 Grove 模块需要连接到 Wio Terminal 上。夜灯的整体逻辑用伪代码描述如下Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off即光传感器读数小于 300 时点亮 LED否则熄灭 LED。连接 Grove LED 到 Wio TerminalGrove LED 以模块形式提供带有多种颜色的 LED 灯珠供选择。连接步骤如下选择 LED 并插入模块挑选一颗你喜欢的 LED把两只引脚插入 LED 模块上的两个孔位。注意 LED 是二极管电流只能单向导通接反了不会亮。LED 并非完全圆形一侧略微扁平——扁平一侧是负极引脚。插入时圆润一侧的引脚要接入模块外侧标有的插座扁平一侧接入靠近模块中心的插座。调节亮度旋钮LED 模块上有一个旋转按钮用于控制亮度。初始时用一把小号十字螺丝刀将旋钮逆时针拧到头把亮度调到最大。插入 Grove 线把 Grove 线缆的一端插入 LED 模块的插座它只有一个方向能插进去。连接到 Wio Terminal在 Wio Terminal 断开电脑或其他电源的情况下将 Grove 线缆的另一端插入 Wio Terminal 屏幕朝向自己时的右侧 Grove 插座即离电源按钮最远的那个插座。 右侧 Grove 插座支持模拟或数字的传感器与执行器左侧插座仅支持 I²C 与数字设备。I²C 会在后续课程中介绍。编写夜灯程序现在可以结合板载光传感器与 Grove LED 来编写夜灯程序了。完整的参考实现存放在 code-actuator/wio-terminal/nightlight 目录下。步骤一在setup中配置 LED 引脚打开上一节创建的夜灯项目VS Code 中在setup函数末尾添加一行pinMode(D0, OUTPUT);这行代码配置了通过 Grove 端口与 LED 通信所用的引脚。D0是右侧 Grove 插座的数字引脚将其设置为OUTPUT表示该引脚连接的是执行器后续数据将写入该引脚。步骤二在loop中添加判断逻辑在loop函数的delay之前加入以下代码if (light 300) { digitalWrite(D0, HIGH); } else { digitalWrite(D0, LOW); }这段代码检查light变量的值如果小于 300向D0数字引脚发送HIGH。HIGH即数值 1点亮 LED如果大于等于 300向引脚发送LOW数值 0熄灭 LED。 向执行器发送数字值时LOW代表 0VHIGH代表设备的最大电压。对于 Wio TerminalHIGH对应的电压是3.3V。步骤三上传代码并观察运行结果重新将 Wio Terminal 连接到电脑按之前的方式上传新代码连接串口监视器Serial Monitor光照值会实时输出到终端 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: CtrlC | Menu: CtrlT | Help: CtrlT followed by CtrlH --- Light value: 4 Light value: 5 Light value: 4 Light value: 158 Light value: 343 Light value: 348 Light value: 344用手遮住再放开光传感器观察 LED 行为光照值 ≤ 300 时 LED 点亮 300 时熄灭。源码级解析完整实现与关键 API将前面两个步骤合并就得到了夜灯的完整 Arduino 程序与仓库中的参考实现 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); }逐段拆解Serial.begin(9600)与while (!Serial)初始化串口通信波特率 9600并等待串口就绪确保Serial.print输出不会丢失pinMode(WIO_LIGHT, INPUT)将板载光传感器所在 GPIO 引脚配置为INPUT即数据从该引脚读取int light analogRead(WIO_LIGHT)从光传感器读取模拟值。板载光传感器基于光电二极管photodiode输出01,023的整数表示相对光照强度并不映射到 lux 之类的标准物理单位Serial.print(Light value: )/Serial.println(light)把读数发送到串口。print不追加换行println追加换行因此每行输出为Light value: 数值if (light 300) { digitalWrite(D0, HIGH); } else { digitalWrite(D0, LOW); }核心的夜灯判定逻辑用数字电平控制 LEDdelay(1000)每秒采样一次。光照变化通常很缓慢无需连续检查适度的延时还能降低设备功耗。PlatformIO 项目配置该代码运行于 PlatformIO 环境其项目配置文件 platformio.ini 内容如下[env:seeed_wio_terminal] platform atmelsam board seeed_wio_terminal framework arduinoplatform atmelsamWio Terminal 基于 Atmel SAMD51 系列 MCU选用对应的 PlatformIO 平台包board seeed_wio_terminal目标开发板为 Seeed Wio Terminalframework arduino使用 Arduino 框架因此代码可以调用pinMode、analogRead、digitalWrite、Serial等标准 Arduino API。概念深化数字执行器与 GPIO 电平数字执行器的工作方式数字执行器和数字传感器一样要么只有受高低电平控制的两个状态要么内置数模转换器DAC以将数字信号转换为模拟信号。LED 是最简单的数字执行器设备发送数字信号1时输出高电压点亮 LED发送0时电压降为 0V、LED 熄灭。电平语义与 3.3V 逻辑HIGH 1 设备最大输出电压。Wio Terminal 的 IO 逻辑电平为3.3VLOW 0 0V。 实际电压不会绝对精确硬件元器件总有内阻因此存在容差范围。例如 Raspberry Pi 的 GPIO 引脚工作在 3.3V把高于 1.8V 的回读信号视为 1、低于 1.8V 视为 0。为什么阈值是 300从串口输出可见室内遮光时光照读数可低至 45暴露在正常环境光下可达 343348。01,023 的模拟量程意味着阈值 300 大致对应约 29% 的量程恰好能把昏暗与明亮区分开。你可以按实际环境调整该阈值例如改用analogRead输出的中位值。进阶其他硬件平台的同款实现同样一套光传感器 LED 夜灯逻辑在课程中还有其他硬件实现可供对照学习Raspberry Picode-actuator/pi/nightlight/app.py 使用grove.grove_light_sensor_v1_2.GroveLightSensor与grove.grove_led.GroveLed调用light_sensor.light读取光照、led.on()/led.off()控制 LED虚拟设备code-actuator/virtual-device/nightlight/app.py 基于 CounterFit 模拟器通过counterfit_connection.CounterFitConnection.init(127.0.0.1, 5000)建立与模拟环境的连接。两者同样采用if light 300的判定逻辑并以 1 秒间隔循环与 Wio Terminal 的 C 实现保持行为一致便于跨平台对比理解传感器→判断→执行器的完整数据流。小结与练习建议至此你的 Wio Terminal 已经完成了一台可用的自动夜灯板载光传感器持续采样环境光照程序以 300 为阈值判断太暗随后通过D0引脚以数字电平驱动 Grove LED 点亮或熄灭。本课涉及的传感器与执行器通用知识模拟/数字分类、ADC/DAC、PWM 等可进一步参阅课程概述 README.md并可尝试完成 assignment.md 中调研一个传感器与一个执行器的课后任务从工作原理、内部电子器件、模拟/数字属性、量程与单位四个维度加深理解。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考