基于STM32设计的工地扬尘与噪音实时监测系统(OneNet)

1,103 阅读29分钟

一、前言

1.1 项目介绍

【1】项目功能介绍

随着城市建设和工业化的快速发展,工地施工过程中的扬尘和噪音问题日益突出,对周边环境和居民生活造成了一定程度的影响。为了解决这一问题,提高工地施工环境的监测和管理水平,当前设计了基于STM32的工地扬尘与噪音实时监测系统。该系统能够实时监测工地的灰尘浓度、空气质量以及噪声信息,通过控制水泵喷水降尘和提示管理员进行现场管理,有效地降低了粉尘浓度和噪音对周边环境的影响。同时,该系统还能够将监测数据上传到OneNet物联网云平台,方便用户随时随地查看工地环境信息,提高了工地施工的透明度和管理效率。

在该系统中,采用了STM32F103RCT6作为主控芯片,采用了ESP8266作为WIFI模块,通过MQTT协议连接到物联网云平台,实现了数据的远程传输和监控。项目的开发背景是基于工地施工环境的实际需求,目的是为了提高工地环境监测水平,降低施工对周边环境的影响,提高施工管理效率,为未来的智慧工地建设提供有力的支持。

image-20240625150745460

【2】项目硬件模块组成

这个工地扬尘与噪音实时监测系统的硬件模块主要包括以下几个组成部分:

(1)主控芯片:采用 STM32F103RCT6,作为系统的核心控制单元,负责数据采集、处理和控制策略的执行。

(2)WIFI 模块:采用 ESP8266 作为无线通信模块,用于连接到物联网平台。通过 MQTT 协议与 OneNet 物联网云平台进行通信,将采集到的环境信息上传到云端。

(3)灰尘传感器:用于检测扬尘的浓度。可以选择合适的粉尘传感器,例如激光散射式粉尘传感器或颗粒物传感器。它会实时采集空气中的灰尘浓度,并将数据传输给主控芯片进行处理。

(4)噪声传感器:采用声音拾取麦克风传感器,用于检测噪声水平。传感器将环境中的声音信号转换为电信号,并发送给主控芯片进行分析。

(5)水泵控制模块:当灰尘浓度超过设定的阈值时,主控芯片通过控制水泵实现喷水降低空气中的粉尘浓度。水泵控制模块负责接收主控芯片的指令,并控制水泵的开关状态。

(6)智慧大屏:在 OneNet 物联网云平台设计一个智慧大屏,用于展示工地现场的环境信息,包括灰尘浓度、空气质量、噪声信息等。智慧大屏会接收物联网平台传输过来的数据,并进行实时显示和提示。

1.2 设计思路

(1)传感器数据采集:通过使用粉尘传感器和声音拾取麦克风传感器,实时采集工地的灰尘浓度和噪声信息,并将数据传输给STM32主控芯片。

(2)数据处理与判断:STM32主控芯片接收到传感器数据后,进行数据处理和判断,根据预设的阈值范围,判断灰尘浓度和噪声是否超标。

(3)控制措施实施:如果灰尘浓度超标,主控芯片控制水泵向空气中喷水,降低粉尘浓度;如果噪声超标,智慧大屏显示提示信息,提示管理员进行现场管理。

(4)数据上传与展示:主控芯片将处理后的环境信息通过ESP8266模块上传到OneNet物联网云平台,用户可以通过智慧大屏查看各种环境信息,包括灰尘浓度、空气质量、噪声等。

整体设计思路:

(1)确定系统需求:根据工地扬尘和噪音监测的需求,确定需要实时监测灰尘浓度、空气质量和噪声信息,并根据阈值进行相应的控制和提示。

(2)硬件选型:选择STM32F103RCT6作为主控芯片,具备足够的处理能力和接口资源;ESP8266作为Wi-Fi模块,用于与OneNet物联网云平台进行通信;声音拾取麦克风传感器用于噪声检测,粉尘传感器用于灰尘浓度检测。

(3)传感器数据采集:通过STM32F103RCT6的GPIO接口连接传感器,采集灰尘浓度和噪声信号的模拟量数据。

(4)数据处理与控制:将采集到的传感器数据进行处理,判断是否超过阈值。如果灰尘浓度超过范围阈值,则通过控制水泵向空气中喷水降低粉尘浓度;如果噪声超出阀值,则在云端的智慧大屏上显示并发送提示给办公室管理员。

(5)网络连接与数据传输:使用ESP8266 Wi-Fi模块连接到OneNet物联网云平台,并通过MQTT协议进行数据传输。将采集到的环境信息上传到OneNet物联网云平台进行存储和展示。

(6)智慧大屏设计:在OneNet物联网云平台上设计一个智慧大屏,用于显示各种环境信息,包括灰尘浓度、空气质量和噪声信息等。可以通过图表、曲线等形式直观地展示环境数据,并提供远程管理和监控功能。

(8)系统测试与优化:对整个系统进行测试,确保传感器数据采集准确可靠,控制和提示功能正常运作。根据测试结果进行优化和调整,提高系统的稳定性和性能。

通过以上设计思路,能够实现基于STM32的工地扬尘与噪音实时监测系统的功能,提高工地施工环境的监测和管理水平,降低施工对周边环境的影响,提高施工管理效率。同时,通过物联网云平台的远程监控和智慧大屏的展示,为用户提供更加直观、便捷的环境信息查看体验。

1.3 项目开发背景

【1】项目实际应用意义

(1)提高工地施工环境的管理水平:通过实时监测工地的灰尘浓度、空气质量以及噪声信息,该系统能够为工地施工管理提供更加全面、准确的数据支持,帮助管理员更好地掌握工地环境情况,及时采取有效的管理措施。

(2)降低施工对周边环境的影响:该系统能够通过控制水泵喷水降尘和提示管理员进行现场管理,有效地降低工地施工对周边环境的影响,改善周边居民的生活质量。

(3)推动物联网技术在智慧工地建设中的应用:该系统采用了物联网技术,实现了数据的远程传输和监控,为智慧工地建设提供了新的思路和方法,推动了物联网技术在工地施工管理中的应用和发展。

【2】市场已有设计的调研(调研的结果总结)

基于STM32设计的工地扬尘与噪音实时监测系统(OneNet)是一个高度集成和智能化的系统,实时监控建筑工地的扬尘和噪音水平,以确保环境质量和施工安全。该系统的设计和实现涉及多个技术领域,包括传感器技术、无线通信技术、数据处理和云计算等。

(1)系统架构:根据现有研究,该系统通常包括前端数据采集层、数据传输层和云服务平台三个主要部分。前端数据采集层主要由各种环境参数传感器组成,如PM2.5、PM10、噪声传感器等。这些传感器能够实时监测工地的扬尘和噪音水平,并将数据通过无线网络传输到云服务平台。

(2)数据处理与分析:云服务平台接收到数据后,利用先进的数据处理技术,如卡尔曼滤波算法,对数据进行清洗和优化,以减少环境噪声对传感器感知数据的干扰。此外,系统还可以利用机器学习模型,如BP神经网络,对扬尘浓度进行预测,从而提前采取防治措施。

(3)用户界面与交互:为了方便管理人员查看和管理监测数据,系统提供了一个友好的用户界面。这个界面可以显示实时数据、历史数据分析、报警信息等。此外,系统还支持移动设备访问,使得管理人员可以随时随地监控工地的环境状况。

(4)报警与控制:当监测到的扬尘或噪音水平超过预设的安全阈值时,系统会自动触发报警机制,通过短信或其他方式通知管理人员和相关部门。在某些情况下,系统还可以自动启动喷雾除尘设备,以降低扬尘水平。

(5)系统的扩展性和可维护性:基于STM32的系统设计考虑到了未来的扩展需求,如增加新的监测参数或改进数据分析算法。系统的软件架构采用模块化设计,便于未来的升级和维护。

基于STM32的工地扬尘与噪音实时监测系统(OneNet)是一个综合性的环境监控解决方案,利用最新的信息技术和传感技术,为建筑工地的环境保护和安全管理提供了强有力的支持。通过实时监测和智能分析,该系统能够有效地控制和减少工地的扬尘和噪音污染,保护周边环境和居民的生活质量。

【3】摘要

本文介绍了一种基于STM32的工地扬尘与噪音实时监测系统,旨在通过高科技手段解决城市化进程中工地施工带来的环境问题。系统集成了扬尘浓度、空气质量及噪音监测功能于一体,利用先进的传感器技术实现实时数据采集。当监测数值超出预设标准时,系统自动启动降尘措施并通知管理人员介入,有效控制了工地扬尘与噪音污染。通过ESP8266 WiFi模块与MQTT协议,所有监测数据被实时传输至OneNet物联网云平台,不仅便于远程监控,还通过智慧大屏集中展示,显著提升了工地环境管理的智能化与透明度,为构建智慧工地提供了重要技术支持。

关键字:

  • STM32F103RCT6
  • ESP8266
  • MQTT协议
  • OneNet云平台
  • 扬尘监测
  • 噪音控制
  • 智慧工地
  • 环境监测
  • 远程监控
  • 自动化管理

【4】参考文献

参考文献可以在知网、百度学术、或者在其他学术搜索引擎中搜索相关的关键词,可以获取最多的相关文献。

1. 黄晖,余继成,肖春明等.基于STM32的扬尘监测系统设计[J].物联网技术,2020,10(12):15-17. 
2. 随国庆,潘顶山,朱贺等.扬尘噪声在线监测在工程项目监管中的系统集成与应用[J].中国建设信息化,2018,No.068(13):71-73. 
3. 施工现场扬尘噪声污染的智能化监测研究 [2022-07-10]
4. 焦清波. 噪音扬尘监测系统设计与实现[D].西安电子科技大学,2015. 
5. 王凯. 建筑工地噪音扬尘监测及数据分析系统设计与实现[D].西安电子科技大学,2019. 
6. 蔡明远. 建设工地扬尘与噪音监控管理系统的设计与实现[D].北京工业大学,2019. 
7. 常来振. 建筑工地扬尘和噪声在线监测系统设计[D].聊城大学,2018. 
8. 兰琪.建筑施工场所扬尘噪声在线监测系统研究与设计[J].山西电子技术,2018,No.196(01):84-87. 
9. 廖天星,李孔贺.建筑工地扬尘在线监控系统建设方案[J].广东化工,2018,45(08):146+137. 
10. 孙猛,高翔,刘茂辉等.扬尘在线监测在施工工地扬尘污染监管中的应用研究[J].环境科学与管理,2016,41(11):142-145. 
11. 建筑工地现场扬尘噪音远程监测系统. 广东省,广州市建设工程质量安全检测中心,2018-05-11. 
12. 牛志云,杨义新,桂华侨等.基于STM32的光散射式扬尘在线监测仪[J].仪表技术与传感器,2020,No.444(01):36-41. 
13. 邹奎.扬尘在线监测成套技术在建筑施工扬尘监管中的应用研究[J].砖瓦,2021,No.399(03):147-149. 
14. 袁冬琴.基于遥感技术的施工工地扬尘污染自动监测方法研究[J].环境科学与管理,2020,45(01):136-141. 
15. 方方,丁玉麟.建筑施工场所扬尘手工监测与在线监测比对研究分析[J].中国人口·资源与环境,2017,27(S1):45-47. 
16. D. V. D. L. Croix and Christian Freneat. “Permanent Vibration & Noise monitoring as a valuable tool to the construction industry.” (2013). 040141-040141. 
17. 丁承君,胡博,刘云帆等.基于物联网的建筑工地扬尘监测系统设计[J].传感器与微系统,2022,41(02):101-104. 
18. 郭玉明.风沙天气下建筑施工的扬尘监测系统设计研究[J].环境科学与管理,2018,43(10):126-130+194. 
19. 孙彪. 城市扬尘在线监测系统设计与应用[D].东南大学,2021. 
20. Casey Calixto, J. Chavez et al. “Developing An Environmental Monitoring Dashboard to Identify Construction Activities That Affect On-Site Air Quality and Noise.” Systems and Information Engineering Design Symposium (2023). 286-291. 
21. Lazar Milivojević. “Monitoring and analysis of air quality and meteorological parameters on the construction site by the IoT.” Vojnotehnički Glasnik (2023). 
22. 常茂余. 噪音扬尘监测设备研究与实现[D].西安电子科技大学,2017. 
23. 刘建军.建筑工程施工现场扬尘污染在线监控系统研究[J].科技视界,2013,No.79(28):45+106. 
24. 蔡久红,郑展民,臧春华.城市建筑施工扬尘在线监测与防治措施的研究[J].计量与测试技术,2021,48(03):88-90+94. 
25. 陈鸣,朱小曼.基于物联网的工地扬尘监控系统的设计与实现[J].科技创新导报,2020,17(03):246+248. 
26. Jiaxuan Chen, W. Zhang et al. “The design of embedded environmental noise real-time monitoring device.” Other Conferences (2023). 
27. T. Logeswaran. “IOT based Noise and Air Pollution Monitoring in Industrial Sector.” (2018). 1979-1984. 
28. 马永跃.基于单粒子激光散射法扬尘在线监测系统设计[J].价值工程,2018,37(15):134-136. 
29. Rajat Sankhe, Pravin Shirodkar et al. “Iot Based Air and Sound Pollution Monitoring System.” (2018). 
30. 基于iOS平台的工地噪音扬尘监测系统的研究与实现 [2019-05-01]

1.4 开发工具的选择

STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。

开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。

image-20221210225339928

1.5 系统功能总结

系统功能描述
实时监测系统能持续监测工地的扬尘浓度、空气质量及噪音水平,提供即时数据。
自动降尘控制当扬尘浓度超过预设阈值,自动触发水泵喷水,有效降低空气中粉尘含量。
噪音管理提示监测到噪音超标时,系统可向管理人员发送提示,采取措施减少噪音污染。
数据远程传输通过ESP8266 WiFi模块与MQTT协议,将监测数据上传至OneNet云平台。
云端数据查看用户可通过OneNet物联网云平台,随时随地查看工地环境实时信息。
智慧大屏展示在云端设置智慧大屏界面,直观展示工地环境各项指标,提升管理效率。
提高施工透明度增加施工环境监测透明度,有利于公众监督及提升企业形象。
管理效率提升实时数据辅助决策,快速响应环境变化,优化施工计划与管理流程。

二、硬件选型

2.1 STM32开发板

链接:detail.tmall.com/item.htm?id…

主控CPU采用STM32F103RCT6,这颗芯片包括48 KB SRAM、256 KB Flash、2个基本定时器、4个通用定时器、2个高级定时器、51个通用IO口、5个串口、2个DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片属于大容量类型,配置较高,整体符合硬件选型设计。当前选择的这款开发板自带了一个1.4寸的TFT-LCD彩屏,可以显示当前传感器数据以及一些运行状态信息。

image-20240408003813116

2.2 PCB板

链接:detail.tmall.com/item.htm?ab…

image-20240404223242975

2.3 蜂鸣器模块

链接:detail.tmall.com/item.htm?al…

image-20230226222801899

2.4 USB下载线

链接:detail.tmall.com/item.htm?ar…

image-20221208211912983

2.5 ESP8266 WIFI

链接:detail.tmall.com/item.htm?sp…

image-20230211133730875

■模块采用串口(LVTTL) 与MCU (或其他串口设备) 通信,内置TCP/IP协议栈,能够实现串口与WIFI之间的转换 ■模块支持LVTTL串口, 兼容3..3V和5V单片机系统 ■模块支持串 口转WIFI STA、串口转AP和WIFI STA+WIFI AP的模式,从而快速构建串口-WIFI数据传输方案 ■模块小巧(19mm*29mm), 通过6个2.54mm间距排针与外部连接

image.png image.png image.png image.png image.png image.png

2.6 母对母杜邦线(X2)

作用: 连接模块与单片机。

链接:detail.tmall.com/item.htm?al…

image-20231120103302046

2.7 继电器

链接:detail.tmall.com/item.htm?id…

image-20221107101209118

2.8 12V2A电源插头

链接:item.taobao.com/item.htm?sp…

image-20231120114846982

2.9 MQ135空气质量检测

链接:detail.tmall.com/item.htm?ab…

image-20240404223414582

3.10 PM2.5粉尘检测传感器

链接:detail.tmall.com/item.htm?sp…

image-20221116212725447

2.11 抽水马达

链接地址:detail.tmall.com/item.htm?ab…

image-20240229233138697

2.12 声音检测模块

链接:detail.tmall.com/item.htm?al…

image-20230213145451614

1、声音模块对环境声音强度敏感,一般用来检测周围环境的声音强度; 2、模块在环境声音强度达不到设定阈值时, OUT输出高电平,当外界环境声音强度超过设定阈值时,模块OUT输出低电平; 3、小板数字量输出OUT可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的声音; 4、小板数字量输出DO可以直接驱动本店继电器模块、由此可以组成一个声控开关。

2.13 USB母座(方便接水泵)

链接:item.taobao.com/item.htm?sp…

image-20240625144102773

三、OneNet云平台的设计

3.1 OneNet平台介绍

OneNET-中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。

OneNET资源模型如下图:

资源模型

  • 产品(product) 用户的最大资源集为产品,产品下资源包括设备、设备数据、设备权限、数据触发服务以及基于设备数据的应用等多种资源,用户可以创建多个产品。
  • 设备(device) 设备为真实终端在平台的映射,真实终端连接平台时,需要与平台设备建立一一对应关系,终端上传的数据被存储在数据流中,设备可以拥有一个或者多个数据流。
  • 数据流与数据点 数据流用于存储设备的某一类属性数据,例如温度,湿度,坐标等信息;平台要求设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流名称,value为实际存储的数据点,value格式可以,int、float、string、json等多种自定义格式。
  • APIkey APIkey为用户进行API调用时的密钥,用户访问产品资源时,必须使用该产品目录下对应的APIkey。
  • 触发器(trigger) 触发器为产品目录下的消息服务,可以进行基于数据流的简单逻辑判断并触发HTTP请求或者邮件。
  • 应用(application) 应用编辑服务,支持用户以拖拽控件并关联设备数据流的方式,生成简易网页展示应用。

OneNET常用的术语解释如下:

术语解释别名&曾用名
产品OneNET平台资源(包括设备,APIKey,触发器,应用等)的集合,一个产品对应唯一的masterkey、产品ID,设备注册码,一个产品下包含多个具备同一特征的设备,多个设备之间的唯一性由SN来区分项目
产品IDpid,鉴权信息组之一,创建产品时由平台分配的唯一产品识别码,用于标识唯一个产品,作为设备登录鉴权参数之一项目ID
APIKey用于API调用时的鉴权参数 Master-APIkey:产品下唯一的管理员权限的APIKey,具有管理产品下所有设备的权限,在产品页面获取 Device-APIkey:设备级APIkey,具备与之关联的所有设备的访问权限,在设备详情获取
accessKey安全性更高的访问密钥,用于访问平台时的隐性鉴权参数(非直接传输),通过参与计算并传输token的方式进行访问鉴权
token安全性更高的鉴权参数,由多个参数组成,在通道中直接传输
注册码产品下唯一,可用于真实设备调用注册设备时,作为API的鉴权参数之一
设备归属于某一个产品下,是真实设备在平台的映射,用于和真实设备通过连接报文建立连接关系,平台资源分配的最小单位
鉴权信息组由设备ID,产品ID,设备SN组成的平台内设备唯一的参数组合,真实设备进行设备连接时需要携带有这些参数进行鉴权(参数要求根据设备接入协议不同有一定差异)
设备ID鉴权信息组之一,由平台分配的,在平台范围内设备唯一的识别号
SN鉴权信息组之一,由硬件厂家自定义的设备唯一出厂序列号,创建/注册设备时作为设备参数,在产品内唯一,作为设备连接时的鉴权参数之一auth_info 设备编号
数据流设备属性,可为设备单项数据属性,例如温度=10;也可为设备数据属性的组合,例如坐标=x:10 y:20
数据流模板产品下所有设备均具备的采集数据属性,例如空气质量检测仪均可以上报“PH2.5”“甲醛浓度”等数据
数据点设备每次上传到数据流中的数据
脚本平台支持用户自定义数据解析规则,解析二进制/字符串格式的数据(仅适用于TCP+脚本接入方式)

3.2 创建产品

(1)登录账户

官网:open.iot.10086.cn/

进来先登录账号。

image-20240402000239430

(2)选择物联网开放平台

image-20240402000349407

(3)添加产品

image-20240402000427233

根据自己产品信息填写:

image-20240414205253934

image-20240414205321795

创建之后点击确定。

image-20240625145608920

image-20240625145625302

创建完成。

image-20240625145645076

(4)产品ID

产品ID: 38L6CE58yx

3.3 创建设备

产品是属性抽象模型,产品下面的设备就表示具体的硬件设备,需要与具体的硬件关联。产品下可以创建很多的设。

(1)添加设备

image-20240625145724156

(2)填写设备信息

image-20240423233314359

创建完成。

image-20240625145813525

创建完成。

image-20240625150048455

(3)查看设备详情

添加完成之后,点击查看详情,查看设备的详细信息。

image-20240515150259372

这里的产品ID、设备ID、设备密匙非常有用。后续MQTT登录参数需要使用。这里记录一下。

产品ID:  Fk0g52596A
设备ID:  2166787308
设备密匙:cmlLaDdCQ1VhZkhMQ1VvZlMwcU5ucG5mU3pSZlhGZWI=
设备名称:dev1

3.4 添加数据流模板

(1)添加数据流模板

image-20240625150133077

添加数据流模板。

image-20240625150208155

(2)根据设备需求添加

当前设备里,与云端交互的状态可以自己约定。

开始创建:

(1)MQ2 烟雾检测

image-20240515150721348

(2)Flame 火焰检测

image-20240515150819178

(3)HumanBody 人体检测

image-20240515150839352

(4)DHT11_T 环境温度

image-20240515150857382

(5)DHT11_H 环境湿度

image-20240515150914029

(3)添加完毕

image-20240625150250695

添加完成:

MQ2烟雾检测
Flame火焰检测
HumanBody人体检测
DHT11_T环境温度
DHT11_H环境湿度

3.5 MQTT协议接入地址

当前智能鱼缸设备是采用MQTT协议与OneNet服务器进行通信。

MQTT物联网套件产品架构如下图所示:

image

接入地址说明:open.iot.10086.cn/doc/v5/deve…

在帮助文档页面,介绍了MQTT接入的地址和端口号。 当前设备是单片机,端口采用1883非加密端口。

image-20221205160655279

地址与端口总结如下:

上面的域名转为IP之后信息如下:(如果设备不支持域名解析,可以直接填IP地址)
IP地址: 183.230.40.96
端口号: 1883

3.6 MQTT主题订阅与发布

MQTT协议是一种消息列队传输协议,采用订阅、发布机制,订阅者只接收自己已经订阅的数据,非订阅数据则不接收,既保证了必要的数据的交换,又避免了无效数据造成的储存与处理。因此在工业物联网中得到广泛的应用。

(1)主题订阅

主题订阅是设备订阅平台的消息,如果设备想知道平台下发的消息,就需要订阅主题。

帮助文档: open.iot.10086.cn/doc/mqtt/bo…

需要订阅什么数据,设备端按照下面的主题格式填写订阅即可。

image-20221205161140648

如果想知道设备所有相关信息,直接订阅$sys/{产品ID}/{device-name}/#即可。 (其中的PID就是产品ID)

$sys/Fk0g52596A/dev1/#

(2)主题发布

主题发布: 就是设备向平台上传数据。

帮助文档地址:open.iot.10086.cn/doc/mqtt/bo…

文档里介绍了数据点上传的格式:

image-20221104113829775

根据当前设备,总结的格式如下:

发布主题: $sys/Fk0g52596A/dev1/dp/post/json
​
发布消息:
{"id":123,"dp":{"MQ2":[{"v":1}],"Flame":[{"v":1}],"HumanBody":[{"v":1}],"DHT11_T":[{"v":20}],"DHT11_H":[{"v":60}]}}

dp对象里面就是需要上传的数据点字段。 这个数据点的名字就是自己创建数据流模板的时候创建的。

3.7 MQTT三元组生成

设备登录OneNet采用的是MQTT协议,MQTT协议登录需要填写 登录信息:简称 MQTT三元组

(1)下载密匙生成工具

地址: open.iot.10086.cn/doc/v5/deve…

点击进行下载。

image-20221104110904249

这是工具打开的页面:

image-20221104110941442

工具软件里需要填写的参数如下: (这个工具在wim11生成的不正确,用win10系统运行)

1】res选项参数的格式: products/{产品ID}/devices/{设备名称}
​
【2】et是设置token过期时间:算出1970-1-1到你想要设置的到期时间,单位是秒,填入即可。
比如: 超时时间设置为2025-4-7,那么,这里填入的秒就是:1970-1-12025-4-7之间的秒单位时间。
​
【3key的参数格式: 就是设备创建之后,在设备详情页的key

需要的信息如下:

image-20240515151443392

(2)生成token过期时间

下面通过C代码计算得一个时间范围:

#include <stdio.h>
#include <time.h>
#include <time.h>
int main()
{
    time_t time_sec;
    time_sec=time(NULL); //当前的秒单位时间--UTC时间
    printf("当前时间(秒):%ld\n",time_sec);
    printf("加一年的时间(秒):%ld\n",time_sec+12*30*24*60*60*999999);
    return 0;
}

(3)密匙生成工具参数

密码生成工具软件的选项框需要填入的格式: (关于产品ID和设备key的查看方式在设备创建章节里已经讲过了)

res选项格式:products/<产品ID>/devices/<设备名字>
res选项填入:products/Fk0g52596A/devices/dev1
et是设置token过期时间: 999986799814791288
设备key:cmlLaDdCQ1VhZkhMQ1VvZlMwcU5ucG5mU3pSZlhGZWI=

(4)生成MQTT登录密匙

第一步: 填好参数

第二步:生成密匙

image-20240515152337181

第三步,复制密匙,待用

version=2018-10-31&res=products%2FFk0g52596A%2Fdevices%2Fdev1&et=999986799814791288&method=md5&sign=bkkxJ38uIPy%2FDmbWZqm6nw%3D%3D

(5)MQTT登录参数总结

MQTT协议登录时,需要输入3个参数: MQTT-设备ID,MQTT-设备名称,MQTT-密码。

对应OneNet的参数:

MQTT- 设备ID  -----> 就是OneNet的设备名称
​
MQTT-设备名称-----> 就是OneNet的产品ID
​
MQTT-密码------------> 就是OneNet的密匙工具生成的密码

下面是对本次的设备做总结:

IP地址: 183.230.40.96
端口号: 1883
clientId: dev1
username: Fk0g52596A
password: version=2018-10-31&res=products%2FFk0g52596A%2Fdevices%2Fdev1&et=999986799814791288&method=md5&sign=bkkxJ38uIPy%2FDmbWZqm6nw%3D%3D
​
订阅主题:  $sys/Fk0g52596A/dev1/#
​
发布主题: $sys/Fk0g52596A/dev1/dp/post/json
​
发布消息:
{"id":123,"dp":{"MQ2":[{"v":1}],"Flame":[{"v":1}],"HumanBody":[{"v":1}],"DHT11_T":[{"v":20}],"DHT11_H":[{"v":60}]}}

3.8 MQTT工具登录测试

前面已经介绍了MQTT协议登录需要用到的参数,以及订阅主题、发布主题的格式,接下来我们通过MQTT工具模拟设备登录OneNet平台,完成数据交互测试。

简单来说: 就是用软件来模拟实际的硬件,登录onenet平台,上传数据,走一下这个流程。

(1)模拟设备登录

接下来根据软件的输入框提示,输入对应的参数,然后登录设备,订阅主题,发布主题即可完成一个流程的测试。

image-20240515153645495

(2)登录OneNet控制台查看设备

在设备列表页面,可以看到设备已经在线了。

image-20240625150322335

在设备详情页面可以看到设备模拟器刚才上传的数据:

image-20240515153756779

到此,设备的云平台已经配置完毕。

3.9 查看历史数据

上传到OneNet的数据都会存储到云端,可以查看历史数据,也可以导出本地查看。

比如,点击一个数据。

image-20240515153926704

就可以看这个数据的历史数据。也可以看时间段查询,导出到本地等等操作。

image-20240515153942929

3.10 可视化界面设计

为了方便控制设备,显示设备上传的数据,接下来设计一个可视化的网页。

image-20240515154143900

3.11 数据可视化服务

地址: open.iot.10086.cn/studio/view…

image-20240515154232640

四、STM32硬件端代码设计

4.1 空气质量检测(代码)

#include <stdio.h>
#include <stdlib.h>
#include "stm32f10x.h"
#include "mq2.h"
​
​
// 初始化双向链表
void initDoublyLinkedList(DoublyLinkedList* list) {
    list->head = NULL;
    list->tail = NULL;
    list->size = 0;
}
​
// 向双向链表尾部添加节点
void appendNode(DoublyLinkedList* list, uint16_t data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = list->tail;
    newNode->next = NULL;
​
    if (list->tail == NULL) {
        list->head = newNode;
    } else {
        list->tail->next = newNode;
    }
    list->tail = newNode;
    list->size++;
}
​
// 释放双向链表内存
void freeDoublyLinkedList(DoublyLinkedList* list) {
    Node* current = list->head;
    while (current != NULL) {
        Node* next = current->next;
        free(current);
        current = next;
    }
    list->head = NULL;
    list->tail = NULL;
    list->size = 0;
}
​
// 卡尔曼滤波算法
float kalmanFilter_mq2(KalmanFilter* kf, float z) {
    // 预测
    float x_predict = kf->x;
    float P_predict = kf->P + kf->Q;
​
    // 更新
    float K = P_predict / (P_predict + kf->R);
    kf->x = x_predict + K * (z - x_predict);
    kf->P = (1 - K) * P_predict;
​
    return kf->x;
}
​
// 平滑滤波算法
uint16_t smoothFilter(uint16_t* data, uint8_t size) {
    uint32_t sum = 0;
    for (uint8_t i = 0; i < size; i++) {
        sum += data[i];
    }
    return sum / size;
}
​
// 冒泡排序算法
void bubbleSort(uint16_t* data, uint8_t size) {
    for (uint8_t i = 0; i < size - 1; i++) {
        for (uint8_t j = 0; j < size - i - 1; j++) {
            if (data[j] > data[j + 1]) {
                uint16_t temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
            }
        }
    }
}
​
// 选择排序算法
void selectionSort(uint16_t* data, uint8_t size) {
    for (uint8_t i = 0; i < size - 1; i++) {
        uint8_t minIndex = i;
        for (uint8_t j = i + 1; j < size; j++) {
            if (data[j] < data[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            uint16_t temp = data[i];
            data[i] = data[minIndex];
            data[minIndex] = temp;
        }
    }
}
​
int MQ2_test() {
    // 初始化双向链表
    DoublyLinkedList historyList;
    initDoublyLinkedList(&historyList);
​
    // 初始化卡尔曼滤波器
    KalmanFilter kf = {0.01, 0.1, 0, 1};
​
    // 模拟采集传感器数据
    uint16_t sensorValues[] = {30, 40, 50, 60, 70, 80, 90, 100};
    uint8_t numValues = sizeof(sensorValues) / sizeof(sensorValues[0]);
​
    // 存储滤波后的数据
    uint16_t filteredValues[numValues];
​
    // 应用卡尔曼滤波和平滑滤波
    for (uint8_t i = 0; i < numValues; i++) {
        // 添加数据到历史数据链表
        appendNode(&historyList, sensorValues[i]);
​
        // 获取历史数据
        uint16_t historyData[historyList.size];
        Node* current = historyList.head;
        for (uint8_t j = 0; j < historyList.size; j++) {
            historyData[j] = current->data;
            current = current->next;
        }
​
        // 卡尔曼滤波
        filteredValues[i] = kalmanFilter_mq2(&kf, sensorValues[i]);
​
        // 平滑滤波
        filteredValues[i] = smoothFilter(historyData, historyList.size);
    }
​
    // 冒泡排序
    bubbleSort(filteredValues, numValues);
​
    // 选择排序
    selectionSort(filteredValues, numValues);
​
    // 打印排序后的结果
    printf("Sorted Values:\n");
    for (uint8_t i = 0; i < numValues; i++) {
        printf("%d ", filteredValues[i]);
    }
    printf("\n");
​
    // 释放双向链表内存
    freeDoublyLinkedList(&historyList);
​
    return 0;
}

4.2 ESP8266-MQTT协议(代码)

ESP8266-wifi 烧写带有MQTT协议支持的固件。

#include "ESP8266.h"
#include "usart.h"
#include "delay.h"
​
​
void ESP8266_Init(void)
{
//====================================================实现设备在线==================================================
    //【1】复位ESP8266
    printf("AT+RST\r\n");//第一步
    delay_ms(2000);
    //【2】设置为STA模式
    printf("AT+CWMODE=1\r\n");//第二步
    delay_ms(1500);
    //【3】设置连接的WIFI热点
    // 格式: AT+CWJAP="填写wifi名称","填写WiFi密码"
    printf("AT+CWJAP="123","12345678"\r\n");//第四步
    delay_ms(1500);
    //【4】设置MQTT的登录名和密码
    // 格式: AT+MQTTUSERCFG=0,1,"NULL","填写用户名","填写密码",0,0,""
    printf("AT+MQTTUSERCFG=0,1,"NULL","65620a943668046d0e31568c_room1","a83d06a34631b72d1b35bae5ef5e23c7ea723952c33796faa47410b107e7f4b7",0,0,""\r\n");//第五步
    delay_ms(1500);
    //【5】设置MQTT的ClientID
    // 格式: AT+MQTTCLIENTID=0,"填写ClientID"
    printf("AT+MQTTCLIENTID=0,"65620a943668046d0e31568c_room1_0_0_2023112515"\r\n");//第6步  客户端ID
    delay_ms(1500);
    // 【6】设置MQTT接入地址
    // 格式: AT+MQTTCONN=0,"填写MQTT接入的地址",1883,1
    printf("AT+MQTTCONN=0,"124.70.218.131",1883,1\r\n");//第7步
    delay_ms(2000);
    
}
​
​
​
void ESP8266_data_publish(char *att)
{
    //  char publish_command[256];
    printf("%s",att);//第2步
    //printf("AT+MQTTPUB=0,"$oc/devices/65620a943668046d0e31568c_room1/sys/properties/report","{\"services\":[{\"service_id\":\"stm32\",\"properties\":{\"%s\":%d}}]}",0,0\r\n", att, data);
    //  printf("%s", publish_command);
}

4.3 IIC协议(代码)

#include "myiic.h"
#include "delay.h"//初始化IIC
void IIC_Init(void)
{                        
    GPIO_InitTypeDef GPIO_InitStructure;
    //RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); 
       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
    IIC_SCL=1;
    IIC_SDA=1;
​
}
//产生IIC起始信号
void IIC_Start(void)
{
    SDA_OUT();     //sda线输出
    IIC_SDA=1;        
    IIC_SCL=1;
    delay_us(4);
    IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
    delay_us(4);
    IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}     
//产生IIC停止信号
void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    IIC_SCL=0;
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    delay_us(4);
    IIC_SCL=1; 
    IIC_SDA=1;//发送I2C总线结束信号
    delay_us(4);                                
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
    SDA_IN();      //SDA设置为输入  
    IIC_SDA=1;delay_us(1);     
    IIC_SCL=1;delay_us(1);   
    while(READ_SDA)
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL=0;//时钟输出0      
    return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=0;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}
//不产生ACK应答          
void IIC_NAck(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=1;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}                                        
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答           
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    SDA_OUT();      
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;      
        delay_us(2);   //对TEA5767这三个延时都是必须的
        IIC_SCL=1;
        delay_us(2); 
        IIC_SCL=0;  
        delay_us(2);
    }    
}       
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
    {
        IIC_SCL=0; 
        delay_us(2);
        IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
        delay_us(1); 
    }                    
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}
​
​
void IIC_WriteBytes(u8 WriteAddr,u8* data,u8 dataLength)
{       
    u8 i;   
    IIC_Start();  
​
    IIC_Send_Byte(WriteAddr);       //发送写命令
    IIC_Wait_Ack();
    
    for(i=0;i<dataLength;i++)
    {
        IIC_Send_Byte(data[i]);
        IIC_Wait_Ack();
    }                          
    IIC_Stop();//产生一个停止条件 
    delay_ms(10);    
}
​
void IIC_ReadBytes(u8 deviceAddr, u8 writeAddr,u8* data,u8 dataLength)
{       
    u8 i;   
    IIC_Start();  
​
    IIC_Send_Byte(deviceAddr);      //发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(writeAddr);
    IIC_Wait_Ack();
    IIC_Send_Byte(deviceAddr|0X01);//进入接收模式            
    IIC_Wait_Ack();
    
    for(i=0;i<dataLength-1;i++)
    {
        data[i] = IIC_Read_Byte(1);
    }       
    data[dataLength-1] = IIC_Read_Byte(0);  
    IIC_Stop();//产生一个停止条件 
    delay_ms(10);    
}
​
void IIC_Read_One_Byte(u8 daddr,u8 addr,u8* data)
{                                                                                            
    IIC_Start();  
    
    IIC_Send_Byte(daddr);      //发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(addr);//发送地址
    IIC_Wait_Ack();      
    IIC_Start();           
    IIC_Send_Byte(daddr|0X01);//进入接收模式             
    IIC_Wait_Ack();  
    *data = IIC_Read_Byte(0);          
    IIC_Stop();//产生一个停止条件       
}
​
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data)
{                                                                                            
    IIC_Start();  
    
    IIC_Send_Byte(daddr);       //发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(addr);//发送地址
    IIC_Wait_Ack();                                                        
    IIC_Send_Byte(data);     //发送字节                            
    IIC_Wait_Ack();                    
    IIC_Stop();//产生一个停止条件 
    delay_ms(10);    
}

五、总结

基于STM32F103RCT6主控芯片的工地扬尘与噪音实时监测系统成功实现了对工地环境参数的实时监测与智能控制。该系统集成了粉尘传感器和声音拾取麦克风传感器,能够精准地检测空气中的灰尘浓度和噪声水平。一旦检测到尘土浓度超过预设的阈值,系统便会自动启动水泵进行喷水,有效降低空气中的粉尘浓度,保障工地环境的清洁与安全。同时,当噪声水平超出设定的阀值时,系统不仅会在云端智慧大屏上显示相关信息,还会及时通知办公室管理员进行现场管理,确保工地噪声得到有效控制。

为了实现数据的远程监控与管理,该系统采用了ESP8266 WIFI模块,并通过MQTT协议与OneNet物联网云平台进行连接。所有监测到的环境信息,包括灰尘浓度、空气质量、噪声水平等,都会实时上传至云平台,并在智慧大屏上进行可视化展示。这不仅方便了管理员对工地环境的实时监控,也为数据的分析和处理提供了便利。

基于STM32F103RCT6的工地扬尘与噪音实时监测系统通过集成多种传感器和智能控制模块,实现了对工地环境的全面监测与智能管理。该系统不仅提高了工地环境管理的效率,也为保障工人的健康与安全提供了有力支持。同时,通过与物联网云平台的连接,实现了数据的远程监控与管理,为工地环境的持续改进和优化提供了数据支持。