资讯动态

IoT-For-Beginners 实战作业:基于近程传感器触发的边缘端水果品质检测器

发布时间:2026/9/16 1:03:08 来源:尧图企业网站定制
IoT-For-Beginners 实战作业基于近程传感器触发的边缘端水果品质检测器【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇文章围绕 IoT-For-Beginners 制造单元4-manufacturing第 4 课从传感器触发水果品质检测的结课作业Build a fruit quality detector展开为你完整解析如何把前几课学到的硬件传感、边缘 AI 图像分类、IoT Hub 云服务与 LED 执行器整合成一个端到端的水果品质检测原型。读完本文你将掌握一套传感器触发 → 云端调度 → 边缘分类 → 结果入库 → LED 告警的物联网应用架构思路并清楚知道每一步的验收标准与可复用源码位置。作业目标把零散技术拼装成完整 IoT 应用这是水果品质检测器项目4-manufacturing的最后一课。前面几课你已经分别完成了用 Custom Vision 训练成熟/未成熟水果分类模型1-train-fruit-detector让设备拍照并调用云端的图像分类服务2-check-fruit-from-device把 AI 模型部署到 Azure IoT Edge让分类推理发生在本地网络而不是云端3-run-fruit-detector-edge使用近程Time of Flight传感器测量距离作为检测触发信号4-trigger-fruit-detector。本课作业要求你综合使用前面所有代码搭建一个完整原型原文见 assignment.md用近程传感器监测距离当物体水果进入预设距离时把事件上报给 IoT Hub并由云端下发命令触发相机相机拍照后交给运行在边缘设备上的 AI 模型分类分类结果回传 IoT Hub 并存入 Azure Storage根据水果成熟度通过云端命令控制 LED 点亮/熄灭例如未成熟则点亮告警。 本文档是保加利亚语翻译translations/bg/.../assignment.md英文原文见 4-manufacturing/lessons/4-trigger-fruit-detector/assignment.md。一、先从架构说起Things → Insights → Actions主课文档README.md把复杂 IoT 应用归纳为一条主链Things物/设备采集数据→ Insights洞察/数据分析→ Actions行动/执行器反馈。Things传送带上的水果检测器近程传感器、拍摄并分类水果的相机、运行分类器的边缘设备、提示未成熟水果的告警设备Insights决定是否检查水果成熟度、存储分类结果、判断是否需要告警Actions向相机设备下发拍照并分类命令向告警设备下发水果未成熟命令。具体到水果品质检测原型参考架构iot-reference-architecture-fruit-quality.png中的数据流是带近程传感器的 IoT 设备检测到水果到达发送消息到云端云端 Serverless 应用Azure Functions向另一台设备下发命令拍照并分类带相机的 IoT 设备拍照交给边缘运行的图像分类器推理结果回传云端云端 Serverless 应用把结果存入存储以便后续分析统计未成熟水果占比若水果未成熟则向带 LED 的设备下发命令告警。 主课明确指出整个应用理论上可以做成单设备把分类触发与 LED 控制逻辑全部内建IoT Hub 仅用于统计与配置本课之所以拆成多个设备是为了演示大规模 IoT 应用中的多设备协同概念。因此作业原型中这些角色将由你的开发套件模拟承担。二、作业评分标准四个维度的验收清单作业自带评分表Rubric是判断原型是否达标的最直接依据评分维度优秀Exemplary合格Adequate需改进Needs Improvement配置所有云服务成功搭建 IoT Hub、Azure Functions 应用与 Azure Storage搭建了 IoT Hub但 Functions 或 Storage 未配置未搭建任何 IoT 云服务监测近程并上报触发相机命令能测距物体足够近时向 IoT Hub 发消息并成功下发命令触发相机能测距并上报 IoT Hub但无法向相机下发命令无法测距、无法上报 IoT Hub 或无法触发命令拍照、分类并回传结果能拍照、用边缘设备分类并把结果发到 IoT Hub能分类但未使用边缘设备或结果未回传 IoT Hub无法完成图像分类按分类结果控制 LED通过命令点亮 LED水果未成熟时命令能下发到设备但无法控制 LED无法发送控制 LED 的命令结合主课内容前两个维度涉及本课新增的近程传感器逻辑pi-proximity.md、virtual-device-proximity.md、wio-terminal-proximity.md第三个维度复用第 3 课的边缘分类代码code-classify第四个维度则把第 2 课的设备命令/LED 逻辑2-check-fruit-from-device与本课的近程触发串联起来。三、近程触发Time-of-Flight 传感器与代码实现3.1 传感器选型与工作原理原型使用Grove Time of FlightToF距离传感器 VL53L0X它通过激光测距模块检测距离有效量程为10mm ~ 2000mm1cm ~ 2m量程内数值较为准确超过 1000mm 的读数会被报告为 8109mm可作为超量程特征值判断。该传感器是I²C 接口设备激光测距模块位于传感器背面与 Grove 插座相反的一侧接线与测量时需要注意方向。主课对近程传感器原理的解释是传感器通常发射一束电磁辐射如激光或红外光再探测物体反射回来的辐射通过发射到反弹的时间差计算到物体的距离——这也是智能手机通话时贴近耳朵自动熄屏背后的同款技术。3.2 Raspberry Pi 实现真机仓库提供了完整可运行示例 code-proximity/pi/fruit-quality-detector/distance_sensor.pyimport 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)操作要点详见 pi-proximity.md先安装 Python 依赖pip install rpi-vl53l0x把 Grove 线一端插入 ToF 传感器另一端在 Pi断电时接到 Grove Base Hat 上标有I²C的插座VL53L0X(busBus().bus)使用 Grove I²C 总线声明传感器begin()启动传感器主循环中wait_ready()等待测量就绪get_distance()返回毫米值然后time.sleep(1)控制采样节奏运行文件名是distance_sensor.py注意不要运行app.py典型输出piraspberrypi:~/fruit-quality-detector $ python3 distance_sensor.py Distance 29 mm Distance 28 mm Distance 30 mm Distance 151 mm3.3 虚拟设备实现CounterFit 模拟如果你没有物理硬件可以使用 CounterFit 模拟距离传感器代码见 code-proximity/virtual-iot-device/fruit-quality-detector/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)操作要点详见 virtual-device-proximity.md安装模拟 shimpip install counterfit-shims-rpi-vl53l0x在 CounterFit Web 应用中Create sensor面板选择Distance传感器单位保持Millimeter由于 VL53L0X 是 I²C 设备真实硬件地址固定为0x29因此虚拟传感器地址也填0x29CounterFitConnection.init(127.0.0.1, 5000)建立与 CounterFit 的连接之后的传感器调用全部走 shim代码结构与真机几乎一致。3.4 Wio Terminal 实现单片机单片机方案在 wio-terminal-proximity.md 中要点如下源码见 code-proximity/wio-terminal在platformio.ini中加入库依赖lib_deps seeed-studio/Grove Ranging sensor - VL53L0X ^1.1.1声明传感器对象并初始化#include Seeed_vl53l0x.h Seeed_vl53l0x VL53L0X; // setup() 中 VL53L0X.VL53L0X_common_init(); VL53L0X.VL53L0X_high_accuracy_ranging_init();主循环执行单次测距并输出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); 三种平台Pi / 虚拟设备 / Wio Terminal的测距输出格式完全一致方便你在后续作业中统一处理距离是否足够近的判断逻辑。四、边缘分类与云端链路的代码基础4.1 边缘分类调用示例第 3 课的示例代码 code-classify/pi/fruit-quality-detector/app.py 展示了拍照 → POST 到边缘预测端点 → 解析结果的完整调用链import io import requests import time from picamera import PiCamera camera PiCamera() camera.resolution (640, 480) camera.rotation 0 time.sleep(2) image io.BytesIO() camera.capture(image, jpeg) image.seek(0) with open(image.jpg, wb) as image_file: image_file.write(image.read()) prediction_url URL # 替换为边缘设备上运行的分类服务端点 headers { Content-Type : application/octet-stream } image.seek(0) response requests.post(prediction_url, headersheaders, dataimage) results response.json() for prediction in results[predictions]: print(f{prediction[tagName]}:\t{prediction[probability] * 100:.2f}%)这段代码正是作业中拍照并用边缘设备分类步骤的直接基础把URL替换为部署在边缘的 Custom Vision 容器端点即可复用同一套 REST API与云端版接口一致只是 endpoint 指向本地设备。predictions数组中每条记录包含tagName标签名如 ripe/unripe与probability置信度。4.2 边缘部署清单第 3 课还提供了 IoT Edge 的部署清单示例 code-deployment/deployment/deployment.json并给出了在 IoT Hub 中注册边缘设备、安装 IoT Edge Runtime、导出 Custom Vision 模型为容器并部署的全流程命令详见 3-run-fruit-detector-edge/README.md。作业评分要求用边缘设备分类即意味着分类推理应发生在本地网络Azure IoT Edge而不是每次调用云端这也是该原型的核心考核点之一。五、消息结构与决策位置作业前的数据设计主课特别强调在动手写代码前应先定义好各组件之间的消息结构并想清楚决策在哪里发生。以温度上报为例字段命名temperature还是temp、单位°C 还是 °F都会直接影响下游代码——团队中不少耗时长久的 bug 正源于发送的数据与预期不一致。对水果品质检测器需要定义的消息至少包括近程传感器 → IoT Hub水果到达事件可携带距离值IoT Hub → 相机设备触发拍照命令相机/边缘分类 → IoT Hub分类结果标签 置信度IoT Hub → LED 设备告警命令。另一个关键决策是**距离判断放在设备端还是云端**若由 IoT Hub 决策需要发送多条距离测量消息量增加会推高 IoT Hub 成本、占用设备带宽工厂里可能是百万级设备还可能拖慢设备若由设备端决策则必须提供配置手段例如通过 IoT Hub 的设备孪生/device twin 远程调节触发距离阈值以便现场微调。作业要求物体距离小于预设值时上报 IoT Hub 并触发相机从源码结构看这属于设备端先判断、再决定是否上报的常见原型做法生产环境中两种方案各有适用场景理解其权衡正是本课的学习目标。六、如何在开发套件上模拟多个 IoT 设备作业需要在单个开发套件上扮演多个角色。主课给出了两种策略单板机Raspberry Pi与虚拟设备可以同时运行多个应用。建议把每个设备实现为独立的 Python 文件如distance_sensor.py、相机分类脚本、LED 控制脚本在不同终端会话中同时运行即可。注意部分硬件不允许被多个并发应用同时访问。单片机Wio Terminal不能并发运行多个应用必须把全部角色逻辑放进同一个setup/loop。主课建议每个设备封装成一个类如DistanceSensor、ClassifierCamera、LEDController各自提供setup与loop方法在单一位置处理收到的命令再分发给对应设备类主loop中用统一的时间片调度不同频率的任务例如一个设备每 1 秒处理一次、另一个每 10 秒处理一次则主循环以 1 秒为节拍用计数器累计到 10 再触发慢任务并复位。七、从原型到生产差距与扩展点主课在Moving to production一节指出原型只是生产系统的基础正式落地时通常会有这些差异加固硬件使用能耐受工厂噪音、高温、振动与冲击的工业级组件内部通信部分组件之间直连通信避免每次都绕道云端只有需要存储的数据才上云可通过直连或网关设备在边缘运行部分 IoT 服务实现可配置化不同工厂、不同水果需要不同触发距离不应硬编码阈值而应通过云端例如设备孪生 device twin远程配置自动化剔除生产环境用自动化机械剔除未成熟水果而非 LED 告警。作业原型聚焦于打通链路上述生产化改造是理解架构时的延伸思考方向。八、作业完成后的云资源清理主课明确提醒这是该项目的最后一课完成作业后请清理云服务资源避免持续产生费用。清理步骤可参考仓库根目录的 clean-up.md如删除资源组即可释放其中全部 IoT Hub、Functions、Storage 等资源。清理务必在完成并验证作业之后进行。结语用评分表逐项自检完成作业后建议对照评分表的四个维度逐项验证云服务IoT Hub、Azure Functions、Azure Storage 是否全部可用近程触发链路测距、阈值判断、消息上报、相机命令下发是否闭环边缘分类链路拍照、边缘推理、结果回传 IoT Hub 是否成功LED 告警未成熟水果能否通过命令点亮 LED。仓库中与本文对应的可复用资源包括作业原文、主课文档、Pi 近程代码、虚拟设备近程代码、Wio Terminal 近程工程、边缘分类示例 以及 IoT Edge 部署清单。按此路径你就能把前几课的知识点真正拼装成一个可运行、可验证的完整 IoT 应用原型。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价