写点什么

基于 STM32+ 华为云设计的智慧烟感系统

作者:DS小龙哥
  • 2023-04-28
    重庆
  • 本文字数:5618 字

    阅读完需:约 18 分钟

一、概述

当前基于 STM32 和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。系统可用于家庭、办公室等需要安装烟雾报警器场所。


二、系统设计

2.1 系统硬件设计

【1】硬件平台


该系统主要使用 STM32F103ZET6 微控制器作为核心控制器,并搭配 LCD 显示屏、蜂鸣器、MQ4 烟雾传感器、WiFi 模块等作为辅助组件。


【2】系统连接


STM32F103ZET6 微控制器通过 GPIO 连接 LCD 显示屏、蜂鸣器、MQ4 烟雾传感器等外设。通过 UART 连接 WiFi 模块,将读取到的数据上传到云端。


【3】系统工作流程


系统在启动时,首先进行硬件初始化和 WiFi 连接操作。之后,通过烟雾传感器实时检测室内环境中的烟雾浓度,当烟雾浓度超出一定阈值时,蜂鸣器会发出警报,同时将警报信息上传到云端。在云端,系统可以对上传的数据进行处理和分析,如通过分析历史数据预测烟雾浓度的变化趋势等。

2.2 系统软件设计

【1】软件平台


系统的软件平台主要由 STM32 的 HAL 库和华为云平台的 API 组成。


【2】软件流程


系统在启动时,首先进行硬件初始化和 WiFi 连接操作。之后,通过 HAL 库读取 MQ4 烟雾传感器的数据,并根据数据判断是否触发烟雾警报。如果触发了烟雾警报,则蜂鸣器发出警报,并通过 WiFi 模块将警报信息上传到云端。在云端,系统通过华为云平台的 API 接口获取上传的数据,并进行处理和分析。

三、华为云 IOT 平台开发

在华为云 IOT 平台上,需要进行设备接入、数据模型定义、规则引擎配置和应用开发等四个核心模块的开发。其中,设备接入模块包括设备注册、获取设备证书、建立连接等步骤,以保障设备与云平台之间的安全通信;数据模型定义模块需要根据实际需求定义相应的数据模型,包括上传数据格式、设备属性和服务等。规则引擎配置模块需要完成实时消息推送、远程控制和告警等功能。应用开发模块则是将完整的智能井盖系统进行打包,为用户提供统一的操作接口。


华为云官网: https://www.huaweicloud.com/


打开官网,搜索物联网,就能快速找到 设备接入IoTDA


3.1 物联网平台介绍

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


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


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


设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi 等多种网络接入物联网平台,并使用 LWM2M/CoAP、MQTT、HTTPS 协议将业务数据上报到平台,平台也可以将控制命令下发给设备。


业务应用通过调用物联网平台提供的 API,实现设备数据采集、命令下发、设备管理等业务场景。


3.2 开通物联网服务

地址: https://www.huaweicloud.com/product/iothub.html



开通标准版免费单元。




开通之后,点击总览,查看接入信息。 我们当前设备准备采用 MQTT 协议接入华为云平台,这里可以看到 MQTT 协议的地址和端口号等信息。



总结:


端口号:   MQTT (1883)| MQTTS (8883)  接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
复制代码


根据域名地址得到 IP 地址信息:


Microsoft Windows [版本 10.0.19044.2846](c) Microsoft Corporation。保留所有权利。
C:\Users\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据:来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31来自 121.36.42.100 的回复: 字节=32 时间=36ms TTL=31来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31
121.36.42.100 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 36ms,最长 = 37ms,平均 = 36ms
C:\Users\11266>
复制代码



MQTT 协议接入端口号有两个,1883 是非加密端口,8883 是证书加密端口,单片机无法加载证书,所以使用 1883 端口比较合适。 接下来的 ESP8266 就采用 1883 端口连接华为云物联网平台。

3.3 创建产品

(1)创建产品

点击右上角创建产品。


(2)填写产品信息

根据自己产品名字填写,设备类型选择自定义类型。

(3)添加自定义模型

产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。



模型简单来说: 就是存放设备上传到云平台的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状态图等等,这些我们都可以单独创建一个模型保存。

3.4 添加设备

产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。

(1)注册设备

点击右上角注册设备。


(2)根据自己的设备填写

在弹出的对话框里填写自己设备的信息。根据自己设备详细情况填写。

(3)保存设备信息

创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成 MQTT 三元组的时候需要使用。

3.5 MQTT 协议主题订阅与发布

(1)MQTT 协议介绍

当前的设备是采用 MQTT 协议与华为云平台进行通信。


MQTT 是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT 是专门针对物联网开发的轻量级传输协议。MQTT 协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前 MQTT 拥有各种平台和设备上的客户端,已经形成了初步的生态系统。


MQTT 是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT 协议是工作在 TCP/IP 协议上;由 TCP/IP 协议提供稳定的网络连接;所以,只要具备 TCP 协议栈的网络设备都可以使用 MQTT 协议。 本次设备采用的 ESP8266 就具备 TCP 协议栈,能够建立 TCP 连接,所以,配合 STM32 代码里封装的 MQTT 协议,就可以与华为云平台完成通信。


华为云的 MQTT 协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html



业务流程:


(2)华为云平台 MQTT 协议使用限制

(3)主题订阅格式

帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html



对于设备而言,一般会订阅平台下发消息给设备 这个主题。


设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。

(4)主题发布格式

对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。


这个操作称为:属性上报。


帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html


3.6 MQTT 三元组

MQTT 协议登录需要填用户 ID,设备 ID,设备密码等信息,就像我们平时登录 QQ,微信一样要输入账号密码才能登录。MQTT 协议登录的这 3 个参数,一般称为 MQTT 三元组。


接下来介绍,华为云平台的 MQTT 三元组参数如何得到。

(1)MQTT 服务器地址

要登录 MQTT 服务器,首先记得先知道服务器的地址是多少,端口是多少。


帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home



MQTT 协议的端口支持 1883 和 8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用 1883 端口进连接的。


根据上面的域名和端口号,得到下面的 IP 地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写 IP 地址。 (IP 地址就是域名解析得到的)


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

(2)生成 MQTT 三元组

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


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


下面是打开的页面:


3.7 参考案例

华为云平台部署开发也可以参考这里:


https://bbs.huaweicloud.com/blogs/381072


【基于华为云 IOT 平台实现多节点温度采集(STM32+NBIOT)】

四、烟感核心代码

【1】MQ2 传感器

以下是一个读取 MQ2 传感器数据,并转换为烟雾浓度的示例代码,


#include "stm32f10x.h"#include <stdio.h>
int main(void){ // 初始化ADC ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure);
// 配置ADC通道1的GPIO引脚 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure);
// 启动ADC校准 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1));
// 读取ADC值 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t adc_value = ADC_GetConversionValue(ADC1);
// 计算烟雾浓度 float voltage = (float)adc_value / 4096.0f * 3.3f; float density = (voltage - 0.4f) / 0.4f * 10000.0f;
// 打印出烟雾浓度 printf("MQ2 Smoke Density: %.2f ppm\n", density);}



float adc_average() { const int num_discarded = 3; // 剔除的最大/最小值数量 float samples[20]; // 存储采样结果的数组 // 采集数据 for (int i = 0; i < num_samples; i++) { samples[i] = ADC_GET(); } // 对采样结果进行排序(升序) for (int i = 0; i < num_samples - 1; i++) { for (int j = i + 1; j < num_samples; j++) { if (samples[i] > samples[j]) { float temp = samples[i]; samples[i] = samples[j]; samples[j] = temp; } } } // 计算剩下的平均值 float sum = 0; for (int i = num_discarded; i < num_samples - num_discarded; i++) { sum += samples[i]; } return sum / (num_samples - 2 * num_discarded); // 返回计算结果}
复制代码

【2】MQ4 传感器

以下是基于 HAL 库的 STM32F103ZET6 读取 MQ4 烟雾传感器的代码:


#include "gpio.h"
/* MQ4传感器的引脚定义 */#define MQ4_PORT GPIOA#define MQ4_PIN GPIO_PIN_0
/* MQ4传感器的校准电压 */#define MQ4_RL_VALUE 10 // RL值为10kΩ#define MQ4_CALCULATE_RO_CLEAN(adcValue) ((float)(RL_VALUE*(4096-adcValue)/adcValue))
/* 获取MQ4传感器的数据 */float get_mq4_value(){ uint32_t adc_value = HAL_ADC_GetValue(&hadc1); float ro = MQ4_CALCULATE_RO_CLEAN(adc_value); float sensor_volt = HAL_ADC_GetValue(&hadc2) * (3.3 /4096.0); float sensor_rsr = (3.3 - sensor_volt) / sensor_volt * ro; float mq4_ppm = pow(10, ((log10(sensor_rsr / 2.5) - 0.3420) / (-0.6162))); return mq4_ppm;}
/* 主函数 */int main(){ HAL_Init(); MX_GPIO_Init(); MX_ADC1_Init(); MX_ADC2_Init(); /* 读取MQ4传感器数据 */ float mq4_value = get_mq4_value();
printf("MQ4传感器值:%.2f PPM\r\n", mq4_value);
while (1);}
复制代码


在该示例代码中,我们用到了 ADC1 和 ADC2 来分别读取 MQ4 传感器的数据引脚和校准电压。函数 get_mq4_value()中使用了 MQ4 传感器的电路计算公式,将读取的传感器数据转化成对应的 PPM 值。

五、系统优化设计

为了提高系统的准确性和实用性,采取以下优化方案:


【1】使用多个传感器


在实际应用中,可以通过使用多个烟雾传感器来提高系统的准确性。安装多个传感器,可以检测到更多的区域,从而更准确地判断室内是否有烟雾浓度超标的情况。


【2】使用专业的云平台


为了更好地管理和分析数据,可以选择一个专业的云平台,如华为云。使用云平台,可以更方便地对数据进行分析和处理,并实现更多的智能化管理功能。


【3】提高警报效果


为了更好地提高警报效果,除了使用蜂鸣器外,还可以考虑使用其他类型的报警器,如闪光灯、震动器等。这些报警器可以在不同场合下提供更好的报警效果。


【4】引入云服务


将数据上传到云端,不仅可以对数据进行分析和处理,还可以通过云平台提供的服务,如语音警报、邮件通知等方式及时向用户通报警情,让用户第一时间采取措施。


【5】实现远程控制


若在系统中加入控制模块,用户就可以在远程控制平台上通过云端控制系统,如关闭报警器、打开风扇等。对于需要海量数据处理和智能控制的复杂系统,基于云服务的远程控制就显得尤为重要。

六、总结

本文基于 STM32 和华为云平台,设计了一种智慧烟感系统。该系统可以检测烟雾浓度并上传数据到云端,通过云端进行分析和处理,实现报警和远程控制功能。通过不断地优化系统,可以不断提高系统的准确性和实用性,将其应用到更广泛的领域中。

发布于: 刚刚阅读数: 4
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
基于STM32+华为云设计的智慧烟感系统_三周年连更_DS小龙哥_InfoQ写作社区