IoT-For-Beginners 实战:用传感器与执行器构建光控夜灯(Wio Terminal / Raspberry Pi / 虚拟设备)

发布时间:2026/9/15 15:07:45

IoT-For-Beginners 实战:用传感器与执行器构建光控夜灯(Wio Terminal / Raspberry Pi / 虚拟设备) IoT-For-Beginners 实战用传感器与执行器构建光控夜灯Wio Terminal / Raspberry Pi / 虚拟设备【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文是 IoT-For-Beginners 课程《Interact with the physical world with sensors and actuators》的深度技术解读。课程以传感器 执行器为核心引导你为 IoT 设备接入光敏传感器再依据光照强度驱动 LED最终组装出一个真实的夜灯nightlight项目。读完本文你将理解模拟/数字信号的区别、ADC/DAC/PWM 的底层原理并能在 Wio Terminal、Raspberry Pi 或 CounterFit 虚拟硬件上分别完成传感器采集与执行器控制的全套代码编写。什么是传感器Sensors传感器是感知物理世界的硬件设备——它测量周围的一项或多项属性并把测量结果发送给 IoT 设备。传感器的种类极其丰富因为可被测量的物理量非常多从空气温度这类自然属性到运动这类物理交互都属于传感器的感知范围。常见的传感器包括温度传感器感知空气温度或其所处介质的温度。对爱好者和开发者来说温度传感器常与气压、湿度集成在同一个传感器模块中按钮Button感知何时被按下光传感器检测光照强度可针对特定颜色、紫外线UV、红外线IR或普通可见光摄像头通过拍照或视频流感知世界的视觉信息加速度计Accelerometer感知多个方向的运动麦克风感知声音包括普通音量或特定方向的声音。所有传感器都有一个共同点把感知到的物理量转换为可被 IoT 设备解释的电信号。这个电信号如何被解释取决于传感器本身以及它与 IoT 设备之间的通信协议。传感器分类模拟 vs 数字传感器按输出信号可分为模拟传感器与数字传感器两大类这也是本文后续实操光敏传感器、LED 控制的理论基础。模拟传感器Analog Sensors最基本的传感器大多属于模拟传感器IoT 设备向传感器提供一个电压传感器内部的元件调整这个电压然后 IoT 设备测量从传感器返回的电压从而得到传感器读数。电压小知识电压衡量的是推动电荷从一个地方移动到另一个地方的压力大小。例如一节标准 AA 电池为 1.5VV 是伏特的符号它能以 1.5V 的推力让电流从正极流向负极。不同电子硬件需要不同电压才能工作LED 在 2–3V 就能点亮而一个 100W 的白炽灯灯泡则需要 240V。典型的例子是电位器Potentiometer——一个可以在两个位置之间旋转的拨盘传感器测量其旋转量。IoT 设备向电位器发送一个固定电压如 5V随着拨盘旋转另一端输出的电压随之变化假如你有一个标着 0 到 11 刻度的电位器如同功放上的音量旋钮当电位器处于完全关闭位置0时输出 0V当处于完全打开位置11时输出 5V。传感器返回的电压被 IoT 设备读取后设备即可据此作出响应。根据传感器不同这个电压可以是任意标量值也可以映射到标准单位——例如基于**热敏电阻Thermistor**的模拟温度传感器其电阻随温度变化输出端的电压经过代码中的计算即可换算成开尔文、摄氏度或华氏度。模拟到数字转换ADCIoT 设备本质上是数字设备——它们只能处理 0 和 1无法直接处理模拟值。因此模拟传感器的读数必须先转换为数字信号才能被处理。许多 IoT 设备内置模数转换器ADC将模拟输入转换为数字表示传感器也可以借助连接板上的 ADC 工作。例如在 Seeed Grove 生态中Raspberry Pi 上的模拟传感器连接到一个HAT扩展板上的特定端口该 HAT 通过 Pi 的 GPIO 引脚接入并内置 ADC 把电压转换为可通过 GPIO 发送的数字信号。以 Seeed Grove 光传感器为例它输出 0 到 1,023 的整数值。假设一个使用 3.3V 的 IoT 设备上模拟光传感器返回 1V——1V 在数字世界中没有任何意义需要被转换。在 3.3V 工作电压下1V 输出对应数值 300。IoT 设备无法把 300 当作模拟值处理于是 Grove HAT 把 300 转换为二进制表示0000000100101100300 的二进制形式后再交给 IoT 设备处理。从编程角度看这一转换通常由随传感器提供的库自动完成开发者无需关心细节Grove 光传感器在 Python 中直接读取light属性在 Arduino 中调用analogRead即可拿到 300 这个数值。数字传感器Digital Sensors数字传感器与模拟传感器一样通过电压变化感知周围世界区别在于它们直接输出数字信号——要么只测量两种状态要么内置 ADC。由于不需要连接板或 IoT 设备上额外的 ADC数字传感器正变得越来越普遍。最简单的数字传感器是按钮或开关一个只有开/关两种状态的传感器。IoT 设备上的 GPIO 引脚可以直接把这类信号读作 0 或 1如果返回电压与发送电压相同则读为 1否则读为 0无需任何转换。 电压永远不会绝对精确传感器内部元件总有电阻因此通常存在容差。例如 Raspberry Pi 的 GPIO 引脚工作在 3.3V把高于 1.8V 的返回信号读为 1低于 1.8V 读为 0。3.3V 输入按钮按钮断开输出 0V读到 03.3V 输入按钮按钮接通输出 3.3V读到 1。更高级的数字传感器先读取模拟值再由板载 ADC转换为数字信号。例如数字温度传感器与模拟传感器一样使用热电偶、测量当前温度下热电偶电阻引起的电压变化但区别在于它不返回模拟值而是由传感器内置的 ADC 把读数转换为一串 0 和 1 发给 IoT 设备——其中 1 代表满电压0 代表 0V。数字数据传输还使传感器能够发送更复杂、更详细的数据甚至加密数据。例如摄像头它捕捉图像后以压缩格式如 JPEG的数字数据发送给 IoT 设备甚至可以逐帧发送或传输压缩视频流。动手实践一把光传感器接入 IoT 设备本课程的光传感器基于光电二极管Photodiode把光转换为电信号。它是模拟传感器输出 0–1,023 的整数值表示相对光照强度不映射到勒克斯lux等任何标准单位。根据你的硬件选择对应的接入指南Arduino - Wio Terminal 接入光传感器单板计算机 - Raspberry Pi 接入光传感器单板计算机 - 虚拟设备接入光传感器方案一Wio Terminal内置光传感器Wio Terminal 的光传感器内置在设备中透过背面的透明塑料窗口可见。在上一课创建的 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.print不追加换行因此每行以Light value:开头并以实际光值结尾。在loop末尾加入delay(1000)——光照强度无需连续检测延迟 1 秒可以降低设备功耗。重新连接 Wio Terminal上传代码并打开 Serial Monitor。用手遮住/松开背面的光传感器数值会随之变化Light value: 4 Light value: 5 Light value: 4 Light value: 158 Light value: 343 Light value: 348 Light value: 344方案二Raspberry Pi Grove 光传感器Grove 光传感器是外部传感器需要连接到 Pi 的 Grove Base HAT 上将 Grove 线缆一端插入光传感器模块只有一个方向能插进去在 Pi断电状态下把线缆另一端接到 Grove Base HAT 上的模拟插座A0紧邻 GPIO 引脚那一排、从右数第二个插座。编程步骤如下app.pyimport time from 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)from grove.grove_light_sensor_v1_2 import GroveLightSensor从 Grove Python 库导入传感器驱动类该库在 Pi 系统初始化时已全局安装GroveLightSensor(0)创建连接到A0模拟引脚的实例light_sensor.light属性读取 0–1,023 的当前光照值time.sleep(1)每秒采样一次降低功耗。用python3 app.py运行后遮住/松开传感器观察数值变化piraspberrypi:~/nightlight $ python3 app.py Light level: 634 Light level: 634 Light level: 634 Light level: 230 Light level: 104 Light level: 290方案三CounterFit 虚拟设备无需真实硬件在 CounterFit 应用中创建虚拟光传感器在Create sensor框的Sensor type下拉框选择LightUnits保持NoUnitsPin设为0点击Add创建。编程时使用 CounterFit 的 Grove shim 库API 与真实 Grove 库几乎一致import time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor CounterFitConnection.init(127.0.0.1, 5000) light_sensor GroveLightSensor(0) while True: light light_sensor.light print(Light level:, light) time.sleep(1)注意虚拟设备版本额外增加了CounterFitConnection.init(127.0.0.1, 5000)用于建立与 CounterFit 应用的本地连接对应源码见 code-sensor/virtual-device/nightlight/app.py。在 CounterFit 界面中既可以手动在Value框输入数值并点击Set也可以勾选Random并设置Min/Max范围让传感器每次读取都返回该范围内的随机值。什么是执行器Actuators执行器与传感器正好相反——它们把 IoT 设备的电信号转换为与物理世界的交互例如发光、发声或驱动电机。常见的执行器包括LED通电时发光扬声器根据收到的信号发声从基础蜂鸣器到可播放音乐的音频扬声器步进电机Stepper Motor把信号转换为确定角度的旋转例如把拨盘转动 90°继电器Relay由电信号控制开/关的开关允许 IoT 设备的小电压控制大电压电路屏幕更复杂的执行器在多段显示屏上展示信息从简单的 LED 显示屏到高分辨率视频监视器。执行器分类模拟 vs 数字与传感器一样执行器也分为模拟与数字两类。模拟执行器与 DAC模拟执行器接收模拟信号并转换为某种交互交互效果随供电电压变化。典型例子是可调光灯具供给灯泡的电压高低决定了亮度。但真正的 IoT 设备工作在数字信号上这意味着要发送模拟信号IoT 设备需要数模转换器DAC——要么直接集成在设备上要么位于连接板上把设备的 0/1 转换为执行器可用的模拟电压。⚠️ 想一想如果 IoT 设备发送的执行器无法承受的过高电压会怎样千万不要实测。脉冲宽度调制PWM把 IoT 设备的数字信号转换为模拟信号的另一条路径是脉冲宽度调制PWM通过发送大量极短的数字脉冲让信号表现得像模拟信号。PWM 常被用来控制电机转速。例如用 5V 电源控制一个电机发送一个短脉冲把电压拉高到 5V 并持续 0.02 秒此时电机可旋转十分之一圈36°随后信号暂停 0.02 秒输出低电平 0V每个开 关周期持续 0.04 秒不断重复。一秒钟内有 25 个 0.02 秒的 5V 脉冲驱动电机旋转每个脉冲后还有 0.02 秒的 0V 暂停。每个脉冲让电机旋转十分之一圈即电机每秒完成 2.5 圈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但每个开启脉冲长度减半。半长的脉冲只让电机旋转二十分之一圈每秒 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 时电压降到 0VLED 熄灭。✅ 还能想到哪些简单的两状态执行器例如电磁阀Solenoid——一种电磁铁通电后可推动门闩实现开锁/闭锁。更高级的数字执行器如屏幕需要按特定格式发送数字数据通常厂商会提供库来简化正确的数据发送。动手实践二用 LED 执行器组装夜灯夜灯的逻辑非常简单伪代码Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off整体数据流如下光传感器持续读取光照水平主控芯片判断读数是否低于阈值 300进而控制 LED 的亮灭。方案一Wio Terminal Grove LEDGrove LED 模块附带多种颜色的 LED 供选择挑选心仪的 LED把两个引脚插入模块的孔位。LED 是二极管电流只能单向通过必须正确区分正负极LED 一侧稍扁扁的一侧是负极把圆润一侧的引脚对准模块外侧标有的插座扁的一侧插入靠近模块中心的插座。用小型十字螺丝刀把模块上的亮度旋钮逆时针拧到最大。插入 Grove 线缆并在 Wio Terminal 断电状态下连接到右侧Grove 插座屏幕朝自己时、离电源键最远的那个。右侧插座支持模拟和数字传感器/执行器左侧插座仅支持 I²C 与数字设备I²C 在后续课程讲解。编程在setup与loop中补充pinMode(D0, OUTPUT);D0是右侧 Grove 插座的数字引脚设为OUTPUT表示连接执行器、向引脚写入数据。在loop的delay之前加入控制逻辑if (light 300) { digitalWrite(D0, HIGH); } else { digitalWrite(D0, LOW); }当光照值小于 300 时向D0写HIGH值为 1点亮 LED否则写LOW值为 0熄灭 LED。 向执行器发送数字值时LOW 为 0VHIGH 为设备最高电压Wio Terminal 的 HIGH 电压为 3.3V。上传代码后打开 Serial Monitor遮住/松开光传感器即可观察到 LED 随光照切换亮灭完整实现见 code-actuator/wio-terminal/nightlight/src/main.cpp工程配置见同目录 platformio.ini基于seeed_wio_terminal开发板与 Arduino 框架Light value: 4 Light value: 5 Light value: 4 Light value: 158 Light value: 343 Light value: 348 Light value: 344方案二Raspberry Pi Grove LED同样先把 LED 插到模块上注意方向并调大亮度旋钮在 Pi断电状态下把 Grove 线缆接到 Grove Base HAT 的数字插座D5紧邻 GPIO 引脚那排、从左数第二个插座。在上一节app.py的基础上追加from grove.grove_led import GroveLed led GroveLed(5)在while循环中、time.sleep之前加入判断if light 300: led.on() else: led.off() 所有插座都有唯一的引脚号0、2、4、6 是模拟引脚5、16、18、22、24、26 是数字引脚。GroveLed(5)即连接数字引脚 D5。 向执行器发送数字值时0 对应 0V1 对应设备最高电压Pi 搭配 Grove 传感器/执行器时该电压为 3.3V。 这段代码必须与print(Light level:, light)保持相同缩进以确保位于while循环内部。完整实现见 code-actuator/pi/nightlight/app.py其中GroveLightSensor(0)读取 A0 引脚、GroveLed(5)控制 D5 引脚主循环每秒采样一次并更新 LED 状态。若 LED 不亮请检查方向是否正确、旋钮是否拧到最大。方案三CounterFit 虚拟设备在 CounterFit 应用的Create actuator中选择LEDPin设为5点击Add创建虚拟 LED创建后可用Color取色器改变颜色并点击Set生效。程序在虚拟光传感器版本基础上增加 LED 驱动import 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)运行python3 app.py后在 CounterFit 界面中把光照值在 300 上下反复调整手动设置Value或使用Random范围即可看到虚拟 LED 随之点亮与熄灭。完整实现见 code-actuator/virtual-device/nightlight/app.py。小结信号转换链至此可以看到一个典型的传感器/执行器项目其实是一条完整的信号转换链感知模拟光传感器把光照强度映射为输出电压数字化IoT 设备或 Grove HAT/连接板上的 ADC把模拟电压量化为 0–1,023 的整数值决策主控芯片比较读数与阈值300输出数字信号驱动digitalWrite/led.on()输出高/低电平直接把数字信号作用于数字执行器 LED若驱动的是模拟执行器如调光或电机则需 DAC 或 PWM 把数字信号转换为模拟效果。传感器与执行器都遵循模拟/数字的二分法模拟端依赖电压大小传递信息需要 ADC/DAC 桥接数字端直接用高低电平0/1或内置转换器通信。PWM 则是用高速数字脉冲伪造模拟信号的高效手段——这正是本文夜灯项目背后全部的理论支撑。课后挑战与作业挑战前两课的挑战是列出家中、学校或工作场所里尽可能多的 IoT 设备并判断它们基于微控制器还是单板计算机或两者混合。现在为列出的每台设备补充它连接了哪些传感器和执行器每个传感器和执行器的用途分别是什么作业研究传感器与执行器——选择一种可配合 IoT 开发套件使用的传感器和一种执行器分别描述它的作用、内部使用的电子元件/硬件、是模拟还是数字、输入/测量值的单位与范围。评分标准要求四项信息完整才达到优秀Exemplary等级。延伸学习可继续阅读课程配套的 模拟传感器接线与读数细节、Wio Terminal 传感器指南、Pi 执行器指南 与 虚拟设备执行器指南并通过 quiz-app 检验学习成果。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/15 15:02:44

ERA5数据喂不进WRF?四步打通WPS前处理全链路

1. 为什么WRF用户普遍卡在ERA5数据这一步——不是数据难找,而是“对不上号”WRF(Weather Research and Forecasting Model)跑不起来?气象模拟结果发散、初始场偏移、边界条件震荡?先别急着调参数、改物理方案——我带过…

2026/9/15 15:02:44

前端AI编程工具选型实战指南:聚焦框架语义与工程约束

1. 这不是又一份“AI编程工具排行榜”,而是一份前端工程师写给自己的决策手记2026年,我坐在工位上改第7个Vue3组件的响应式逻辑时,突然意识到:过去三年里,我花在调试ref与reactive边界问题上的时间,已经超过…

2026/9/15 15:17:46

ML-KNN多标签学习算法详解:从贝叶斯后验概率到Python实践

如果你在业务里碰到这种任务:一篇文章同时属于“科技”和“互联网”,一张图里既有“人”又有“车”,一首歌的情感标签是“快乐”但又带一点“激动”——这种任务再硬拆成多个二分类往往效果很一般,因为它们本质上是多标签学习&…

2026/9/15 15:17:46

小样本物体检测实战指南:从原理到工业落地

1. 什么是小样本物体检测:不是“数据少就叫小样本”,而是“少得有讲究”小样本物体检测(Few-Shot Object Detection,FSOD)这个词最近在CV圈里频繁刷屏,但很多人一听到“小样本”,下意识就觉得是…

2026/9/15 15:17:46

AI开发文档驱动:从接口定义到工程流交付的实战指南

开头今年我司内部逐渐停掉了“让算法工程师自己写完推理脚本再丢给后端”的合作方式,全面转向文档驱动的AI工程流交付。这个转变不是某个人拍脑袋决定的,而是被几个翻车项目硬生生逼出来的:一次是模型精度没问题、接口却对不上字段&#xff0…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码