
IoT-For-Beginners 实战用接近传感器触发水果质量检测——复杂 IoT 应用架构设计与原型实现【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本篇技术指南以 IoT-For-Beginners 课程项目 制造Manufacturing 模块的最后一课为核心讲解如何从单个设备采集数据升级为多设备协作的复杂 IoT 应用围绕一个工厂水果质量检测系统梳理Things事物→ Insights洞察→ Actions动作的参考架构并动手用 VL53L0X 激光测距Time of Flight接近传感器作为触发源驱动摄像头拍照、边缘端 AI 分类、云端存储与 LED 告警的完整链路。读完本文你将掌握复杂 IoT 应用的分层架构设计方法、接近传感器的三种开发平台接入方式Wio Terminal / Raspberry Pi / 虚拟设备以及消息结构定义、多设备模拟与生产化迁移的关键权衡。一、复杂 IoT 应用架构设计Things、Insights 与 ActionsIoT 应用很少只是一个采集数据并上传云端的孤立设备。更多时候它是多个设备协同工作用传感器从物理世界采集数据、基于这些数据做出决策再通过执行器actuator或可视化反过来影响物理世界。官方课程用一个通用模型来概括这种应用见 课程原文Things事物各种设备从传感器采集不同数据可能还会与边缘服务例如图像分类器交互来解读数据随后把数据发送给 IoT 服务Insights洞察来自无服务器应用serverless或对已存储数据执行的统计分析Actions动作下发给设备的命令或让人类做出决策的数据可视化。课程给出的经典例子是发动机发动机Thing发送温度数据这些数据被用来评估发动机是否按预期工作Insight洞察结果被用来主动调整发动机的维护优先级Action。这个模式可以根据需要任意伸缩——增加更多设备和更多服务即可扩展规模。参考 IoT 架构上图就是本课程给出的参考架构reference architecture一种在设计新系统时可以套用的模板架构。当你构建新 IoT 系统时可以按此模板替换成自己的设备和云服务。对照本课程前序内容各组件在 Azure 生态中的落点如下Things为传感器采集数据编写设备端代码用 Custom Vision 在云端和边缘设备上分析图像数据发送到 IoT HubInsights用 Azure Functions 响应发往 IoT Hub 的消息并把数据存入 Azure Storage 供后续分析Actions基于云端决策向设备发送命令来控制执行器并用 Azure Maps 可视化数据。数据与安全贯穿始终在定义系统架构时必须持续考虑数据与安全三个问题设备发送和接收哪些数据这些数据应如何加密与保护设备和云服务的访问权限应如何控制这些问题的答案直接影响消息格式、传输协议如 第 4 课网络协议 涉及的 MQTT/AMQP、设备身份认证方式以及云端存储策略属于架构设计阶段就要敲定的约束而不是开发收尾时才补的功课。二、设计水果质量检测系统把架构落到工厂场景把 Things/Insights/Actions 应用到水果质量检测器上就得到一个端到端的大系统。假设场景加工厂里水果在传送带上运送目前靠人工目检并挑出未熟水果为了降低成本工厂主希望自动化。系统要求是水果到达传送带时被检测到 → 拍照 → 边缘端 AI 模型检查 → 结果发到云端存储 → 若未熟则发出通知。按课程给出的表系统职责划分如下| 角色 | 内容 | | - | - | |Things| 检测传送带上水果到达的探测器拍照并分类水果的摄像头运行分类器的边缘设备通知未熟水果的设备 | |Insights| 决定是否检查水果成熟度存储成熟度分类结果判断是否需要发出未熟水果告警 | |Actions| 向设备发送命令拍照并用图像分类器检查向设备发送命令告警水果未熟 |原型化你的应用原型参考架构包含四个相互协作的环节带接近传感器的 IoT 设备检测到水果到达向云端发消息云端的无服务器应用向另一设备发送命令让它拍照并分类图像带摄像头的 IoT 设备拍照把图片交给边缘端图像分类器结果发回云端云端的无服务器应用存储这些信息供后续分析统计未熟水果比例若水果未熟则向另一 IoT 设备发命令用LED通知工厂工人。需要说明的是这套完整应用理论上可以用单个设备实现把启动图像分类、控制 LED 的逻辑全部内建只用 IoT Hub 记录未熟水果数量并配置设备。本课之所以拆分成多设备是为了演示大规模 IoT 应用的协作概念。原型阶段你要把所有这些逻辑实现在一个设备上若使用微控制器则需要用单独的边缘设备来跑图像分类器。三、用传感器触发质量检测VL53L0X 接近传感器实战IoT 设备需要某种触发器来指示水果已就位、可以分类了。一个自然方案是通过测量与传感器的距离判断水果是否到达传送带上的正确位置。接近传感器通过发射电磁辐射束激光或红外光再检测被物体反射回来的辐射利用发射到返回的时间差计算距离。你可能早就用过它大多数智能手机在通话时贴近耳朵会自动熄灭屏幕防止误触挂断电话靠的正是接近传感器。硬件Grove Time of Flight 距离传感器课程选用Grove Time of Flight 距离传感器VL53L0X采用激光测距模组量程10mm2000mm1cm2m量程内报告值相当准确超过 1000mm 的距离会统一报告为 8109mm作为溢出标记开发时要注意这个边界行为激光测距仪位于传感器背面与 Grove 插座相反的一侧测量时务必对准正确方向这是一款I²C 总线传感器。接线Wio Terminal把 Grove 线一端插入传感器插座只有一种插入方向在 Wio Terminal断电状态下把另一端接到屏幕朝向你时左侧的 Grove 插座即最靠近电源键的插座该插座是数字 I²C 复用口重新连接电脑。接线Raspberry Pi把 Grove 线插入传感器插座Pi断电状态下把另一端接到 Grove Base Hat 上标有I²C的插座底部一排、与 GPIO 引脚相对的一端、靠近摄像头排线槽上电启动。代码实现一Wio TerminalPlatformIO / Arduino仓库中完整的可运行工程位于 code-proximity/wio-terminal核心要点如下。新建名为distance-sensor的 PlatformIO 工程在 platformio.ini 中加入 Seeed 官方 VL53L0X 库依赖[env:seeed_wio_terminal] platform atmelsam board seeed_wio_terminal framework arduino lib_deps seeed-studio/Grove Ranging sensor - VL53L0X ^1.1.1在 main.cpp 中声明传感器实例并初始化#include Arduino.h #include Seeed_vl53l0x.h Seeed_vl53l0x VL53L0X; void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); VL53L0X.VL53L0X_common_init(); VL53L0X.VL53L0X_high_accuracy_ranging_init(); }VL53L0X_common_init()完成 I²C 通信初始化VL53L0X_high_accuracy_ranging_init()将传感器切换到高精度测距模式。主循环中执行单次测距并打印void loop() { VL53L0X_RangingMeasurementData_t RangingMeasurementData; memset(RangingMeasurementData, 0, sizeof(VL53L0X_RangingMeasurementData_t)); VL53L0X.PerformSingleRangingMeasurement(RangingMeasurementData); Serial.print(Distance ); Serial.print(RangingMeasurementData.RangeMilliMeter); Serial.println( mm); delay(1000); }先清零数据结构再调用PerformSingleRangingMeasurement填充测量值RangeMilliMeter字段即距离毫米。烧录后打开串口监视器把物体靠近传感器即可看到读数变化Distance 29 mm Distance 28 mm Distance 30 mm Distance 151 mm代码实现二Raspberry PiPython完整代码见 code-proximity/pi/fruit-quality-detector/distance_sensor.py。先在fruit-quality-detector工程中安装依赖pip install rpi-vl53l0x然后新建distance-sensor.py课程特意强调多个模拟 IoT 设备各自放在独立的 Python 文件中可同时运行import time from grove.i2c import Bus from rpi_vl53l0x.vl53l0x import VL53L0X distance_sensor VL53L0X(bus Bus().bus) distance_sensor.begin() while True: distance_sensor.wait_ready() print(fDistance {distance_sensor.get_distance()} mm) time.sleep(1)Bus().bus取自 Grove 的 I²C 总线库wait_ready()阻塞等待一次测量就绪get_distance()返回毫米级距离。运行python3 distance_sensor.py后控制台输出类似piraspberrypi:~/fruit-quality-detector $ python3 distance_sensor.py Distance 29 mm Distance 28 mm Distance 30 mm Distance 151 mm代码实现三虚拟 IoT 设备CounterFit 仿真无实体硬件时可以用 CounterFit 在桌面端模拟接近传感器代码见 code-proximity/virtual-iot-device/fruit-quality-detector/distance_sensor.py。在已激活虚拟环境的终端安装 shim 包该 shim 通过模拟rpi-vl53l0x的 API 与 CounterFit 通信pip install counterfit-shims-rpi-vl53l0x在 CounterFit Web 应用中创建传感器Sensors面板 →Create sensor框 → Sensor type 选Distance、Units 保持Millimeter由于 VL53L0X 是 I²C 传感器真实硬件的地址硬编码为0x29仿真时也要把地址设为0x29然后点Add。编写并运行代码from counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000) import time from counterfit_shims_rpi_vl53l0x.vl53l0x import VL53L0X distance_sensor VL53L0X() distance_sensor.begin() while True: distance_sensor.wait_ready() print(fDistance {distance_sensor.get_distance()} mm) time.sleep(1)运行python distance-sensor.py然后在 CounterFit 中改动传感器数值或使用随机值观察输出(.venv) ➜ fruit-quality-detector python distance-sensor.py Distance 37 mm Distance 42 mm Distance 29 mm四、水果质量检测器的数据结构设计原型检测器中有多个组件互相通信消息流向如下接近传感器测量到水果的距离发送给 IoT Hub控制摄像头的命令由 IoT Hub 下发到摄像头设备图像分类结果发送回 IoT Hub控制 LED 告警的命令由 IoT Hub 下发到带 LED 的设备。在开始开发前就定义好消息结构是课程强调的工程实践——几乎所有有经验的开发者都曾因为实际发送的数据与期望收到的数据不一致而排查数小时乃至数周。举例来说发送温度信息时 JSON 怎么定义{ temperature: 20.7 }还是用常见缩写{ temp: 20.7 }除了字段名还要考虑单位是 °C 还是 °F如果消费者设备测量温度且用户切换了显示单位你必须保证上传到云端的单位始终保持一致。决策放在设备端还是云端以接近传感器触发图像分类为例IoT 设备测到了距离但决策在哪里做是设备判断水果足够近了然后通知 IoT Hub 触发分类还是设备只上报测距值、由 IoT Hub 决定课程的结论是视情况而定it depends每个用例都不同这正是 IoT 开发者需要理解系统使用方式与数据特征的原因若决策由 IoT Hub 做设备需要发送多次距离测量消息过多会增加 IoT Hub 成本与设备带宽开销工厂里可能有数百万台设备还会拖慢设备本身若决策在设备端做则需要提供设备配置途径来微调触发阈值。五、用开发设备模拟多个 IoT 设备原型需要你的开发套件一人分饰多角同时发送遥测、响应命令。单板计算机Raspberry Pi / 虚拟硬件单板计算机能同时运行多个应用因此可以创建多个应用、每个代表一个 IoT 设备。最简单的方式每个设备一个 Python 文件在不同终端会话中同时运行。注意部分硬件在被多个应用同时访问时无法正常工作。微控制器Wio Terminal微控制器无法同时运行多个应用必须把所有 IoT 设备的逻辑整合进单个应用。课程给出三条降低复杂度的建议按设备建类例如DistanceSensor、ClassifierCamera、LEDController每类自带setup和loop方法由主setup/loop调用集中处理命令命令统一在一个地方接收再按需分发给对应设备类在主loop中统筹时序例如一个设备类每 10 秒处理一次、另一个每 1 秒处理一次那么主loop用 1 秒延时每次loop调用都处理每秒设备的代码同时用计数器累计循环次数计数到 10 时处理每 10 秒设备并将计数器清零。这一节的设计思想与本课原型作业直接对应详见 assignment.md。六、从原型走向生产原型是最终生产系统的基础两者之间有以下关键差异加固组件Ruggedized components生产环境使用能承受工厂噪声、高温、振动与冲击的工业级硬件内部通信Internal communications部分组件直接互相通信避免每次都绕道云端只把需要存储的数据发到云端。实现方式取决于工厂布局——既可以是组件间直连也可以是用网关设备在边缘运行部分 IoT 服务这正是 第 3 课边缘运行水果检测器 的延伸场景可配置项Configuration options每家工厂、每个用例都不同硬件必须可配置。例如接近传感器可能需要在不同距离识别不同水果触发分类的距离阈值不应硬编码而应能通过云端配置——例如使用Device Twin设备孪生机制下发自动化剔除Automated fruit removal生产线上用自动化装置直接剔除未熟水果而不是靠 LED 提示工人。七、课程挑战与作业挑战回顾此前完成的项目思考它们如何映射到本文的参考架构。选一个项目设计一个融合多种能力的更复杂方案并画出架构标注需要的全部设备、服务、传输数据及安全隐私考量。课程给出的参考例子是一个把 GPS 与传感器结合的车辆跟踪设备监测冷藏车温度、发动机启停时间与司机身份——思考涉及哪些设备、哪些服务、传输哪些数据、有哪些安全隐私问题。课后作业完整要求与评分细则见 assignment.md搭建水果质量检测器原型——用接近传感器触发图像分类AI 模型在边缘运行、把分类结果存入存储、依据水果成熟度控制 LED。评分标准涵盖四个维度标准优秀合格待改进配置所有服务成功配置 IoT Hub、Azure Functions 应用与 Azure 存储只配好 IoT HubFunctions 或存储缺一未能配置任何 IoT 云服务监测接近度物体进入预设距离后上报 IoT Hub并通过命令触发摄像头能测距、近距离时上报 IoT Hub且命令成功触发摄像头能测距并上报但命令未能送达摄像头无法测距上报或无法触发命令拍摄图像、分类并把结果发到 IoT Hub能拍照、用边缘设备分类并上报结果能分类但未用边缘设备或结果未能上报完全无法分类依据分类结果通过命令开/关 LED水果未熟时能通过命令点亮 LED命令到达设备但 LED 未受控无法发送控制 LED 的命令 这是本项目的最后一课。完成本课与作业后别忘了清理你的云服务——请先完成作业作业需要这些服务再参照 clean-up.md 中的清理指引释放资源。小结本课把多设备协作的复杂 IoT 应用从概念落到可运行的原型先以Things→Insights→Actions参考架构拆解水果质量检测系统再用 VL53L0X 激光接近传感器作为触发器打通检测到货 → 云端调度 → 拍照分类 → 结果存储 → LED 告警的完整消息链路并对比了 Wio TerminalArduino/PlatformIO、Raspberry PiPython与 CounterFit 虚拟设备三种实现路径。无论最终跑在哪种硬件上先定义消息契约、再权衡设备端/云端决策边界、最后按生产环境要求设计可配置性都是把 IoT 原型做扎实的核心方法论。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考