IoT for Beginners:在 Wio Terminal 上读取内置光敏传感器(模拟量 0~1023 实战) IoT for Beginners在 Wio Terminal 上读取内置光敏传感器模拟量 0~1023 实战【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文基于课程《Interact with the physical world with sensors and actuators》中面向 Seeed Wio TerminalArduino 路线的传感器实操文档讲解如何在已创建好的 nightlight小夜灯项目中启用 Wio Terminal 内置的光传感器理解光敏二极管如何将光转换为模拟电信号、pinMode与analogRead的底层工作方式、0~1,023 数值的来源以及通过 PlatformIO Serial Monitor 验证读数变化的完整流程。读完并完成操作后你将掌握在 Wio Terminal 上读取任意模拟量传感器的标准方法为后续“光暗自动点亮 LED”的小夜灯控制逻辑打下基础。硬件基础内置光传感器是什么本课时使用的传感器是光传感器light sensor其核心元件是一颗光敏二极管photodiode当光照射到光敏二极管上时它会改变自身的电特性从而把光信号转换为可被电路测量的电信号。这是一个模拟传感器——它向设备发送一个 0 到 1,023 的整数值表示当前光强的相对大小。需要注意两点该数值不对应任何标准测量单位如勒克斯 lux只表示“相对光量”因此它适合做阈值判断亮/暗不适合做精确照度计量传感器已内置在 Wio Terminal 主板上从机身背面的透明塑料窗口可以看到它。测试时只需遮挡或照射背面的这个窗口读数就会变化。从模拟信号到 0~1,023 整数的转换由设备上的模数转换器ADC完成。结合同一课时的教学材料 README 中的 ADC 原理说明设备是数字系统只能处理 0 和 1因此模拟传感器返回的电压必须先经过 ADC 按固定刻度离散化。以 12 位 ADC 为例参考电压被等分为 2^101,024 个刻度所以读到的值落在 0~1,023 之间——这也是为什么后续代码用int而不是boolean来接收analogRead的结果。项目结构nightlight 工程按照课程流程本部分操作基于你在上一节中已经创建的nightlightPlatformIO 工程。仓库中提供了完成本课时后的参考实现位于 code-sensor/wio-terminal 目录工程结构如下文件作用src/main.cppArduino 固件主程序setup/loopplatformio.iniPlatformIO 工程配置指定板卡与环境其中 platformio.ini 的内容明确了本固件的编译与烧录目标[env:seeed_wio_terminal] platform atmelsam board seeed_wio_terminal framework arduinoplatform atmelsam使用 Atmel SAM 芯片平台的工具链board seeed_wio_terminal目标板卡为 Seeed Wio Terminalframework arduino以 Arduino 框架开发因此代码中使用pinMode、analogRead、Serial等 Arduino API。正因为board指定为seeed_wio_terminal开发环境才会预定义WIO_LIGHT这类板载引脚宏——它是主板光传感器所连接 GPIO 引脚的编号代码中直接以宏名使用即可无需手动查引脚号。编程步骤读取光传感器1. 在 setup 中配置引脚方向在setup函数末尾添加一行pinMode(WIO_LIGHT, INPUT);这行代码配置了与传感器硬件通信所使用的引脚。WIO_LIGHT是主板光传感器所连 GPIO 引脚的编号将其设为INPUT表示该引脚连接的是一个传感器数据将从该引脚读入设备。对比后续课时控制 LED 时会使用pinMode(WIO_LED, OUTPUT)——传感器方向是 INPUT执行器方向是 OUTPUT这是模拟/数字引脚编程的基本约定。2. 用 analogRead 读取 0~1,023 的模拟值清空loop函数原内容后填入以下代码int light analogRead(WIO_LIGHT); Serial.print(Light value: ); Serial.println(light);逐行说明analogRead(WIO_LIGHT)从WIO_LIGHT引脚读取模拟量内部经过 ADC 转换后返回 0~1,023 的整数存入int变量lightSerial.print(Light value: )写出前缀文本Serial.print结尾不带换行因此同一行的后半部分可以继续追加内容Serial.println(light)追加实际光强数值并换行于是每行输出形如Light value: 344。3. 添加 1 秒延时降低功耗在loop末尾加入delay(1000);光强变化是缓慢的物理量不需要每毫秒连续采样。加入 1,000ms 的延时让设备在两次采样之间空转等待同时降低了整机的功耗——这是 IoT 设备编程中“按需采样”的常见手法。4. 上传并验证将 Wio Terminal 重新连接电脑按此前步骤上传固件然后打开 Serial Monitor。此时遮挡和移开 Wio Terminal 背面的光传感器窗口终端输出会随之变化 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可以看到遮挡时读数跌至个位数4、5移开遮挡后回升到 158 甚至 300 多。数值随环境光连续变化且不同环境下绝对值并不相同这再次印证它是“相对值”而非标准单位。参考实现源码解析仓库提供的完成态固件 main.cpp 完整呈现了上述步骤的最终形态#include Arduino.h void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); pinMode(WIO_LIGHT, INPUT); } void loop() { int light analogRead(WIO_LIGHT); Serial.print(Light value: ); Serial.println(light); delay(1000); }与教程分步操作相比setup中多出的Serial.begin(9600)与while (!Serial);是串口初始化的必要部分以 9,600 波特率开启串口与上面 Serial Monitor 输出中的9600,8,N,1一致并等待串口就绪避免Serial.print在串口未初始化时丢失前几条数据。从源码结构看analogRead读取的电压值即对应课程 README 中 ADC 一节所描述的“参考电压按刻度离散化”过程3.3V 体系下传感器输出电压越高10 位量化后的数值越接近 1,023。小结与下一步Wio Terminal 内置光传感器是一颗光敏二极管驱动的模拟传感器通过 ADC 输出 0~1,023 的相对光强值无标准单位编程套路为三步pinMode(pin, INPUT)配置方向 →analogRead(pin)读取模拟值 →delay(1000)按采样周期延时以控制功耗通过 PlatformIO 的 Serial Monitor 可实时验证读数随遮挡变化这是调试任何模拟传感器的通用手段。下一步课程会在 code-sensor/wio-terminal 的基础上继续演进到执行器部分见 wio-terminal-actuator.md 与 assignment.md当light低于某个阈值参考实现中的虚拟设备版本使用light 300判断见 app.py时点亮 LED从而完成“传感器读数驱动执行器”的完整小夜灯闭环。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考