基于STM32设计的汽车修理厂环境监测系统(上云端-华为云IOT)【玩转华为云】

举报
DS小龙哥 发表于 2023/07/21 10:03:52 2023/07/21
【摘要】 项目是基于STM32的汽车修理厂环境监测系统。 本项目分为云平台部分和硬件端。在云平台方面,使用了华为云IOT物联网平台,可以将设备上传到服务器,然后通过Qt设计的手机APP实现数据的显示,如果检测的数据阀值超标,会在手机APP弹窗显示提醒。在硬件端方面,主控采用了STM32F103RCT6,联网模块则是ESP8266,还选用了排风扇模块、雾化模块、水泵、蜂鸣器等设备。

一、前言

生产车间的环境质量监测仅靠传统的手持式仪器仪表及手工记录无法保证数据的即时性和准确性。因此,设计并实现了一种综合传感器技术、无线通信技术和移动应用开发技术的车间环境质量监测系统。

本系统以STM32为主控芯片,外接各种传感器模块采集环境信息,并将采集数据通过WiFi发送至华为云,经华为云物联网平台传输至APP。手机APP实现数据的展示、终端设备的控制功能,从而使修理厂环境的监测更加自动化、简便化、信息化。

image-20230527080418368

image-20230527080510937

二、设计需求

本设计包括硬件模块的选型与设计、软件模块功能与设计。

2.1 硬件模块的选型与设计

(1)信息采集功能模块设计

通过温湿度传感器、PM2.5传感器、空气质量传感器、火焰传感器、烟雾传感器等传感器,分别采集汽车修理厂的温度、湿度、焊接烟尘浓度(PM2.5浓度模拟)、VOCs浓度、火焰传感器状态、烟雾浓度等环境信息,并上传主控芯片。

(2)通信功能模块设计

将采集到的环境信息通过ESP8266WiFi模块上传到APP,在APP上进行数据展示。

(3)联动报警装置设计

运用排风扇、雾化传感器、等离子发生器和水泵,通过传感器采集到的环境信息与阈值对比,超出阈值则进行相应的智能调控,温度过高则开启排风扇进行换气排风;焊接烟尘(检测PM2.5模拟)浓度过高则蜂鸣器报警,并通过雾化降尘操作处理烟尘;VOCs气体浓度过高则打开等离子发生器进行调节;检测到火焰,并且烟雾浓度过高则驱动水泵进行灭火,蜂鸣器报警并在屏幕和手机APP显示警报信息。

2.2 软件模块选型与设计

软件部分主要以C和C++为软件开发语言,用华为云物联网平台设计APP。APP可以查看汽车修理厂的各项环境信息和控制排风扇等开关,方便随时随地进行操作和查看。

(1)采集功能软件设计 将采集到的环境信息通过ESP8266WiFi模块上传到华为云物联网平台,再通过华为云物联网平台将数据转发到APP进行数据展示。

(2)上位机软件设计 上位机采用华为云物联网平台和APP,连接网络查看汽车修理厂的各项环境信息和指标数据分析,方便随时随地进行操作和查看。

(3)通信功能设计 APP可以发送控制命令人为调控联动模块排风扇、雾化传感器和等离子发生器。

2.3 具体功能实现总结

(1)云平台

物联网云平台采用华为云IOT物联网平台,设备采集传感器数据后通过MQTT协议上传至云平台,通过Qt设计手机APP和电脑PC端上位机,拉取设备上传至服务器的数据进行显示,如果某些数据阀值超标可以进行显示提醒。

(2)硬件端

硬件端主控采用STM32F103RCT6,联网模块采用ESP8266。

设备运行时,通过各类传感器采集环境数据进行处理,并通过ESP8266上传到云端。

采集数据的传感器分别是:火焰传感器、MQ2烟雾传感器、DHT11温湿度传感器、PM2.5空气颗粒传感器等等。

联动控制的设备分别是:排风扇模块、雾化模块、水泵、蜂鸣器。

最终实现的功能总结:



1、可以通过传感器对汽车生产车间环境(包括温度、湿度、火焰、烟雾、焊接烟尘、VOCs)进行监测
2、按键模块可以对汽车生产车间的温度、烟尘、VOCs浓度、烟雾浓度等环境参数的极限值进行设定,(第一个按键可以对模式进行选择,第二三个按键分别对该模式下的阈值进行加和减)利用显示屏将这些值显示
3、自动模式:
(1)当检测到火警信息、烟雾报警的时候,会驱动水泵进行灭火,蜂鸣器报警并在屏幕和手机APP显示警报信息,直至警报状态解除。
(2)监测空气中的焊接烟尘(检测PM2.5模拟),当浓度过高时,会蜂鸣器报警,开启排放通道,排放对烟尘进行处理,通过雾化降尘等操作处理烟尘。
(3)当监测到温度过高的时候,会打开风扇进行温度调节
(4)当监测到VOCs气体浓度过高时,打开等离子发生器进行调节
4、手动模式:可以通过按键对风扇、排放通道、雾化降尘、等离子发生器进行开启或关闭
5、上位机用手机APP,APP通过WIFI模块可以显示监测到的信息,同时可以远程控制通风、雾化降尘、水泵、等离子发生器的开关,连接数据库可以查询监测到的历史数据,并在检测到检测到火警、焊接烟尘、VOCs浓度过高时有提示信息。

2.4 整体设计总结

本项目是基于STM32的汽车修理厂环境监测系统的设计和实现、该系统分为云平台部分和硬件端两部分。

在云平台部分,采用了华为云IOT物联网平台,并通过MQTT协议上传数据至云端,同时通过Qt设计手机APP和电脑PC端上位机,对设备上传到服务器的数据进行显示,并可以设定阈值并进行提醒。

硬件端主控采用STM32F103RCT6,联网模块采用ESP8266。通过各类传感器采集环境数据,如火焰传感器、MQ2烟雾传感器、DHT11温湿度传感器、PM2.5空气颗粒传感器等等,并通过ESP8266上传到云端。此外,还有排风扇模块、雾化模块、水泵、蜂鸣器等设备进行联动控制。

具体功能实现包括以下几点:

1、可监测汽车生产车间环境,包括温度、湿度、火焰、烟雾、焊接烟尘、VOCs浓度等参数。

2、按键模块对这些环境参数极限值进行设定,利用显示屏将这些值显示。

3、自动模式下,能够对环境参数进行实时监测。当检测到火警信息、烟雾报警、焊接烟尘浓度过高和VOCs气体浓度过高时,系统会驱动水泵进行灭火、蜂鸣器报警、打开排放通道进行处理、开启雾化降尘、等离子发生器进行调节等操作,直至警报状态解除。

4、手动模式下,可以通过按键手动对风扇、排放通道、雾化降尘、等离子发生器进行开启或关闭。

5、数据上传至云端,实现远程数据监测和设备控制。

6、上位机用Qt开发Android手机APP,APP通过华为云物联网平台提供的API接口,显示设备监测到的信息,可远程控制通风、雾化降尘、水泵、等离子发生器的开关,并查询监测到的历史数据,并在检测到火警、焊接烟尘、VOCs浓度过高时有提示信息。

本项目实现了对汽车修理厂环境的全面监测,且能够在自动模式下进行智能化控制,并支持数据上云以及手机APP远程操作,具有很高的实用价值。

2.5 本项目用到的核心技术

  1. STM32F103RCT6的嵌入式系统设计和开发:该芯片是基于ARM Cortex-M3内核的32位微控制器,可以实现高效率、低功耗、高灵活性的嵌入式系统设计和开发。
  2. ESP8266联网模块:该模块可以连接Wi-Fi网络,并通过MQTT协议上传数据到物联网云平台,实现设备和云端之间的通信。
  3. 华为云IOT物联网平台:该平台提供了完整的物联网解决方案,包括设备管理、数据采集、数据存储、数据分析、远程控制等功能,可以方便地搭建物联网应用。
  4. MQTT协议:该协议是一种轻量级的发布/订阅消息传输协议,适用于物联网设备和云端之间的数据通信。
  5. Qt开发框架:该框架可以快速开发跨平台的图形用户界面应用程序,包括Android手机APP和电脑PC端上位机。
  6. 火焰传感器、MQ2烟雾传感器、DHT11温湿度传感器、PM2.5空气颗粒传感器等传感器:这些传感器可以实时采集环境参数数据,为系统提供实时监测和检测的基础。
  7. 网络通信协议:包括HTTPS、MQTT等协议,用于设备和云端、手机APP之间的数据传输和通信。

三、硬件选型

3.1 STM32开发板

主控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.png

3.3 PCB板-2块

image-20221031234443667

3.4 杜邦线(2份)

image-20221116205143496

3.5 温湿度传感器

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块 采集技术和温湿度传感技术,确保产品具有可靠性与卓越的长期稳定性,成本低、相对湿度和温度测 量、快响应、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括一个电容式感湿 元件和一个NTC测温元件,并与一个高性能8位单片机相连接。可用于暖通空调、除湿器、测试及检测设 备、消费品、汽车、自动控制、数据记录器、气象站、家电、湿度调节器、医疗、其他相关湿度检测控 制。

特点如下:

1、可以检测周围环境的湿度

2、可以检测周围环境的温度

3、湿度测量范围:20%-95%(0度-50度范围)湿度测量误差:+-5%

4、温度测量范围:o度-50度温度测量误 差:+-2度

5、工作电压3.3V-5V

6、输出形式数字输出

image-20221031222738204

3.6 烟雾检测传感器

image-20221116205508897

3.7 VOCS空气体质量探头

特点:

1、具有模拟信号和电平信号同时输出;

2、模拟信号输出范围0-5V,模拟信号可以直接接AD采集;

3、数字电平信号输出,有效信号为低电平,led灯亮,可直接接单片机IO口;

4、感应灵敏度可以调节,可设置感应阀值,有气体输出低电平,可直接接单片机;

5、对甲醛、甲苯、二甲苯等挥发气体具有高灵敏度,可用于空气质量定性检测;

6、具有长期的使用寿命和可靠的稳定性;

7、快速的响应恢复特性,安装调试方便。

应用:

用于家庭环境等空气清新设备检测、油烟换气扇控制等设备,适宜于测试浓度范围:0to100ppm内气体定性检测。

image-20221116205922777

3.8 排风扇模块

image-20221204190116640

3.9 继电器(3个)

image-20221116211648216

3.10 火焰传感器

image-20221116211800319

1、可以检测火焰或者波长在760纳米~110o纳米范围内的光源,打火机测试火焰距离为80cm,对火焰越大,测试距离越; 2、探测角度60度左右,对火焰光谱特别灵敏 3、灵敏度可调(图中蓝色数字电位器调节) 4、比较器输出,信号干净,波形好,驱动能力强,超过15mA 5、电压3.3V-5V

3.11 PM2.5粉尘检测传感器

image-20221116212725447

3.12 ESP8266

■模块采用串口(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

3.13 蜂鸣器

image-20221116213230090

3.14 单排排针

image-20221204184420894

四、部署华为云IOT-平台

华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助您快速构筑物联网解决方案。

使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。

设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP(S)、MQTT(S)、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。 业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

华为云IOT物联网官网地址: https://www.huaweicloud.com/product/iothub.html

4.1 开通设备接入实例

下面将全程截图,介绍整体的过程。

image-20221203132913746

进去之后,开通基础版(账号需要先进行实名认证)。

image-20221203133022673

image-20221203141731705

4.2 创建产品

在左边的选项里,点击产品页,点击右上角创建产品。

image-20221203141828960

根据自己的产品,填写好产品信息。

image-20221214102851997

产品创建完成。

image-20221214102903894

4.3 创建数据模型

点击产品名字,进入到产品的详情页面,可以看到下面这张图。在下面可以看到有模型定义的字段说明。

image-20221214102921279

每个产品都需要定义模型,这个模型简单来说就是: 存放设备传感器上传的数据,或者 云端下发给产品的数据字段。 也就可以理解为编程语言里的变量一样--实际也就是一个东西。 所以,这个模型创建后,需要设置属性的类型,字符串,整型,浮点数等等。这些根据自己传感器的数据类型情况,自己设置即可。

下面就演示一下步骤:

点击下面的自定义模型, 先创建一个服务ID。

image-20221214102935920

点击下面新增属性。

image-20221214102954904

当前设计是汽车修理厂环境监测系统,设备与华为云端交互的数据字段如下:



环境温度 DHT11_T
环境湿度 DHT11_H
烟雾浓度 MQ2
VOCS气体 VOCS
火焰检测 flameCheck
PM2.5    PM25 
​
排风扇开关    ventilator
加湿器开关    Humidifier
水泵开关      motor
等离子发生器开关  PlasmaGenerator
模式切换开关  mode

下面会对应的创建属性。

image-20221203143504019

image-20221203143606547

image-20221214105029924

image-20221214105054379

image-20221214105120203

image-20221214105205463

image-20221214105234303

image-20221214105254360

image-20221214105313398

image-20221214105331728

image-20221214105401923

创建完毕之后的属性如下:

image-20221214105415736

总结如下: (这个非常重要,后续设备上传数据时,JSON字段里就需要填写)



环境温度 DHT11_T
环境湿度 DHT11_H
烟雾浓度 MQ2
VOCS气体 VOCS
火焰检测 flameCheck
PM2.5    PM25 
​
排风扇开关    ventilator
加湿器开关    Humidifier
水泵开关      motor
等离子发生器开关  PlasmaGenerator
模式切换开关  mode

4.4 创建设备

产品是一个抽象模型,在产品模型下可以创建实际的设备,设备可以创建很多个。

点击左边的设备选项,点击所有设备,然后点击右上角注册设备。

image-20221214105839797

根据提示填好设备信息。

image-20221214105921150

设备创建成功。 点击保存关闭,将设备的信息保存下来。方便后续使用。

image-20221214105942417

当前的设备信息如下:



{
    "device_id": "639934ebf5ceb911701e1dfe_dev1",
    "secret": "12345678"
}

设备创建完成。

image-20221214110354590

点击设备详情,可以查看设备的信息: 后续设备上传数据之后,就可以在这个页面查看。

image-20221214110408169

4.5 生成MQTT三元组

产品,设备创建之后,接下来就是如何登录设备,与设备交互的问题。

当前华为云的设备是支持MQTT协议登录的。

要使用MQTT协议登录云端设备需要知道:MQTT服务器的地址,端口号,设备的MQTT登录参数才可以。



华为云的MQTT服务器地址:121.36.42.100
华为云的MQTT端口号:1883

华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。

image-20221214111705340

image-20221214111718615

得到设备的MQTT三元组信息如下:



{
    "device_id": "639934ebf5ceb911701e1dfe_dev1",
    "secret": "12345678"
}
​
ClientId  639934ebf5ceb911701e1dfe_dev1_0_0_2022121403
Username  639934ebf5ceb911701e1dfe_dev1
Password  0c3c2a903de5cc5b6564acc172b28d5b280fc5c386751339a4713d4bc9849e08
​

4.6 MQTT主题发布与订阅

MQTT协议接入帮助文档: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

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

下面介绍华为云IoT的MQTT协议的主题,发布,订阅格式:

华为云的MQTT服务器地址:121.36.42.100
华为云的MQTT端口号:1883
​
【1】订阅主题
​
对于设备而言,一般会订阅平台下发消息给设备 这个主题。
设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。
​
主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
    
以dev1设备1为例,最终的格式:
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/messages/down
​
​
【2】发布主题
​
对于设备,发布主题,也就显示向云平台上传数据。
​
发布的主题格式如下:
​
$oc/devices/{device_id}/sys/properties/report
 
以dev1设备1为例最终的格式:
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。
​
上传的JSON数据格式如下:
​
{
  "services": [
    {
      "service_id": <填服务ID>,
      "properties": {
        "<填属性名称1>": <填属性值>,
        "<填属性名称2>": <填属性值>,
        ..........
      }
    }
  ]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。
​
根据这个格式,组合温度节点一次上传的数据:
​
{"services": [{"service_id": "stm32","properties":{"MQ2":60,"DHT11_T":24,"DHT11_H":60,"VOCS":50,"motor":1,"PM25":33,"ventilator":0,"Humidifier":0,"mode":0,"flameCheck":0,"PlasmaGenerator":0}}]}

设备属性上报的JSON格式说明:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

业务流程:

img

img

4.7 MQTT客户端模拟设备登录测试

为了测试与服务器通信是否正常,先使用MQTT客户端软件模拟设备登录服务器,激活设备,上传数据。

打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。

image-20221214112105136

消息发布之后,打开华为云 的物联网后台查看。

可以看到设备已经在线了。

image-20221214112125268

在设备详情页面,也能看到设备上传的数据。

image-20221214112142868

4.8 MQTT登录参数总结



IP地址:121.36.42.100
端口号:1883
MQTT客户端ID:639934ebf5ceb911701e1dfe_dev1_0_0_2022121403
MQTT用户名:639934ebf5ceb911701e1dfe_dev1
MQTT登录密码:0c3c2a903de5cc5b6564acc172b28d5b280fc5c386751339a4713d4bc9849e08
订阅主题:$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/messages/down
发布主题:$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/report
发布内容:{"services": [{"service_id": "stm32","properties":{"MQ2":60,"DHT11_T":24,"DHT11_H":60,"VOCS":50,"motor":1,"PM25":33,"ventilator":0,"Humidifier":0,"mode":0,"flameCheck":0,"PlasmaGenerator":0}}]}

4.9 历史数据保存

为了方便查看设备上传的历史数据,这里利用华为云云平台的规则转发,可以将数据存放到数据库和OBS存储桶里。我这里接下来配置规则转发,将数据存放到OBS存储里,以execl表格形式保存,方便导出查看。

(1)创建OBS存储

地址:https://console.huaweicloud.com/console/?region=cn-north-4&locale=zh-cn#/obs/manager/dashboard

image-20221214181256374

image-20221214181457642

创建成功:

image-20221214181529110

(2)设置规则转发

地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/rule/forward/list

image-20221214181638749

image-20221214181746624

image-20221214181757974

image-20221214181841202

image-20221214182001154

转发的字段,就是自己设备上传的传感器数据。



notify_data.body.services[0].properties.DHT11_T
notify_data.body.services[0].properties.DHT11_H
notify_data.body.services[0].properties.MQ2
notify_data.body.services[0].properties.VOCS
notify_data.body.services[0].properties.flameCheck
notify_data.body.services[0].properties.PM25

image-20221214182305239

确定之后,先进行测试:

image-20221214182417493

image-20221214182440754

启动规则:

image-20221214182344058

image-20221214182508395

(3)上传数据测试

规则设置好之后,先通过MQTT客户端模拟上传数据,测试存储是否OK。

多修改几个数据,多次上传。

image-20221214182644887

然后打开OBS存储页面: 可以看到文件里已经有数据了。

image-20221214182737341

点击后面的下载:

image-20221214182820235

可以看到设备上传的数据:

image-20221214182854559

文件的下载链接:https://iot-dev-data.obs.cn-north-4.myhuaweicloud.com/data/dev_data.csv

想要查看历史数据,直接访问该链接,下载CSV文件下来查看即可。

五、上位机APP设计

为了能更加方便的了解植物生成情况,远程控制补光灯,水泵开关,接下来会设计一个Android的上位机,和一个PC端的上位机。

框架采用QT,语言采用C++。

对Qt不了解的可以去这里看看: QT官网: https://www.qt.io/

image-20221203151845936

5.1 安装Qt开发环境

QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6

打开下载链接后选择下面的版本进行下载:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

软件安装时断网安装,否则会提示输入账户。

安装的时候,第一个复选框里勾选一个mingw 32编译器即可,其他的不管默认就行,直接点击下一步继续安装。

image-20221203151742653

说明:我这里只是介绍PC端的环境搭建(这个比较简单)。 Android的开发环境比较麻烦,可以去我的博客里看详细文章。

选择MinGW 32-bit 编译器:

image-20221203151750344

5.2 创建IAM账户

创建一个IAM账户,方便接下来使用API接口访问华为云服务时,生成token登录密匙。

地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

image-20221214113704855

image-20221214113753434

image-20221214113805301

image-20221203152316800

image-20221203152330670

image-20221214113832517

5.3 获取影子数据

链接:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html

设备影子介绍:



设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性

简单来说:设备影子就是保存,设备最新上传的一次数据。

我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。

如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow

在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。

image-20221214113930191

image-20221214113953452

设备影子接口返回的数据如下:

{
 "device_id": "639934ebf5ceb911701e1dfe_dev1",
 "shadow": [
  {
   "service_id": "stm32",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "MQ2": 60,
     "DHT11_T": 24,
     "DHT11_H": 60,
     "VOCS": 50,
     "motor": 1,
     "PM25": 33,
     "ventilator": 0,
     "Humidifier": 0,
     "mode": 0,
     "flameCheck": 0,
     "PlasmaGenerator": 0
    },
    "event_time": "20221214T032052Z"
   },
   "version": 0
  }
 ]
}

5.4 修改设备属性

地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0035.html

接口说明



设备的产品模型中定义了物联网平台可向设备下发的属性,应用服务器可调用此接口向指定设备下发属性。平台负责将属性以同步方式发送给设备,并将设备执行属性结果同步返回。

修改设备属性的接口,可以让服务器给设备下发指令,通过指令完成对水泵开关,LED补光灯进行控制。

在线调试地址:

https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties

修改设备属性是属于同步命令,需要设备在线才可以进行调试,先使用MQTT客户端登录服务器,模拟设备上线。

然后进行调试,测试数据远程下发给设备。

image-20221214114151529

image-20221214114217469

image-20221214114253406

由于是同步命令,服务器必须要收到设备的响应才能顺利完成一个流程,设备响应了服务器才能确定数据下发成功。

MQTT设备端如何响应呢?

设备响应格式说明:https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html

image-20221203163532648

下面进行实操:

当服务器通过在线调试,发送指令下来之后,客户端将请求ID复制下来,添加到发布主题的格式里,再回复回去,服务器收到了响应,一次属性修改就完美完成了。

image-20221214114425762

就是成功的状态:

image-20221214114445781

下面是请求的总结: (响应服务器的修改设备属性请求)

上报主题的格式:$oc/devices/{device_id}/sys/properties/set/response/request_id=

$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/response/request_id=



响应的数据:
{"result_code": 0,"result_desc": "success"}

5.5 设计Qt界面

明白了请求如何发送,下面就编写Qt代码,设计界面,完成整体上位机的逻辑设计。

第一步,设计好大致的界面:

image-20221214145052003

这是运行的效果:

image-20221214145117027

界面差不多,接下来就设计对应的逻辑代码:

下面给出核心代码。

//排风扇
void Widget::on_ventilator_clicked(bool checked)
{
    //修改属性
    function_select=13;
​
    QString requestUrl;
    QNetworkRequest request;
​
    //设置请求地址
    QUrl url;
​
    //修改属性的地址
    requestUrl=QString("https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/%1/devices/%2/properties")
            .arg(PROJECT_ID).arg(device_id);
​
    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
​
    //设置token
    request.setRawHeader("X-Auth-Token",Token);
​
    //构造请求
    url.setUrl(requestUrl);
​
    request.setUrl(url);
​
    int motor=checked;
    //打包请求参数赋值
    QString post_param=QString("{"service_id":"%1","properties":{"ventilator":%2}}").arg(service_id).arg(motor);
    //发送请求
    manager->put(request, post_param.toUtf8());
}
​
​
//加湿器
void Widget::on_Humidifier_clicked(bool checked)
{
    //修改属性
    function_select=13;
​
    QString requestUrl;
    QNetworkRequest request;
​
    //设置请求地址
    QUrl url;
​
    //修改属性的地址
    requestUrl=QString("https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/%1/devices/%2/properties")
            .arg(PROJECT_ID).arg(device_id);
​
    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
​
    //设置token
    request.setRawHeader("X-Auth-Token",Token);
​
    //构造请求
    url.setUrl(requestUrl);
​
    request.setUrl(url);
​
    int motor=checked;
    //打包请求参数赋值
    QString post_param=QString("{"service_id":"%1","properties":{"Humidifier":%2}}").arg(service_id).arg(motor);
    //发送请求
    manager->put(request, post_param.toUtf8());
}
​

5.6 最终设计完毕的效果

image-20221214145236751

点击界面可以远程控制排风扇、等离子发生器设备。

image-20221214145309141

下面是打包程序发布之后的运行效果:

(1)windows版本

image-20221214145533031

image-20221214145602284

image-20221214151043508

(2)Android手机运行效果

image-20221214151100704

image-20221214151114074

5.7 如何编译Android程序?

Qt本身跨平台的,只要设置好Android的编译环境,选择Android的套件编译即可。

image-20221214152335413

5.8 上位机下发命令数据总结



$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=1053c1d1-a667-4928-9bff-53675cb1dedf{"service_id":"stm32","properties":{"ventilator":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=a56b5a29-2c49-4760-bb1f-01a7e840a0c1{"service_id":"stm32","properties":{"Humidifier":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=7d318685-67d1-4282-bd1a-9717cd1adc08{"service_id":"stm32","properties":{"motor":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=0c9fe3e5-30df-4caa-9ed4-3d89da400c60{"service_id":"stm32","properties":{"PlasmaGenerator":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=8576fcb7-a663-49e8-9da9-e46c70c8ce79{"service_id":"stm32","properties":{"mode":0}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=631466ed-22ea-4881-97af-a9cd44a1dc87{"service_id":"stm32","properties":{"mode":1}}
​

六、STM32设备端代码设计

了解STM32F103的芯片配置:

image-20221209173742636

6.1 硬件连线

1. ESP8266 WIFI接线
ATK-ESP8266串口WIFI模块与STM32的串口2相连接。
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)
​
2. TFT 1.44 寸彩屏接线
GND   电源地
VCC   接5V或3.3v电源
SCL   接PC8(SCL)
SDA   接PC9(SDA)
RST   接PC10
DC    接PB7
CS    接PB8
BL    接PB11
​
3. DHT11 温湿度
VCC--VCC
GND---GND
DAT---PB3 
​
4. 水泵开关-模拟开启水泵抽水
VCC--->5V
DAT--->PB13  
GND--->GND
​
5. 烟雾浓度检测传感器MQ2(ADC通道1)
VCC--->5V
GND--->GND
DAT--->PA1
​
6. VOCS气体检测传感器(空气质量传感器)  (ADC通道4)
VCC--->5V
GND--->GND
DAT--->PA4
​
7. 火焰检测传感器:
IN----PB5
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)
​
​
8. 板载LED灯接线(这个不用接,这是开发板本身的)
LED1---PA8
LED2---PD2
​
9. 板载按键接线(这个不用接,这是开发板本身的)
K0---PA0 
K1---PC5 
K2---PA15
​
​
10. 等离子发生器开关
GND----GND
VCC---3.3V
OUT---PA7
​
11. 排风扇开关
GND----GND
VCC---3.3V
OUT---PA11
​
​
12. 蜂鸣器开关
GND----GND
VCC---3.3V
OUT---PA6
​
​
13. 加湿器开关
GND----GND
VCC---3.3V
OUT---PA12
​
​
14. PM2.5粉尘颗粒检测传感器
GND----GND
VCC---3.3V
输出VOUT--->PA5
内部LED--->PB4

6.2 取模软件使用

image-20221214171322161

6.3 KEIL工程

image-20221214175652087

6.4 硬件模块

(1)DHT11温湿度传感器

DHT11温湿度传感器是一种用于测量空气温度和湿度的传感器。它可以测量空气中的温度和湿度,并将其转换为数字信号,以便进行进一步处理。它可以用于家庭自动化,温室控制,温度控制,湿度控制,空气质量监测,环境监测,空调控制,空气净化器,恒温恒湿器.
​
DHT11如何通信?
​
DHT11通过一种叫做Single-Wire-Protocol(单线协议)的通信协议来进行通信。该协议是一种主从式的协议,由主机发起请求,从机响应请求,并将数据发送给主机。主机发出的信号是一个低电平信号,从机收到信号后,会响应一个低电平信号,然后发送数据。数据以40位的二进制位串的形式发送,其中前8位是湿度数据,接下来的8位是温度数据,最后8位是校验位

(2)MQ2烟雾传感器

MQ2烟雾传感器是一种用于检测烟雾浓度的传感器,它可以检测出烟雾的浓度,以及烟雾的种类。一般用于家庭安全、工业安全、环境监测等场合。MQ2烟雾传感器通常使用I2C或者UART通信协议、ADC进行通信,可以将检测到的烟雾浓度数据传输到主控制器,以便进行进一步的处理

6.5 核心代码

int main()
{
    u8 page_cnt=0; //页面切换
    float ppm;
    u8 esp8266_state=0;
    u8 key;
    u8 i;
    u32 time_cnt=0;
    u32 timer_hour_cnt=0; //记录定时的时间
    
    JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
    
    //板载LED初始化
    LED_Init();
    //板载按键初始化
    KEY_Init();
    //蜂鸣器初始化
    BEEP_Init();
    //串口1初始化,用于打印
    USART1_Init(115200);
    
    //串口2初始化: 
    USART2_Init(115200);//串口-WIFI
    TIMER2_Init(72,20000); //超时时间20ms
    
​
    //环境温湿度模块初始化
    DHT11_Init();       //初始化DHT11
    
    //LCD显示屏初始化
    Lcd_Init(); //LCD初始化
    Lcd_Clear(0); //清屏为黑色
    LCD_LED_SET;//通过IO控制背光亮(通过这个引脚控制显示屏开关)
    
    //ADC初始化  烟雾浓度、VOCS气体
    AdcInit(); 
    
    Gp2y10_init(); //粉尘传感器初始化
     
    
    //火焰检测传感器 、排风扇、等离子发生器、排风扇、水泵等等
    app_init();
    
      
    printf("正在初始化WIFI请稍等.\r\n");
    
    for(i=0;i<5;i++)
    {
        if(ESP8266_Init()==0)
        {
            esp8266_state=1;
            break;
        }
        else
        {
            esp8266_state=0;
            printf("ESP8266硬件检测错误.\n");  
        }
    }
  
   if(esp8266_state)
   {
       printf("准备连接服务器....\r\n");
       printf("CONNECT_WIFI:%s,CONNECT_PASS:%s\r\n",CONNECT_WIFI,CONNECT_PASS);
       
       //非加密端口
       printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
         
        //2. MQTT协议初始化  
        MQTT_Init(); 
​
        //3. 连接服务器  
        for(i=0;i<5;i++)
        {
            if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)
            {
                esp8266_state=1;
                break;
            }
            esp8266_state=0;
            printf("服务器连接失败,正在重试...\n");
            delay_ms(500);
        }
        printf("服务器连接成功.\n");
​
        //3. 订阅主题
        if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
        {
           printf("主题订阅失败.\n");
        }
        else
        {
           printf("主题订阅成功.\n");
        } 
   }
   
   
   while(1)
   {
        //按键可以手动控制开启水泵和LED灯
        key=KEY_Scan();
        if(key)printf("key=%d\r\n",key);
       
       
       //按键模块可以对汽车生产车间的温度、烟尘、VOCs浓度、烟雾浓度等环境参数的极限值进行设定
       //(第一个按键可以对模式进行选择,第二三个按键分别对该模式下的阈值进行加和减)利用显示屏将这些值显示
        //模式进行选择
       
        
        //显示屏翻页
        if(key==1)
        {
           Lcd_Clear(0); //清屏为黑色
           page_cnt++;
           if(page_cnt>=5)
           {
                page_cnt=0; 
                //如果是在第0页
                if(page_cnt==0)
                {
                    page_show();
                }
           }
           BEEP=0; //蜂鸣器关---消除警报
        }   
        //加阀值        
        else if(key==2)
        {
           //温度阀值
           if(page_cnt==1)
           {
              DHT11_T_MAX++;   
           }
           //烟尘阀值
           else if(page_cnt==2)
           {
                PM25_MAX++;
              
           }
           //VOCs浓度阀值
           else if(page_cnt==3)
           {
                VOCS_MAX++;
           }
           //烟雾浓度浓度阀值
           else if(page_cnt==4)
           {
                MQ2_MAX++;
           }
           
        }  
        //减去阀值
        else if(key==3)
        {
           //温度阀值
           if(page_cnt==1)
           {
              if(DHT11_T_MAX>0)DHT11_T_MAX--;
           }
           //烟尘阀值
           else if(page_cnt==2)
           {
                if(PM25_MAX>0)PM25_MAX--;
           }
           //VOCs浓度阀值
           else if(page_cnt==3)
           {
                if(VOCS_MAX>0)VOCS_MAX--;
           }
           //烟雾浓度浓度阀值
           else if(page_cnt==4)
           {
                if(MQ2_MAX>0)MQ2_MAX--;
           }
        }         
        
        
           //温度阀值
           if(page_cnt==1)
           {
               //阀值设置
               LCD_ShowChineseFont(16*2,16*0,16,HZ_FONT_16[24],RED,0);
               LCD_ShowChineseFont(16*3,16*0,16,HZ_FONT_16[25],RED,0);
               LCD_ShowChineseFont(16*4,16*0,16,HZ_FONT_16[26],RED,0);
               LCD_ShowChineseFont(16*5,16*0,16,HZ_FONT_16[27],RED,0);
               
               //环境温度
               LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[0],RED,0);
               LCD_ShowChineseFont(16*1,16*3,16,HZ_FONT_16[1],RED,0);
               LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[2],RED,0);
               LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[3],RED,0);
               //环境温度
               sprintf(data_buff,"%d",DHT11_T_MAX);
               Gui_DrawFont_GBK16(72,16*16*3,RED,0,(u8*)data_buff);
               
           }
           //烟尘阀值
           else if(page_cnt==2)
           {
                //阀值设置
               LCD_ShowChineseFont(16*2,16*0,16,HZ_FONT_16[24],RED,0);
               LCD_ShowChineseFont(16*3,16*0,16,HZ_FONT_16[25],RED,0);
               LCD_ShowChineseFont(16*4,16*0,16,HZ_FONT_16[26],RED,0);
               LCD_ShowChineseFont(16*5,16*0,16,HZ_FONT_16[27],RED,0);
               
               //PM25 粉尘含量
               LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[20],RED,0);
               LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[21],RED,0);
               LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[22],RED,0);
               LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[23],RED,0);
                //烟雾浓度
                sprintf(data_buff,"%d",PM25_MAX);
                Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)"        ");
                Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);
              
           }
           //VOCs浓度阀值
           else if(page_cnt==3)
           {
                //阀值设置
               LCD_ShowChineseFont(16*2,16*0,16,HZ_FONT_16[24],RED,0);
               LCD_ShowChineseFont(16*3,16*0,16,HZ_FONT_16[25],RED,0);
               LCD_ShowChineseFont(16*4,16*0,16,HZ_FONT_16[26],RED,0);
               LCD_ShowChineseFont(16*5,16*0,16,HZ_FONT_16[27],RED,0);
               
                //VOCS气体 -- 空气质量
               LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[8],RED,0);
               LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[9],RED,0);
               LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[10],RED,0);
               LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[11],RED,0);
               //空气质量
                sprintf(data_buff,"%d",VOCS_MAX);
                Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)"       ");
                Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);
               
           }
           //烟雾浓度浓度阀值
           else if(page_cnt==4)
           {
                //阀值设置
               LCD_ShowChineseFont(16*2,16*0,16,HZ_FONT_16[24],RED,0);
               LCD_ShowChineseFont(16*3,16*0,16,HZ_FONT_16[25],RED,0);
               LCD_ShowChineseFont(16*4,16*0,16,HZ_FONT_16[26],RED,0);
               LCD_ShowChineseFont(16*5,16*0,16,HZ_FONT_16[27],RED,0);
               
                //烟雾浓度 
               LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[12],RED,0);
               LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[13],RED,0);
               LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[14],RED,0);
               LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[15],RED,0);
                //烟雾浓度
                sprintf(data_buff,"%d",MQ2_MAX);
                Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)"        ");
                Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);   
           }
           
        
        //轮询时间到达
        if(time_cnt>200)
        {
            time_cnt=0;
            LED1=!LED1;
            
            //测试得到的数据和空气质量对照:3000 + = 很差
            //1050-3000 = 差
            //300-1050 = 一般
            //150-300 = 好
            //75-150 = 很好
            //0-75 = 非常好
            ppm=Gp2y10_Read_Dust();
            PM25=ppm; //转为整数
            printf("粉尘=%f\r\n",ppm);
            
            
            //VOCS气体检测传感器
            VOCS=GetAdcCHxDATA(4);
            printf("VOCS气体浓度:%d\r\n",VOCS);
            
            
            //获取环境温湿度
            if(DHT11_Read_Data(&DHT11_T,&DHT11_H))
            {
                printf("温度读取失败.\r\n");
            }
            printf("环境温度:%d\r\n环境湿度:%d\r\n",DHT11_T,DHT11_H);
            
            
            //烟雾浓度检测传感器MQ2
            MQ2=GetAdcCHxDATA(1);
            //ADC_data=(ADC_data/4096.0)*100.0;
            
            printf("烟雾浓度:%d\r\n",MQ2);
            
            //如果是在第0页
            if(page_cnt==0)
            {
                page_show();
            }
            
            //如果在自动模式下
            if(mode)
            {
                //温度过高的时候,会打开风扇进行温度调节
                //这里的值根据自己实际测试情况修改
                if(DHT11_T>DHT11_T_MAX)
                {
                    //motor=1;  //浇水
                }
                else
                {
                    //motor=0;  //停止浇水
                }
                
                //焊接烟尘(检测PM2.5模拟)
                //当浓度过高时,会蜂鸣器报警,开启排放通道,排放对烟尘进行处理,通过雾化降尘等操作处理烟尘
                //这里的值根据自己实际测试情况修改
                if(PM25>PM25_MAX)
                {
                    //BEEP=1; //蜂鸣器开
                    //ventilator=1; //排风扇开
                    //Humidifier=1; //雾化器-加湿器开
                }
                else
                {
                    //BEEP=0; //蜂鸣器关
                    //ventilator=0; //排风扇关
                    //Humidifier=0; //雾化器-加湿器关
                }
                
                
                //监测到VOCs气体浓度过高时,打开等离子发生器进行调节
                //这里的值根据自己实际测试情况修改
                if(VOCS>VOCS_MAX)
                {
                    //PlasmaGenerator=1;  //等离子发生器开
                }
                else
                {
                    //PlasmaGenerator=0;  //等离子发生器关
                }
            }
            
            //检测到火警
            if(flameCheck)
            {
                BEEP=1; //蜂鸣器开
            }
           
            //组合JSON报文数据
            sprintf(data_buff,"{"services": [{"service_id": "stm32","properties":{"MQ2":%d,"DHT11_T":%d,"DHT11_H":%d,"VOCS":%d,"motor":%d,"PM25":%d,"ventilator":%d,"Humidifier":%d,"mode":%d,"flameCheck":%d,"PlasmaGenerator":%d}}]}",
            MQ2,DHT11_T,DHT11_H,VOCS,motor,PM25,ventilator,Humidifier,mode,flameCheck,PlasmaGenerator);
            
            //上传数据
            MQTT_PublishData(POST_TOPIC,data_buff,0);
            printf("更新数据.\r\n");
           
        }
            
        // 接收WIFI返回的数据
        if(USART2_RX_FLAG)
        {
            USART2_RX_BUFFER[USART2_RX_CNT]='\0';
            
            printf("WIFI收到数据:\r\n");
            //向串口打印服务器返回的数据
            for(i=0;i<USART2_RX_CNT;i++)
            {
                printf("%c",USART2_RX_BUFFER[i]);
            }
            
#if 0
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=1053c1d1-a667-4928-9bff-53675cb1dedf{"service_id":"stm32","properties":{"ventilator":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=a56b5a29-2c49-4760-bb1f-01a7e840a0c1{"service_id":"stm32","properties":{"Humidifier":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=7d318685-67d1-4282-bd1a-9717cd1adc08{"service_id":"stm32","properties":{"motor":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=0c9fe3e5-30df-4caa-9ed4-3d89da400c60{"service_id":"stm32","properties":{"PlasmaGenerator":1}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=8576fcb7-a663-49e8-9da9-e46c70c8ce79{"service_id":"stm32","properties":{"mode":0}}
​
$oc/devices/639934ebf5ceb911701e1dfe_dev1/sys/properties/set/request_id=631466ed-22ea-4881-97af-a9cd44a1dc87{"service_id":"stm32","properties":{"mode":1}}
#endif
            //如果是下发了属性
            //$oc/devices/63579f5f3ec34a6d03c9481c_esp8266_iot/sys/properties/set/request_id=df7913a3-57f9-4c2b-bf78-da4c9542e986{"service_id":"dht11","properties":{"motor":1}}
            //
            if(USART2_RX_CNT>5)
            {
                //开  排风扇开关
                if(strstr((char*)&USART2_RX_BUFFER[5],""ventilator":1"))
                {
                    ventilator=1;   
                }
                //关  排风扇开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""ventilator":0"))
                {
                    ventilator=0;   
                }
                //开  加湿器开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""Humidifier":1"))
                {
                    Humidifier=1;
                }
                //关  加湿器开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""Humidifier":0"))
                {
                    Humidifier=0;
                }
                //开  水泵开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""motor":1"))
                {
                   motor=1;
                }
                //关  水泵开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""motor":0"))
                {
                   motor=0;
                }
                //开  等离子发生器开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""PlasmaGenerator":1"))
                {
                   PlasmaGenerator=1;
                }
                //关  等离子发生器开关
                else if(strstr((char*)&USART2_RX_BUFFER[5],""PlasmaGenerator":0"))
                {
                   PlasmaGenerator=0;
                }
                //模式切换开关  手动模式
                else if(strstr((char*)&USART2_RX_BUFFER[5],""mode":0"))
                {
                   mode=0;
                }
                //模式切换开关   自动模式
                else if(strstr((char*)&USART2_RX_BUFFER[5],""mode":1"))
                {
                   mode=1;
                }
                
                
                //下发指令请求回应给服务器
                if(strstr((char*)&USART2_RX_BUFFER[5],"properties/set/request_id"))
                {
                    char *p=NULL;
                    p=strstr((char*)&USART2_RX_BUFFER[5],"request_id");
                    if(p)
                    {        
                        //解析数据
                        //$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/get/request_id=5f359b5c-542f-460e-9f51-85e82150ff4a{"service_id":"gps"} 
                        strncpy(request_id,p,47);      
                    }
                    
                    //上报数据
                    sprintf(mqtt_message,"{"result_code": 0,"result_desc": "success"}");
                    
                    sprintf(data_buff,"$oc/devices/638aeb7b688437315b87164c_dev1/sys/properties/set/response/%s",
                    request_id);
                    
                    MQTT_PublishData(data_buff,mqtt_message,0);
                    
                    printf("发布主题:%s\r\n",data_buff);
                    printf("发布数据:%s\r\n",mqtt_message);
                }      
            }
            
            USART2_RX_CNT=0;
            USART2_RX_FLAG=0;
        }
        
        DelayMs(10);
        time_cnt++;
        timer_hour_cnt++;
     }
}

七、总结

7.1 项目介绍

我设计的项目是基于STM32的汽车修理厂环境监测系统。 本项目分为云平台部分和硬件端。在云平台方面,我使用了华为云IOT物联网平台,可以将设备上传到服务器,然后通过Qt设计的手机APP实现数据的显示,如果检测的数据阀值超标,会在手机APP弹窗显示提醒。在硬件端方面,主控采用了STM32F103RCT6,联网模块则是ESP8266,还选用了排风扇模块、雾化模块、水泵、蜂鸣器等设备,来采集和控制环境数据。

系统的具体功能实现包括如下几个方面: (1)可以通过传感器对汽车生产车间环境(包括温度、湿度、火焰、烟雾、焊接烟尘、VOCs)进行监测。 (2)按键模块可以对汽车生产车间的温度、烟尘、VOCs浓度、烟雾浓度等环境参数的极限值进行设定,并将这些值在显示屏上显示出来。 (3)自动模式可以实现当检测到火警信息、烟雾报警、PM2.5和温度过高、VOCs气体浓度过高的时候,自动驱动水泵进行灭火,蜂鸣器报警、开启排放通道等,以降低环境危险程度。 (4)手动模式下,用户可以通过按键对风扇、排放通道、雾化降尘、等离子发生器进行开启或关闭。 (5)数据上云方面,我们使用ESP8266+MQTT协议将数据实时上传到华为云物联网服务器,实现远程数据监测和设备控制。 (6)上位机方面,我们使用Qt开发Android手机APP,通过华为云物联网平台提供的API接口,利用HTTPS协议卡取数据,显示设备监测到的信息,同时可以远程控制通风、雾化降尘、水泵、等离子发生器的开关。连接数据库还可以查询监测到的历史数据,并在检测到火警、焊接烟尘、VOCs浓度过高时有提示信息。

本项目能够快速、精确地监测汽车生产车间的环境,并且能够自动化响应环境危险情况,提高环境安全性和生产效率。

7.2 大家可能不理解的项目问题回答

(1)该系统具体适用于哪些汽车生产车间?是否需要根据车间不同的环境条件进行定制? 回答:该系统适用于所有类型的汽车生产车间,无需定制。系统通过采集各种环境参数,对车间内的温度、烟尘、VOCs等进行实时监测和控制,可以大幅提升车间环境的安全性和稳定性。

(2)你在硬件设计方面遇到过哪些难点?如何解决? 回答:在硬件设计方面,我遇到了一些难点。例如,传感器数据的采集和处理、与ESP8266进行通信、液晶显示屏的驱动等等。为了解决这些问题,我深入分析了各个问题的本质,并结合实际情况进行了多次尝试和调试,最终顺利完成了系统的开发与部署。

(3)你使用的华为云IOT物联网平台具有哪些优势?与其他物联网平台相比,有何特别之处? 回答:我选择使用华为云IOT物联网平台,是因为其具有高度可靠、稳定性强、易于扩展等优势。与其他物联网平台相比,华为云IOT物联网平台还具有开放性强、API接口完善、支持多语言等特别之处,这使得系统可以更好地与其他应用场景进行集成和扩展。

(4)如何保证系统的安全性和稳定性? 回答:在设计系统的过程中,充分考虑了安全性和稳定性问题。在数据传输方面,我采用了MQTT协议进行数据加密传输,并设置了用户名和密码进行双重保护;在硬件设计方面,采用了STM32F103RCT6等高性能器件,保证系统的稳定性和可靠性;

(5)为什么要采用华为云物联网服务器远程控制? 与局域网控制有什么优势? 采用华为云物联网服务器可以实现全球范围内的远程控制,不受局域网限制,便于管理和监控。与局域网控制相比,远程控制具有更广泛的应用场景和更高的灵活性,能够更好地实现设备的智能化管控,并且可以随时随地对设备进行监测和控制。

(6)为什么选择STM32F103RCT6这个芯片作为设备端的主控芯片? STM32F103RCT6是一款低功耗、高性能的微控制器。它具有强大的计算能力和丰富的外设资源,非常适合用于物联网设备控制和环境监测等方面。此外,该芯片还集成了512KB的Flash存储器和64KB的SRAM,可以存储丰富的程序代码和数据,为实现复杂的功能提供了充足的空间。同时,STM32F103RCT6支持多种通信接口,如USART、I2C和SPI等,方便与其他模块进行交互,增强了系统的扩展性和兼容性。

(7)这个项目为什么选择Qt来开发上位机。 与其他语言框架有什么优势? 首先,Qt具有跨平台性,可在Windows、Linux、macOS等多个操作系统下进行开发,并可以将代码轻松移植到不同平台,方便了程序的开发和调试。 Qt框架提供了丰富的GUI控件库和UI设计工具,能够快速构建美观、直观的用户界面,并且其自带的信号槽机制使得处理用户交互事件更为方便。 Qt内置网络通信模块,可以方便地与底层硬件进行数据交互,并且通过其提供的网络通信接口,可以轻松实现与云端的数据交互。 Qt还支持多种编程语言(如C++、Python等)和开发工具(如Qt Creator、Visual Studio等),具有较高的灵活性和可扩展性。

(8)项目的设计思路 基于STM32的汽车修理厂环境监测系统,分为云平台部分和硬件端。在云平台部分,采用华为云IOT物联网平台,设备上传至服务器的数据进行显示,并可以进行阀值超标提醒。在硬件端,主控采用STM32F103RCT6,联网模块采用ESP8266,通过各类传感器采集环境数据进行处理,并通过ESP8266上传到云端,同时联动控制设备如排风扇模块、雾化模块、水泵、蜂鸣器。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。