ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

IoT-For-Beginners 制造项目收官课:用距离传感器触发水果质量检测的端到端 IoT 架构实战

2026/9/16 16:22:09 拓冰建站 浏览量
IoT-For-Beginners 制造项目收官课:用距离传感器触发水果质量检测的端到端 IoT 架构实战 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 中制造业4-manufacturing项目第 4 课的技术深度解读。本课是水果质量检测系列训练检测器 → 从设备端检测 → 边缘推理 → 传感器触发的收官之作聚焦如何将前面课程学到的单个设备能力组装成一个多设备、多云端服务协同的复杂 IoT 应用以实物Things→ 洞察Insights→ 动作Actions为架构主线用距离传感器触发边缘 AI 图像分类再通过云端下发命令控制 LED 告警。读完本文你将掌握复杂 IoT 应用的原型设计方法、VL53L0X 距离传感器在 Wio Terminal / Raspberry Pi / 虚拟设备三种平台上的接入与编程、消息结构设计原则以及从原型走向生产环境的差异点。课程定位制造项目水果质量检测器的最后一环本课对应制造项目4-manufacturing的第 4 课前序课程依次是1-train-fruit-detector用 Custom Vision 训练熟/未熟香蕉分类器2-check-fruit-from-device从设备端调用云端分类器3-run-fruit-detector-edge把分类器部署到边缘设备或容器上运行。本课的任务是把这些能力拼成一个完整系统检测水果到达 → 触发拍照 → 边缘分类 → 结果入库 → 未熟告警。这也是该项目的最后一课课程明确提示完成本课与作业后应参照 clean-up.md 清理此前创建的 Azure 云端资源作业仍需使用这些服务务必先完成作业再清理。IoT-For-Beginners 第 18 课概览图sketchnote复杂 IoT 应用的架构设计Things、Insights、Actions一个真正的 IoT 应用很少是单台设备采集数据 → 上云这么简单。它往往由多台设备共同协作用传感器从物理世界采集数据基于数据做出决策再通过执行器actuator或可视化反向作用回物理世界。课程用一条简洁的抽象链来概括整个应用实物Things——采集数据的设备。不同的 Thing 采集不同的数据子集设备可能还会与边缘服务交互例如用图像分类器解读图像数据数据随后被发送到 IoT 服务洞察Insights——来自无服务器应用serverless或是对已存储数据运行的 analytics 分析动作Actions——可以是下发给设备的命令也可以是让人做决策的数据可视化。举例发动机Thing上报温度数据 → 据此评估发动机运行是否正常Insight→ 据此主动优化维护排期Action。参考 IoT 架构所谓参考架构Reference Architecture是指可供设计新系统时套用的示例架构在搭建新 IoT 系统时你可以在合适的位置替换成自己的设备与服务。本课的通用参考架构如下把课程中已经用到的 Azure 组件套进这个框架就得到了本课程语境下的参考架构Things—— 你用设备代码从传感器采集数据并用 Custom Vision 在云端和边缘设备上分析图像数据发送到 IoT HubInsights—— 你用 Azure Functions 响应发往 IoT Hub 的消息并把数据存入 Azure Storage 供后续分析Actions—— 你基于云端做出的决策控制执行器、向设备下发命令并用 Azure Maps 做数据可视化。这套模式可以按需任意缩放——设备和服务越多规模越大。数据与安全考量在设计架构的每个环节都要持续回答三个问题设备发送和接收哪些数据这些数据应如何被加密和保护传输中与存储时设备和云服务的访问应如何被控制课程提醒读者反思自己身边的智能家居设备其中多少数据属于个人隐私数据、需要在传输和存储时保密又有哪些数据压根不应该被存储。这一点也直接呼应了本仓库此前课程中关于设备连接加密与访问控制的主题如 6-keep-your-plant-secure。设计水果质量控制系统把抽象概念落地到传送带课程给了一个具体业务场景某加工厂用传送带输送水果工人手工检查并挑出未熟水果。为降低成本工厂希望实现自动化。系统需求是水果到达传送带时被检测到系统拍照并用运行在边缘的 AI 模型检查结果发送到云端存储若水果未熟则发出告警以便剔除。用 Things / Insights / Actions 三层框架映射这个系统层次内容Things传送带上水果到达检测器拍照并分类水果的相机运行分类器的边缘设备未熟水果告警设备Insights决定是否检查水果成熟度存储成熟度分类结果判断是否需要发出未熟告警Actions向设备下发拍照并用图像分类器检查的命令向设备下发水果未熟请告警的命令原型应用架构针对这个场景原型应用的参考架构如下完整消息链路是带proximity 传感器的 IoT 设备检测到水果到达向云端发送检测到水果消息云端无服务器应用向另一台设备下发拍照并分类的命令带相机的 IoT 设备拍摄照片交给运行在边缘的图像分类器随后把结果发送到云端云端无服务器应用存储分类结果用于日后统计未熟占比若水果未熟则向带LED的设备下发命令提醒工厂工人。 课程特别说明整个应用其实可以收敛为单台设备把触发分类与 LED 控制的逻辑全部内置IoT Hub 只用来统计未熟数量与配置设备。这里之所以拆成多设备是为了演示大型 IoT 应用的设计概念。原型阶段你会在单台设备上实现全部逻辑如果使用微控制器则需要另配一台边缘设备运行图像分类器——这些能力你在前面课程中已经基本学完。用距离传感器触发质量检测系统需要一个触发器来告诉 IoT 设备水果到位、可以分类了。最直接的方案是用距离测量判断水果是否处于传送带上的正确位置。距离传感器的工作原理**Proximity 传感器距离传感器**用于测量传感器到物体的距离通常发射一束电磁辐射如激光或红外光再检测从物体反射回来的辐射由发射到回波的时间即可算出距离。课程举了一个人人都体验过的例子智能手机在通话时贴近耳朵会自动熄屏防止脸颊误触挂断电话靠的就是距离传感器。本课使用的是Grove Time of FlightToF距离传感器 VL53L0X其关键参数采用激光测距模块位于传感器背面与 Grove 插座相反的一侧测量范围10mm ~ 2000mm1cm ~ 2m该范围内读数较为准确距离超过 1000mm 时读数固定报告为8109mm可据此判断超量程属于I²C接口传感器。任务在三种开发平台上接入距离传感器课程为三条硬件路线分别提供了配套指南仓库内均附有可运行的完整示例代码见 code-proximity 目录Arduino 路线Wio Terminalwio-terminal-proximity.md单板计算机路线Raspberry Pipi-proximity.md虚拟设备路线CounterFitvirtual-device-proximity.md路线一Wio TerminalPlatformIO C接线把 Grove 线一端插入 ToF 传感器只有一种方向能插入在 Wio Terminal 断电的情况下另一端接入屏幕正对时左侧的 Grove 插座靠近电源键、兼具数字与 I²C 功能的那个再接上电脑。工程配置新建名为distance-sensor的 PlatformIO 工程在platformio.ini中声明 Seeed 的 VL53L0X 库依赖可参考仓库中的 platformio.ini[env:seeed_wio_terminal] platform atmelsam board seeed_wio_terminal framework arduino lib_deps seeed-studio/Grove Ranging sensor - VL53L0X ^1.1.1main.cpp的核心逻辑仓库完整实现见 main.cpp#include Arduino.h #include Seeed_vl53l0x.h Seeed_vl53l0x VL53L0X; void setup() { Serial.begin(9600); while (!Serial) ; // 等待串口就绪 delay(1000); VL53L0X.VL53L0X_common_init(); // 初始化传感器 VL53L0X.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 rpi-vl53l0x接线Grove 线一端接传感器另一端在树莓派断电时接到 Grove Base HAT 上标记I²C的插座位于底部一排、与 GPIO 引脚相对、紧邻摄像头排线槽。上电启动后在 VS Code 中打开fruit-quality-detector代码工程可直接在 Pi 上打开或用 Remote SSH 扩展远程连接安装 Python 库pip install rpi-vl53l0x新建distance-sensor.py。仓库完整示例见 distance_sensor.pyimport time from grove.i2c import Bus from rpi_vl53l0x.vl53l0x import VL53L0X distance_sensor VL53L0X(bus Bus().bus) # 通过 Grove I²C 总线声明传感器 distance_sensor.begin() # 启动传感器 while True: distance_sensor.wait_ready() # 等待数据就绪 print(fDistance {distance_sensor.get_distance()} mm) time.sleep(1)运行注意文件名是distance-sensor.py不要用python3 app.pypython3 distance_sensor.pypiraspberrypi:~/fruit-quality-detector $ python3 distance_sensor.py Distance 29 mm Distance 28 mm Distance 30 mm Distance 151 mm路线三虚拟设备CounterFit虚拟 IoT 设备使用 CounterFit 模拟的距离传感器物理设备对应的同样是带激光测距模块的 VL53L0X在fruit-quality-detector工程中确保虚拟环境已激活安装 CounterFit 的 rpi-vl53l0x shim它模拟了rpi-vl53l0x包的行为pip install counterfit-shims-rpi-vl53l0x启动 CounterFit Web 应用在Sensors面板的Create sensor中把Sensor type选为DistanceUnits保持Millimeter由于该传感器是 I²C 设备将地址设为0x29物理 VL53L0X 也是硬编码在此地址点击Add创建。新建distance-sensor.py仓库完整示例见 distance_sensor.pyfrom 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)在 CounterFit 中修改距离值或启用随机值控制台读数会随之变化(.venv) ➜ fruit-quality-detector python distance-sensor.py Distance 37 mm Distance 42 mm Distance 29 mm 三条路线给出的代码结构高度一致初始化 → 循环读取这是为了让读者在三种硬件之间平滑迁移。距离传感器数据读出来只是第一步后续作业中还要结合前几课的分类器与云端服务把距离阈值触发接入完整消息流。水果质量检测器的数据与消息结构设计原型中有多个组件互相通信proximity 传感器测量到水果的距离发送给 IoT Hub控制相机的命令从 IoT Hub 下发到相机设备图像分类结果被发送回 IoT Hub控制 LED 告警未熟水果的命令从 IoT Hub 下发到 LED 设备。课程强调在动手写应用之前先定义好这些消息的结构。几乎所有有经验的开发者在职业生涯中都曾花上数小时、数天甚至数周排查发送的数据与预期不一致这类 bug。JSON 字段命名与单位一致性以温度数据为例字段叫temperature还是缩写temp{ temperature: 20.7 }{ temp: 20.7 }还要考虑单位是 °C 还是 °F如果消费级设备允许用户切换显示单位必须保证发往云端的数据单位始终一致。课程还布置了一个经典反思题单位换算错误如何导致造价 1.25 亿美元的 Mars Climate Orbiter 坠毁——这正是数据结构约定重要性的极端案例。关键设计权衡决策放在哪里以用 proximity 传感器触发图像分类为例IoT 设备测量到距离后决策在哪里做是设备自行判断水果够近后通知 IoT Hub 触发分类还是设备只上报距离、由 IoT Hub 决策课程的答案是取决于场景。每个用例都不同IoT 开发者必须理解所构建系统的使用方式与数据特征若由IoT Hub 决策需要发送多条距离测量数据消息过多会抬高 IoT Hub 成本与设备带宽占用尤其工厂里可能有数百万台设备还可能拖慢设备若由设备决策则需要提供配置途径以便对设备做细粒度调优这正是走向生产一节中设备孪生 device twin 用武之地的伏笔。用开发设备模拟多个 IoT 设备原型需要开发套件一饰多角既要发送遥测又要响应命令。两条硬件路线的做法截然不同。单板计算机 / 虚拟硬件多应用并行Raspberry Pi 这类单板计算机可以同时运行多个应用因此可以为每个 IoT 设备 各建一个应用来模拟例如把每个设备实现为独立的 Python 文件分别在不同终端会话中运行。⚠️ 注意部分硬件在被多个应用同时访问时会失效。微控制器单应用内分模块微控制器无法同时运行多个应用必须把所有 IoT 设备的逻辑塞进同一个应用。课程给出三条可落地的建议按设备建类例如DistanceSensor、ClassifierCamera、LEDController等类每个类拥有自己的setup与loop方法由主setup/loop函数调用命令集中分发在单一位置处理命令再按需路由到对应的设备类主循环分时调度例如某设备类每 10 秒处理一次、另一类每 1 秒处理一次则主loop使用 1 秒延时每次loop都执行每秒设备的逻辑并用计数器累计循环次数当计数器到 10 时再处理另一个设备并复位计数器。这套类封装 命令路由 分时调度的模式正是把上一节消息流设计落实到微控制器代码上的工程化手段。从原型走向生产环境原型是最终生产系统的起点课程列出了几个典型差异加固型组件使用能耐受工厂噪声、高温、振动与应力环境设计的硬件内部通信部分组件之间直接通信避免每次交互都绕道云端仅把需要存储的数据发到云端。具体做法取决于工厂网络布局——可以是组件直连也可以通过网关设备把部分 IoT 服务下沉到边缘运行可配置选项不同工厂、不同用例参数不同。例如距离传感器可能需要在不同距离上检测不同种类的水果与其把触发分类的距离阈值写死不如**通过云端配置如设备孪生 device twin**下发自动化剔除生产环境不再用 LED 提示工人而是由自动化设备直接移除未熟水果。挑战与课后作业把设计能力用起来本课的课后挑战要求把前几课的项目套进参考架构任选一个已完成的项目构思一个融合多种能力的更复杂方案并画出架构图。示例方向是车辆追踪设备——把 GPS 与传感器组合监控冷藏车温度、发动机启停时间与驾驶员身份思考涉及哪些设备、哪些服务、传输哪些数据以及安全与隐私考量。课后作业要求构建完整的水果质量检测器原型用距离触发边缘 AI 图像分类、把分类结果存入存储、按水果成熟度控制 LED可复用此前所有课程写过的代码。评估标准详见 assignment.md分四档标准优秀合格需改进配置所有服务配置好 IoT Hub、Azure Functions 应用与 Azure 存储配置好 IoT Hub但未配置 Functions 或存储未配置任何云端 IoT 服务监控距离物体距传感器小于预设值时发数据到 IoT Hub并用命令触发相机能测距物体足够近时发消息到 IoT Hub并能下发触发相机的命令能测距并把数据发到 IoT Hub但无法下发触发相机的命令既无法测距发消息也无法触发命令拍摄、分类图像并发送结果到 IoT Hub能拍摄、用边缘设备分类并把结果发到 IoT Hub能分类图像但未用边缘设备或无法把结果发到 IoT Hub无法分类图像根据分类结果用命令开关 LED能用命令在水果未熟时点亮 LED能向设备发命令但无法控制 LED无法下发控制 LED 的命令回顾与延伸IoT 参考架构可查阅 Azure IoT 参考架构相关文档深入理解通用架构中各组件的职责边界设备孪生device twinsIoT Hub 的设备孪生能力可让云端读取/设置设备状态正是通过云端配置生产设备阈值的标准机制OPC-UA工业自动化中机器对机器M2M通信的标准协议值得作为生产环境内部通信的背景知识了解。最后再次提醒本课是制造项目的最后一课完成挑战与作业后请按 clean-up.md 的指引清理此前创建的云端服务避免产生持续费用。至此你已经走完了训练检测器 → 设备端调用 → 边缘推理 → 传感器触发的完整闭环掌握了从单设备编程迈向多设备、多服务协同的复杂 IoT 应用架构设计的核心方法。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考