
从读取光敏传感器到构建夜灯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 仓库第 3 课《Interact with the physical world with sensors and actuators》使用传感器和执行器与物理世界交互展开系统讲解 IoT 设备中传感器与执行器的工作原理模拟量与数字量信号、ADC/DAC 转换、PWM脉宽调制控制并结合仓库内的真实参考代码指导你在 Wio Terminal、Raspberry Pi 或 CounterFit 虚拟设备上亲手构建一个“光感夜灯”项目。读完本文你将掌握模拟/数字传感器与执行器的判断方法、GPIO 引脚读写机制以及一套可直接运行的夜灯实现方案。什么是传感器传感器Sensor是感知物理世界的硬件设备它们测量周围环境的一个或多个属性并将信息发送给 IoT 设备。由于可测量的对象非常多传感器覆盖了从自然属性如空气温度到物理交互如运动的庞杂设备集合。常见的传感器包括温度传感器感知空气温度或其所浸没介质的温度。面向爱好者与开发者的温度传感器常常与气压、湿度合并在单个传感器中按钮感知自己是否被按下光传感器检测光照强度可以是特定颜色、紫外线、红外线或普通可见光摄像头通过拍照或视频流感知视觉世界加速度计感知多个方向上的运动麦克风感知声音可以是整体音量水平也可以是方向性声音。动手想一想你的手机里都有哪些传感器所有传感器都有一个共同点把它们感知到的东西转换为可被 IoT 设备解释的电信号。这个电信号如何被解释取决于传感器本身也取决于传感器与 IoT 设备之间使用的通信协议。连接一个传感器三条硬件路线仓库为本课提供了三条并行的实操路径分别对应微控制器、单板计算机和纯虚拟设备指南文档均位于 1-getting-started/lessons/3-sensors-and-actuators/ 目录下Arduino 路线Wio Terminalwio-terminal-sensor.md单板计算机路线Raspberry Pi Grovepi-sensor.md单板计算机路线CounterFit 虚拟设备virtual-device-sensor.mdWio Terminal使用板载光敏传感器Wio Terminal 路线中使用的传感器是板载的光传感器其内部使用光电二极管photodiode把光转换为电信号。这是一个模拟传感器输出 0 到 1,023 的整数值表示相对光照量不对应勒克斯lux等标准计量单位。传感器位于 Wio Terminal 背面透过透明塑料窗口可见。编程步骤对应指南文档中的任务在 VS Code 中打开上一课创建的 nightlight 项目在setup函数末尾添加pinMode(WIO_LIGHT, INPUT);这行代码配置与传感器通信所用的引脚。WIO_LIGHT是连接板载光传感器的 GPIO 引脚号设置为INPUT表示该引脚连接传感器、数据将从该引脚读出。清空loop函数内容改为int light analogRead(WIO_LIGHT); Serial.print(Light value: ); Serial.println(light);analogRead从WIO_LIGHT引脚读取 0–1,023 的模拟值并通过串口发送到 Serial Monitor。Serial.print不带换行输出因此每行以Light value:开头、以实际光照值结尾。在loop末尾添加delay(1000);。光照水平无需连续检测延时能降低设备功耗。重新连接 Wio Terminal 并上传代码打开 Serial Monitor。遮挡或移开背面的光传感器终端中输出的数值会随之变化Light value: 4 Light value: 5 Light value: 4 Light value: 158 Light value: 343仓库中的完整参考实现位于 code-sensor/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); } void loop() { int light analogRead(WIO_LIGHT); Serial.print(Light value: ); Serial.println(light); delay(1000); }其中Serial.begin(9600)以 9600 波特率初始化串口while (!Serial)循环等待串口就绪Wio Terminal 上串口初始化可能需要短暂时间编译配置见同目录的 platformio.ini。CounterFit 虚拟设备路线无需真实硬件如果不方便使用物理硬件可以用 CounterFit Web 应用创建虚拟传感器在Create sensor面板中选择Sensor type为LightUnits保持NoUnitsPin设为0点击Add即在 Pin 0 上创建光传感器。随后在app.py中引入 CounterFit Grove 模拟库import time from counterfit_shims_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)运行python3 app.py后终端会持续打印光照值初始为 0。在 CounterFit 应用中你既可以在Value输入框手动指定数值并点击Set也可以勾选Random并设置Min/Max范围——每次读取都会得到一个区间内的随机数便于模拟真实环境的光照波动。传感器类型模拟与数字传感器要么是模拟的analog要么是数字的digital。模拟传感器最基础的传感器往往是模拟传感器。它们从 IoT 设备接收一个电压传感器内部元件对这个电压进行调节而 IoT 设备测量传感器返回的电压从而得到传感器读数。 电压voltage衡量的是把电从一个地方推向另一个地方的“推力”大小例如从电池正极到负极。一节标准 AA 电池是 1.5VV 是伏特的符号能从正极以 1.5V 的强度推动电流到负极。不同电气硬件工作需要不同电压LED 在 2–3V 即可点亮而 100W 白炽灯需要 240V。一个典型例子是电位器potentiometer一个可以在两个位置之间旋转的旋钮传感器测量其旋转角度。IoT 设备会以某个电压例如 5V向电位器发送电信号。调节电位器时其另一端输出的电压随之改变。可以把电位器想象成一个从 0 到 11 标号的旋钮就像功放上的音量旋钮完全关闭0时输出 0V完全打开11时输出 5V。 这是对原理的过度简化电位器与可变电阻的细节可在英文资料中进一步查阅。从传感器输出的电压随后被 IoT 设备读取并据此做出响应。这个电压可以是任意值也可以映射到标准单位。例如基于热敏电阻thermistor的模拟温度传感器会随温度改变自身电阻其输出电压可以在代码中被换算为开尔文Kelvin进而换算为 °C 或 °F。⚠️ 思考题如果传感器返回的电压高于设备发送的电压例如来自外部电源会发生什么请不要实际测试这一点。模数转换ADCIoT 设备是数字设备——它们只能处理 0 和 1无法直接处理模拟值。因此模拟传感器的值必须先转换为数字信号才能被处理。许多 IoT 设备内置模数转换器ADC, analog-to-digital converter把模拟输入转换为对应的数字表示传感器也可以经由连接板如 Grove 底座使用 ADC。以 Raspberry Pi 的 Seeed Grove 生态为例模拟传感器连接到插在 Pi 上、连通 Pi GPIO 引脚的“帽子”板hat的特定端口这块底座板上集成有 ADC把电压转换成可以从 Pi GPIO 引脚发出的数字信号。设想一个 3.3V 的 IoT 设备连接了模拟光传感器传感器返回 1V。这个 1V 在数字世界里毫无意义必须转换。电压会按照取决于设备和传感器的标度换算成数字值。例如 Seeed Grove 光传感器输出 0 到 1,023 的值在 3.3V 供电下1V 输出对应的值是 300。IoT 设备无法把 300 当作模拟值处理因此 Grove 底座会把它转换为0000000100101100300 的二进制表示再由 IoT 设备处理。如果还不了解二进制可以花时间研究数字如何用 0 和 1 表示。从编程角度看这些转换通常由随传感器提供的库处理完毕无需自己操心。对 Grove 光传感器你可以使用 Python 库调用light属性也可以使用 Arduino 库调用analogRead得到 300 这样的值——这正是上文 Wio Terminal 与 CounterFit 代码中出现analogRead(WIO_LIGHT)与light_sensor.light的原因。数字传感器数字传感器与模拟传感器一样利用电压变化检测周围世界。区别在于它们输出的是数字信号要么只测量两种状态要么使用内置 ADC。数字传感器越来越普遍可以避免在连接板或 IoT 设备本身上再放 ADC。最简单的数字传感器是按钮或开关——一个只有“开/关”两种状态的传感器。GPIO 等引脚可以直接把它测读为 0 或 1如果发送的电压与返回的电压相同读到的值就是 1否则就是 0。无需转换信号它只能是 1 或 0。 电压从来不是精确的因为传感器内部元件都有一定电阻所以通常存在容差。例如 Raspberry Pi 的 GPIO 引脚工作电压为 3.3V返回信号高于 1.8V 读作 1低于 1.8V 读作 0向按钮送入 3.3V。按钮断开off输出 0V读到值 0向按钮送入 3.3V。按钮接通on输出 3.3V读到值 1。更先进的数字传感器内部读取模拟值再用板载 ADC 转换为数字信号。例如数字温度传感器同样使用热电偶thermocouple同样测量当前温度下热电偶电阻引起的电压变化不同之处在于传感器内置的 ADC 直接把值转换后以一串 0 和 1 的形式发回 IoT 设备——这与按钮的数字信号发送方式一致1 代表满电压0 代表 0V。发送数字数据让传感器可以变得复杂、发送更详细的数据甚至为安全传感器发送加密数据。典型例子是摄像头它捕获图像以 JPEG 等压缩格式的数字数据发送给 IoT 设备读取甚至可以逐帧发送完整图像或发送压缩视频流来实现视频直播。什么是执行器执行器Actuator是传感器的“反向”设备——把 IoT 设备的电信号转换为与物理世界的交互例如发光、发声或驱动电机转动。常见执行器包括LED通电时发光扬声器根据输入信号发声从简单蜂鸣器到能播放音乐的音频扬声器步进电机把信号转换为确定角度的旋转例如把旋钮转过 90°继电器可由电信号开/关的开关让 IoT 设备的小电压控制更大电压的负载显示屏更复杂的执行器在多段式显示上呈现信息从简单 LED 点阵屏到高分辨率视频显示器。动手想一想你的手机里有哪些执行器使用执行器构建一个 IoT 夜灯本课的实战目标为 IoT 设备添加一个由传感器控制的执行器构建一个IoT 夜灯nightlight——它从光传感器采集光照水平当检测到光照过低时用 LED 这个执行器发出光。任务流程即文首的流程图读取光照等级 → 检查是否低于阈值 → 控制 LED。对应仓库内的三条实操指南Wio Terminal 执行器指南Raspberry Pi 执行器指南CounterFit 虚拟设备执行器指南Wio Terminal 夜灯参考代码在传感器代码基础上参考实现 code-actuator/wio-terminal/nightlight/src/main.cpp 增加了三处逻辑把D0配置为输出、读取光照值、按 300 的阈值切换 LED#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); // 光照低于 300点亮 LED } else { digitalWrite(D0, LOW); // 光照充足熄灭 LED } delay(1000); }这里的阈值 300 恰好呼应了前文 ADC 一节Grove 光传感器在 3.3V 下 1V 对应 300即“大约 1V 左右的相对光照”被选作“光线偏暗”的分界点。Raspberry Pi 夜灯参考代码Pi 路线使用 Grove 板载库完整实现见 code-actuator/pi/nightlight/app.pyimport time from grove.grove_light_sensor_v1_2 import GroveLightSensor from grove.grove_led import GroveLed light_sensor GroveLightSensor(0) # 光传感器接 Grove 端口 0 led GroveLed(5) # LED 接 Grove 端口 5 while True: light light_sensor.light # 读取模拟光照值0–1023 print(Light level:, light) if light 300: led.on() else: led.off() time.sleep(1)与 Wio Terminal 版本逐行对应GroveLightSensor(0)相当于analogRead(WIO_LIGHT)的封装Grove 底座内已完成 ADC 转换GroveLed(5)的on()/off()相当于digitalWrite(D0, HIGH/LOW)。CounterFit 虚拟设备夜灯虚拟路线在 Pi 代码基础上增加一步——先初始化与 CounterFit 应用的连接。完整实现见 code-actuator/virtual-device/nightlight/app.pyimport time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor from counterfit_shims_grove.grove_led import GroveLed CounterFitConnection.init(127.0.0.1, 5000) # 连接本机 5000 端口的 CounterFit 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)从源码结构看三条路线共享同一套“Grove 语义”端口 0 的光传感器、端口 5 的 LED、light 300阈值、每秒轮询一次差异只在底层驱动物理 Pi 走grove库Wio Terminal 走 Arduino 原生 API虚拟设备走counterfit_shims_grove模拟层加本地 5000 端口的连接。这种一致性使同一份夜灯逻辑可以近乎无损地在真实硬件与虚拟设备间迁移。执行器类型模拟与数字与传感器类似执行器也分为模拟与数字两类。模拟执行器模拟执行器接收模拟信号并将其转换为某种交互交互的强度随所加电压变化。一个例子是可调光灯具——给灯供应多少电压就决定它有多亮低电压时灯昏暗高电压时灯更亮。与传感器一样IoT 设备本身只处理数字信号。要发送模拟信号设备需要一个数模转换器DAC, digital-to-analog converter直接位于 IoT 设备上或位于连接板上把 0 和 1 转换为执行器可用的模拟电压。⚠️ 思考题如果 IoT 设备发送了执行器无法承受的更高电压会发生什么请不要实际测试。脉宽调制PWM把 IoT 设备的数字信号转换为模拟信号的另一个选择是脉宽调制Pulse-Width Modulation, PWM发送大量短促的数字脉冲让它们在整体上表现得像模拟信号。例如可以用 PWM 控制电机转速。设想你用 5V 电源控制一个电机向电机发送一个短脉冲把电压拉高5V持续 0.02 秒期间电机能转过 1/10 圈36°随后信号暂停 0.02 秒发送低电平0V。每个“开—关”周期历时 0.04 秒然后循环重复。这意味着每秒钟有 25 个 5V 脉冲每个 0.02 秒驱动电机每个脉冲后跟随 0.02 秒的 0V 停转间隙。每个脉冲让电机转 1/10 圈因此电机每秒完成 2.5 圈——用数字信号实现了 2.5 圈/秒、即 150 转每分钟RPM一个非标准的角速度单位的转速25 pulses per second x 0.1 rotations per pulse 2.5 rotations per second 2.5 rotations per second x 60 seconds in a minute 150rpm 当 PWM 信号一半时间导通、一半时间关断时称为50% 占空比duty cycle。占空比按导通时间占周期的百分比度量。改变脉冲的时长即可改变电机速度保持同样的 0.04 秒周期把“开”脉冲减半为 0.01 秒、“关”脉冲增至 0.03 秒。每秒脉冲数不变仍是 25 个但每个开脉冲只有原来一半长度半长脉冲只让电机转 1/20 圈25 脉冲/秒 × 0.05 圈/脉冲 1.25 圈/秒即 75 RPM。仅通过改变数字信号的脉冲速度就把模拟电机的转速减半25 pulses per second x 0.05 rotations per pulse 1.25 rotations per second 1.25 rotations per second x 60 seconds in a minute 75rpm思考题如何让电机尤其是低速时平滑旋转用少量长脉冲配长间隙还是大量极短脉冲配极短间隙 一些传感器也使用 PWM 把模拟信号转换为数字信号。数字执行器数字执行器与数字传感器类似要么只有由高/低电压控制的两态要么内置 DAC可以把数字信号转换为模拟信号。一个简单的数字执行器是 LED设备发送数字信号 1 时高电压使 LED 点亮发送 0 时电压降到 0VLED 熄灭。夜灯项目中的digitalWrite(D0, HIGH/LOW)Wio与led.on()/off()Pi/CounterFit正是这种两态数字执行的典型用法。思考题还有哪些简单的两态执行器一个例子是螺线管solenoid——一种电磁铁可被激活来移动门栓以实现门的锁/解锁。更先进的数字执行器如显示屏要求以特定格式发送数字数据通常配有库来简化正确控制数据的发送。课后挑战与作业挑战前两课的挑战是列出家中、学校或工作场所尽可能多的 IoT 设备并判断它们围绕微控制器、单板计算机还是两者混合构建。本课在此基础上进一步追问你列出的每个设备连接了哪些传感器和执行器每个传感器和执行器的用途是什么作业调研并描述一个可用于 IoT 开发套件的一个传感器和一个执行器覆盖四个维度——它做什么、内部电子/硬件构成、是模拟还是数字、输入或测量的单位与量程。评分标准见 assignment.md每个器件能完整覆盖上述 4 项为“优秀”覆盖 2–3 项为“合格”仅覆盖 1 项为“待改进”。延伸阅读与参考代码索引本课在仓库中的全部配套资源相对仓库根目录课程主文档1-getting-started/lessons/3-sensors-and-actuators/README.md传感器接入指南wio-terminal-sensor.md、pi-sensor.md、virtual-device-sensor.md执行器接入指南wio-terminal-actuator.md、pi-actuator.md、virtual-device-actuator.md传感器参考代码Wio Terminal 版、Pi 版、虚拟设备版夜灯完整实现Wio Terminal 版、Pi 版、虚拟设备版核心要点回顾传感器把物理量变成电信号执行器把电信号变成物理交互模拟设备依赖 ADC/DAC 与数字设备对话PWM 则是用脉冲占空比“模拟”出模拟效果的纯数字方案读懂analogRead/light属性0–1,023 标度、GPIO 的高低电平阈值如 Pi 的 3.3V 引脚以 1.8V 分界与两态执行器控制就掌握了本课夜灯项目从传感器到执行器的完整闭环。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考