拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门