
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 课核心主题是 IoT 设备如何与物理世界交互**传感器sensors**负责把物理世界的温度、光照、运动等信息转换为电信号交给设备执行器actuators则把设备发出的电信号转换成发光、发声、转动等物理动作。文章会先讲清传感器与执行器的分类与底层电学原理模拟/数字、ADC/DAC、PWM随后带你走完一个完整实战给设备接入光线传感器和 LED构建一个根据环境光照自动亮灭的智能夜灯。读完本文你将理解传感器/执行器的电气工作方式并能在 Wio Terminal、Raspberry Pi 和虚拟设备三种硬件路径上完成可运行的夜灯程序。本文主体内容来自 translations/cs/1-getting-started/lessons/3-sensors-and-actuators/README.md并辅以该课目录下的硬件操作指南与示例代码code-sensor/、code-actuator/进行深化说明。什么是传感器传感器sensor是感知物理世界的硬件设备——它测量周围环境的一项或多项属性并把信息发送给 IoT 设备。由于可测量的对象极多从空气温度这类自然属性到运动这类物理交互传感器的种类非常庞大。常见传感器包括传感器作用温度传感器测量空气或所处环境的温度面向爱好者和开发者的型号常把气压、湿度集成在同一个传感器里按钮检测是否被按下光线传感器检测光照水平可针对特定颜色、紫外线UV、红外线IR或普通可见光摄像头通过拍照或视频流捕捉世界的视觉呈现加速度计检测多个方向的运动麦克风感知声音可以是总体音量水平也可以是定向声音所有传感器的共同点是把感知到的物理量转换为能被 IoT 设备解释的电信号。这个电信号如何被解释取决于传感器本身也取决于它与 IoT 设备通信所用的通信协议本课程后续会介绍 I²C、SPI、UART 等协议。实战把传感器接入设备本课提供了三条硬件路径的接入指南你可以按自己的设备选择Arduino 平台Wio Terminalwio-terminal-sensor.md单板计算机Raspberry Pipi-sensor.md单板计算机虚拟设备 CounterFitvirtual-device-sensor.md三条路径使用的都是光线传感器物理硬件上它是一个基于 [photodiode]光电二极管的模拟传感器输出一个 01023 的整数值来表示相对光照量不映射到 lux 等标准单位。三条路径的核心代码完全一致只是导入的库不同真实 Grove 库 vs CounterFit shim 库下面会逐一展开。传感器类型模拟 vs 数字传感器分为**模拟analog和数字digital**两大类。模拟传感器最基础的传感器大多是模拟传感器IoT 设备向传感器送入一个电压传感器内部元件调整这个电压然后测量传感器返回的电压来得到传感器数值。**背景知识电压Voltage**是衡量推动电荷从一处移到另一处如从电池正极到负极的力的大小。标准 AA 电池为 1.5VV 是伏特的符号。不同电气元件需要不同电压LED 在 23V 即可点亮而 100W 白炽灯泡需要 240V。**电位器potentiometer**是一个典型例子它是一个可以在两个位置之间旋转的旋钮传感器测量旋转角度。IoT 设备向电位器发送一个电压信号例如 5V。当电位器被调节时它改变另一侧输出的电压。想象一个从 0 到 11 的旋钮类似放大器上的音量旋钮当电位器处于完全关闭位置0时输出 0V处于完全打开位置11时输出 5V。返回的电压被 IoT 设备读取后设备即可据此作出响应。取决于传感器类型输出电压可能是任意值也可能映射到标准单位。例如基于**热敏电阻thermistor**的模拟温度传感器其电阻随温度变化输出端电压可以在代码里通过计算转换为开尔文Kelvin再换算成 °C 或 °F。⚠️思考题如果传感器返回的电压比发送的电压更高例如来自外部电源会发生什么⛔️ 切勿实际测试模拟到数字的转换ADCIoT 设备本质上是数字设备——只能处理 0 和 1无法直接处理模拟值。因此模拟传感器的数值必须先转换为数字信号才能被处理。许多 IoT 设备内置模数转换器ADCanalog-to-digital converter传感器也可以通过**连接板connector board**上的 ADC 工作。例如在 Seeed Grove 生态系统中Raspberry Pi 上的模拟传感器连接到安装在 Pi 上方、与 GPIO 引脚相连的hat板上的特定端口该 hat 内置 ADC把电压转换为可从 Pi 的 GPIO 引脚输出的数字信号。具体换算过程举例假设你有一个连接到 3.3V 设备的模拟光线传感器它返回 1V。这个 1V 在数字世界没有意义需要转换。电压会根据设备和传感器按一定刻度换算为模拟值。以 Seeed Grove 光线传感器为例它输出 01023 的值在 3.3V 供电下1V 输出对应数值300。IoT 设备无法把 300 当作模拟值处理因此该值会被 Grove hat 转换为0000000100101100300 的二进制表示再交给 IoT 设备处理。从编程角度看这类转换通常由传感器附带的库完成你无需自己处理Grove 光线传感器在 Python 里调用light属性在 Arduino 里调用analogRead就能直接拿到 300 这个数值。数字传感器数字传感器和模拟传感器一样通过电压变化感知周围世界区别在于它们输出数字信号要么只测量两种状态要么内置 ADC 自行完成转换。数字传感器越来越普及正是为了省去在连接板或 IoT 设备上使用 ADC 的需求。最简单的数字传感器是按钮/开关——一个只有开、关两种状态的传感器。IoT 设备上的 GPIO 引脚可以直接把这种信号读成 0 或 1如果返回电压与发送电压相同读到的值是 1否则是 0。信号无需转换它只能是 0 或 13.3V 进入按钮按钮断开 → 输出 0V → 读到值 03.3V 进入按钮按钮闭合 → 输出 3.3V → 读到值 1关于电压容差电压永远不会完全精确因为传感器内部元件存在电阻所以通常有容差范围。例如 Raspberry Pi 的 GPIO 引脚工作在 3.3V把高于 1.8V 的返回信号读为 1低于 1.8V 读为 0。更高级的数字传感器会读取模拟值再用板载 ADC转换为数字信号。例如数字温度传感器同样使用热电偶、同样测量当前温度下热电偶电阻引起的电压变化但它不返回模拟值、也不依赖设备或连接板做转换而是由传感器内置的 ADC 完成转换并以一串 0 和 1 发送给 IoT 设备——发送方式与按钮的数字信号完全一致1 表示满电压0 表示 0V。发送数字数据还让传感器可以做更复杂的事发送更详细的数据甚至为安全传感器发送加密数据。摄像头就是一个例子——它捕捉图像并作为包含该图像的数字数据通常是 JPEG 等压缩格式发送给 IoT 设备甚至可以逐帧发送完整图像或压缩视频流实现视频流传输。什么是执行器执行器actuator是传感器的反义词——它们把 IoT 设备的电信号转换为与物理世界的交互例如发光、发声或驱动电机转动。常见执行器包括执行器作用LED通电时发光扬声器根据收到的信号发声从简单的蜂鸣器到能播放音乐的音频扬声器步进电机把信号转换为定义好的旋转量例如把旋钮旋转 90°继电器用电信号控制开/关的开关允许 IoT 设备的小电压去控制更大的电压屏幕更复杂的执行器在多段显示屏上展示信息从简单 LED 显示屏到高分辨率视频监视器实战用执行器构建智能夜灯这一步要做的是用光线传感器收集光照水平用执行器LED在检测到光照过低时发光组装成一个 IoT 夜灯。逻辑用伪代码表示为检查光照水平。 如果光照小于 300 打开 LED 否则 关闭 LED按以下指南接入执行器ArduinoWio Terminalwio-terminal-actuator.md单板计算机Raspberry Pipi-actuator.md单板计算机虚拟设备 CounterFitvirtual-device-actuator.md执行器类型模拟 vs 数字与传感器一样执行器也分为模拟与数字两大类。模拟执行器模拟执行器接收模拟信号并将其转换为某种交互交互强度随供给电压变化。典型例子是可调光灯泡——供给灯泡的电压大小决定亮度。和传感器的情况一样真正的 IoT 设备工作在数字信号上。要发送模拟信号IoT 设备需要数模转换器DACdigital-to-analog converter——可以内置在设备上也可以在连接板上。DAC 把 IoT 设备的 0 和 1 转换为执行器可用的模拟电压。⚠️思考题如果 IoT 设备发送的执行器电压超过其承受能力会发生什么⛔️ 切勿实际测试脉冲宽度调制PWM另一种把 IoT 设备数字信号转换为模拟信号的方法是脉冲宽度调制PWMpulse-width modulation发送大量短促的数字脉冲使其表现得像模拟信号。以用 PWM 控制电机转速为例假设用 5V 电源控制一个电机向电机发送一个短脉冲把电压切换到高电平5V并保持 0.02 秒这段时间内电机可旋转十分之一圈36°然后暂停 0.02 秒发送低电平0V。每个开关周期持续 0.04s随后循环重复。这意味着每秒有 25 个 0.02s 的 5V 脉冲驱动电机旋转每个脉冲后跟 0.02s 的 0V 暂停。每个脉冲让电机转十分之一圈因此电机每秒完成 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.04s 周期把开启脉冲缩短一半0.01s关闭脉冲延长到 0.03s。每秒脉冲数25不变但每个开启脉冲只有原来一半长每次只转二十分之一圈于是电机每秒完成 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 时电压降到 0V、LED 熄灭。✅思考题还能想到哪些简单的两状态执行器例如螺线管solenoid——一种电磁体通电后可以移动门闩实现门的上锁/开锁。更高级的数字执行器如屏幕要求数字数据按特定格式发送通常附带库来简化发送正确控制数据的过程。三平台夜灯完整代码实现下面给出三条硬件路径的完整夜灯代码结合光线传感器阈值 300 与 LED 控制全部来自仓库code-sensor/与code-actuator/目录。Wio TerminalArduino / PlatformIOWio Terminal 的光线传感器内置在设备背面、透过透明塑料窗可见直接使用引脚WIO_LIGHT即可。在setup中把WIO_LIGHT配置为INPUT把右侧 Grove 插座对应的数字引脚D0配置为OUTPUT右侧 Grove 插座支持模拟和数字传感器/执行器左侧插座仅用于 I²C 与数字设备#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); }代码要点analogRead(WIO_LIGHT)从板载光线传感器读取 01023 的模拟值光照小于 300 时digitalWrite(D0, HIGH)向D0写高电平值为 1点亮 LED光照 ≥ 300 时写LOW值为 0熄灭 LED向执行器发送数字值时LOW是 0VHIGH是设备最大电压——Wio Terminal 的高电平为3.3Vdelay(1000)让程序每秒采样一次光照无需连续检查降低功耗。完整源码位于 code-actuator/wio-terminal/nightlight/src/main.cpp对应传感器版在 code-sensor/wio-terminal/nightlight/src/main.cpp。PlatformIO 工程配置见 platformio.ini使用atmelsam平台、seeed_wio_terminal板卡与arduino框架。串口监视器9600 波特率会输出类似下面的光照读数用手遮挡/移开传感器时数值随之变化--- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 --- Light value: 4 Light value: 5 Light value: 4 Light value: 158 Light value: 343 Light value: 348 Light value: 344Raspberry PiGrove Base hat PythonGrove 光线传感器通过 Grove 线缆连接到 Grove Base hat 的模拟插座 A0GPIO 引脚旁一排插座中右数第二个Grove LED 模块连接到数字插座 D5。注意 LED 是二极管电流只能单向导通安装时较平的一侧为负极应连接到模块靠中间一侧的孔位圆侧引脚接标有的孔位。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)连接模拟引脚A0GroveLed(5)连接数字引脚D5该 hat 上所有插座都有唯一引脚号引脚 0、2、4、6 是模拟引脚引脚 5、16、18、22、24、26 是数字引脚light属性在 01023 刻度上读取当前光照led.on()/led.off()分别发送数字值 1/0Raspberry Pi 的数字高电平1 值同样是3.3V用python3 app.py运行后控制台输出示例Light level: 634→Light level: 230→Light level: 104……遮住传感器时 LED 应点亮若 LED 不亮检查是否插反、亮度旋钮是否旋到最大。完整源码见 code-actuator/pi/nightlight/app.py传感器版见 code-sensor/pi/nightlight/app.py。虚拟设备CounterFit没有实体硬件时可在 CounterFit 应用中模拟同样的夜灯在Sensors面板创建类型为Light、引脚为0的传感器在Actuators面板创建类型为LED、引脚为5的执行器可用颜色选择器修改 LED 颜色。代码与 Raspberry Pi 版几乎一致只是把库换成 CounterFit shimimport 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) 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)运行后在 CounterFit 中修改光照值直接在Value输入数字后点Set或勾选Random并设置Min/Max让传感器每次返回随机数就能让 LED 在 300 阈值上下翻转。完整源码见 code-actuator/virtual-device/nightlight/app.py 与 code-sensor/virtual-device/nightlight/app.py。挑战与课后作业挑战前两课要求你尽可能多地列出家中、学校或工作场所里的 IoT 设备并判断它们是围绕微控制器microcontroller、单板计算机single-board computer还是两者混合构建的。现在请进一步思考每个设备上连接了哪些传感器和执行器每个传感器与执行器的用途是什么课后作业深入研究传感器与执行器详见 assignment.md。小结传感器把物理量转换为电信号分为模拟与数字两类模拟信号需要经 ADC设备内置或连接板承载转为 0/1 才能被 IoT 设备处理数字传感器则直接输出两状态信号或通过板载 ADC 输出数字数据。执行器把电信号转换为物理动作同样分模拟与数字两类模拟执行器需要 DAC 或PWM来由数字信号驱动PWM 通过调整脉冲宽度占空比可以连续地控制电机转速等模拟量。三条硬件路径Wio Terminal、Raspberry Pi、CounterFit 虚拟设备共享同一套夜灯逻辑读取光照 → 与阈值 300 比较 → 控制 LED 开关示例代码均可直接在仓库 code-sensor 与 code-actuator 目录中找到。理解这些基础后后续课程将在此基础上继续深入连接互联网、搭建更完整的物联网应用可继续浏览 2-farm、3-transport 等模块的实战项目。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考