十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于传感器触发的 IoT 水果质量检测系统架构实战:IoT-For-Beginners 第 4 课

基于传感器触发的 IoT 水果质量检测系统架构实战:IoT-For-Beginners 第 4 课 基于传感器触发的 IoT 水果质量检测系统架构实战IoT-For-Beginners 第 4 课【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本篇文章围绕 IoT-For-Beginners 课程体系「Manufacturing制造业」项目中的第 4 课4-trigger-fruit-detector/README.md展开讲解如何把一个单一设备的数据采集应用扩展为「多设备 多云服务 执行器响应」的复杂 IoT 应用通过距离传感器触发图像分类、在边缘运行 AI 模型、将结果上报云端存储并根据成熟度控制 LED 告警。读完本文你将掌握参考架构Things / Insights / Actions的设计方法、近距传感器的接入与编程Wio Terminal、Raspberry Pi 与虚拟设备三套方案、多设备消息结构定义以及如何用开发套件模拟多个 IoT 设备并平滑演进到生产环境。复杂 IoT 应用的架构设计真实的 IoT 应用很少是「一台设备采集数据并上传云端」这么简单更多时候是多台设备协同工作通过传感器采集物理世界的数据、基于数据做决策、再通过执行器或可视化与物理世界交互。一个通用的抽象模型可以概括为三个角色Things物设备从传感器采集数据可能借助边缘服务例如图像分类器解释数据并将数据发送到 IoT 服务Insights洞察由无服务器应用或对存储数据的分析产生Actions行动可以是下发给设备的命令也可以是供人类决策的数据可视化。一个典型的例子发动机Thing上报温度数据系统评估发动机是否按预期工作Insight从而主动调整维护计划的优先级Action。参考 IoT 架构参考架构reference architecture是一种可用于设计新系统的范例架构。当你从零搭建 IoT 系统时可以遵循它并将自己的设备与服务代入对应位置Things设备采集传感器数据可结合边缘服务如图像分类器解读数据再发送到 IoT 服务Insights来自无服务器应用或对已存储数据的分析Actions下发给设备的命令或帮助人类决策的数据可视化。把本课程已覆盖的组件代入参考架构见上图中的 Azure 版本Things你已经编写了从传感器采集数据的设备代码并用 Custom Vision 在云端和边缘设备上分析图像数据发送到 IoT HubInsights你使用 Azure Functions 响应发送到 IoT Hub 的消息并将数据存储到 Azure Storage 供后续分析Actions你根据云端决策向设备下发命令来控制执行器并使用 Azure Maps 进行数据可视化。这一模式可以按需扩缩——无论增加多少设备与服务结构都可以保持成立。数据与安全在定义系统架构时需要始终考虑数据与安全设备发送和接收哪些数据这些数据应如何加密与保护传输中、存储时设备和云服务的访问应如何控制思考你自己拥有的 IoT 设备其中多少数据属于个人隐私、应当保密哪些数据根本不应该存储设计一个水果质量检测系统现在把 Things / Insights / Actions 的想法应用到水果质量检测器上设计一个完整的端到端应用。业务场景加工厂里水果在传送带上运送目前靠人工检查并挑出未成熟的水果。为了降低成本工厂希望实现自动化——水果到达传送带时被检测到拍照后用运行在边缘的 AI 模型检查结果发送到云端存储如果水果未成熟则给出通知以便移除。将系统拆解为三层| | | | - | - | |Things| 检测水果到达传送带的探测器拍照并分类水果的相机运行分类器的边缘设备通知未成熟水果的设备 | |Insights| 决定是否检查水果成熟度存储成熟度分类结果判断是否需要发出未成熟告警 | |Actions| 向设备发送命令拍照并用图像分类器检查向设备发送命令告警「水果未成熟」 |原型应用架构上图是原型应用的参考架构工作流程如下带近距传感器的 IoT 设备检测到水果到达向云端发送「已检测到水果」消息云端无服务器应用向另一台设备发送命令让其拍照并分类图像带相机的 IoT 设备拍照发送给运行在边缘的图像分类器结果再发回云端云端无服务器应用存储该信息供后续分析例如统计未成熟水果占比若水果未成熟则向另一台 IoT 设备发送命令通过 LED 告警工厂工人。 这个完整的 IoT 应用也可以实现为单台设备把所有启动图像分类、控制 LED 的逻辑内建其中IoT Hub 仅用于统计检测到的未成熟水果数量并配置设备。本课特意将其拆开是为了演示大规模 IoT 应用的设计思路。在原型实现中所有逻辑都在一台设备上完成如果使用微控制器则需要一台独立的边缘设备运行图像分类器。前几课学到的大部分技能在这里都能复用。从传感器触发水果质量检测IoT 设备需要一个触发信号来指示「水果可以开始分类了」。一种方案是测量水果在传送带上的位置通过测量到传感器的距离判断水果是否到达了正确位置。近距传感器proximity sensor用于测量传感器到物体之间的距离。它们通常发射一束电磁辐射如激光或红外光然后检测从物体上反弹回来的辐射。通过计算激光束发出到信号返回的时间差即可算出到传感器的距离。 你很可能已经在不知不觉中使用过近距传感器多数智能手机在贴耳通话时会关闭屏幕防止耳垂误触挂断电话——这正是近距传感器检测到屏幕附近有物体后禁用触摸功能。任务用距离传感器触发水果质量检测按照对应硬件的指南用近距传感器检测物体Arduino - Wio Terminal单板计算机 - Raspberry Pi单板计算机 - 虚拟设备硬件Grove 飞行时间Time of Flight距离传感器三套方案使用的都是 Grove Time of Flight 距离传感器VL53L0X采用激光测距模块检测距离测量范围为10mm ~ 2000mm1cm ~ 2m该范围内读数比较准确超过 1000mm 时报告值为8109mm激光测距仪位于传感器背面与 Grove 插座相反的一侧这是一款I²C 接口传感器。连接方式Wio Terminal断开电源后将 Grove 线缆插入 Wio Terminal 左侧的 Grove 插座面向屏幕时最靠近电源键、同时支持数字与 I²C 的插座Raspberry Pi断电后将 Grove 线缆插入 Grove Base HAT 上标有I²C的插座底部一行、与 GPIO 引脚相对的一端、紧邻摄像头排线槽。方案一Raspberry PiPython rpi-vl53l0x先安装 Python 包基于 code-proximity/pi/fruit-quality-detector/distance_sensor.pypip install rpi-vl53l0x在项目fruit-quality-detector中新建distance-sensor.py用不同 Python 文件分别模拟多个 IoT 设备再同时运行是模拟多设备的简便方式代码如下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)grove.i2c.Bus提供 Grove I²C 总线访问VL53L0X是针对传感器核心硬件的 Python 库wait_ready()等待传感器准备好一个可读的值get_distance()返回以毫米为单位的距离运行方式python3 distance_sensor.py注意文件名是distance-sensor.py不要用app.py。预期输出示例Distance 29 mm Distance 28 mm Distance 30 mm Distance 151 mm方案二虚拟 IoT 设备CounterFit在虚拟环境下安装 CounterFit 的距离传感器 shim它模拟了rpi-vl53l0x包pip install counterfit-shims-rpi-vl53l0x在 CounterFit Web 应用中创建传感器Create sensor面板选择Distance类型Units保持Millimeter由于是 I²C 传感器将地址设置为0x29物理 VL53L0X 传感器硬编码此地址。代码基于 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)在 CounterFit 中修改距离值或使用随机值即可看到读数变化Distance 37 mm Distance 42 mm Distance 29 mm方案三Wio TerminalPlatformIO Seeed VL53L0X 库新建 PlatformIO 项目distance-sensor在 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完整实现基于 code-proximity/wio-terminal/distance-sensor/src/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(); } 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); }要点VL53L0X_common_init()初始化传感器VL53L0X_high_accuracy_ranging_init()启用高精度测距模式PerformSingleRangingMeasurement()将测量结果填充到VL53L0X_RangingMeasurementData_t结构体中通过RangeMilliMeter字段读取毫米距离编译上传后用串口监视器即可看到与 Raspberry Pi 方案相同的输出Distance 29 mm等。 三套方案的完整代码分别位于4-manufacturing/lessons/4-trigger-fruit-detector/code-proximity/下的pi/、virtual-iot-device/、wio-terminal/目录。水果质量检测器所用的数据原型检测器包含多个相互通信的组件消息流向如下近距传感器测量到水果的距离并发送到 IoT Hub控制相机的命令从 IoT Hub 下发到相机设备图像分类结果发送回 IoT Hub控制 LED 告警的命令从 IoT Hub 下发到带 LED 的设备。在开始构建应用之前最好先定义清楚这些消息的结构——几乎所有有经验的开发者都曾因「实际发送的数据与预期不符」而排查数小时甚至数天的 bug。例如发送温度信息时JSON 字段命名如何定义用temperature还是常见缩写temp{ temperature: 20.7 }对比{ temp: 20.7 }还要考虑单位温度是 °C 还是 °F如果用户用消费级设备并切换了显示单位必须保证发送到云端的单位保持一致。回到水果质量检测器你会如何定义每条消息在哪里分析数据、决定发送什么数据例如用近距传感器触发图像分类时——决策在哪里做是设备判断「水果足够近」然后发送消息让 IoT Hub 触发分类还是设备只上报距离测量值、由 IoT Hub 决策答案取决于具体场景每个用例都不一样。这正是 IoT 开发者需要理解系统本身、使用方式与所测数据的原因如果由 IoT Hub 决策就需要发送多条距离测量值消息过多会增加 IoT Hub 的成本与 IoT 设备的带宽占用工厂里可能有数百万台设备还可能拖慢设备本身如果在设备端决策则需要提供配置手段来微调机器参数。用开发者设备模拟多个 IoT 设备构建原型时你的 IoT 开发套件需要扮演多个设备既要发送遥测也要响应命令。在 Raspberry Pi 或虚拟 IoT 硬件上模拟多设备单板计算机如 Raspberry Pi可以同时运行多个应用程序因此可以通过**创建多个应用每个「IoT 设备」一个应用**来模拟多设备。例如把每个设备实现为独立的 Python 文件在不同终端会话中分别运行。 注意某些硬件在被多个同时运行的应用程序访问时可能无法正常工作。在微控制器上模拟多设备微控制器模拟多设备要复杂得多与单板计算机不同你无法同时运行多个应用必须把所有设备的逻辑放进同一个应用中。以下建议可让这一过程更顺利每个 IoT 设备对应一个或多个类——例如DistanceSensor、ClassifierCamera、LEDController每个类有自己的setup和loop方法由主setup和loop函数调用在单一位置处理命令再按需分发到对应的设备类在主loop函数中要考虑每个设备的时序。例如一个设备类需要每 10 秒处理一次另一个需要每 1 秒处理一次那么主loop使用 1 秒延时每次loop调用触发需要每秒处理的设备代码并用计数器累计循环次数计数达到 10 时再处理另一个设备然后重置计数器。迈向生产环境原型将成为最终生产系统的基础。投入生产时的主要差异包括加固组件使用为工厂噪声、高温、振动与压力而设计的硬件内部通信部分组件直接通信避免每次都绕道云端只把需要存储的数据发送到云端。具体方式取决于工厂布局——可以是直接通信也可以通过网关设备在边缘运行部分 IoT 服务配置选项每个工厂与用例各不相同硬件需要可配置。例如近距传感器可能需要在不同距离检测不同水果不应硬编码触发分类的距离而应能通过云端配置例如使用设备孪生device twin自动化水果移除不再用 LED 提示未成熟水果而是由自动化设备直接将其移除。✅ 思考除了以上几点生产设备与开发套件还有哪些差异挑战与课后作业挑战回顾之前的项目它们如何融入上文展示的参考架构任选一个已完成的项目设计一个比原项目更复杂、融合多种能力的方案画出架构图并列出所需的所有设备与服务。例如一个结合 GPS 与传感器的车辆追踪设备监控冷藏卡车温度、发动机启停时间、司机身份——涉及哪些设备、哪些服务、传输哪些数据、有哪些安全与隐私考量作业详见 assignment.md构建水果质量检测器——综合运用之前所有课程所学基于近距检测触发图像分类AI 模型运行在边缘、将分类结果存入存储、根据水果成熟度控制 LED。评分标准包括能否配置好 IoT Hub / Azure Functions / Azure Storage 全套云服务能否在物体进入预设距离时向 IoT Hub 发送消息并通过命令触发相机能否拍摄图像、用边缘设备分类并上报结果能否根据分类结果通过命令控制 LED 开关。 注意这是本项目的最后一课。完成本课与作业后请记得清理云服务资源作业需要用到这些服务请先完成作业清理步骤参见 clean-up.md。延伸学习建议深入了解 IoT 架构设计可参考 Azure IoT 参考架构文档Microsoft Learn 上的 IoT reference architecture了解设备孪生可阅读 IoT Hub 文档中关于理解与使用设备孪生的章节了解 OPC-UA——工业自动化中使用的机器对机器通信协议。结合本课内容你可以把此前各课中分散的能力——传感器数据采集Things、Azure Functions 与 Azure Storage 处理与存储Insights、命令下发与 LED 控制Actions、Custom Vision 图像分类云端 边缘——统一编排到一个完整的水果质量检测原型中并理解它在真实工厂场景下的生产化演进路径。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表