手把手实践丨基于STM32+华为云设计的智慧烟感系统
摘要:当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。
本文分享自华为云社区《基于STM32+华为云设计的智慧烟感系统》,作者:DS小龙哥 。
一、概述
当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。系统可用于家庭、办公室等需要安装烟雾报警器场所。

二、系统设计
2.1 系统硬件设计
【1】硬件平台
该系统主要使用STM32F103ZET6微控制器作为核心控制器,并搭配数码显示器、蜂鸣器、MQ4烟雾传感器、WiFi模块等作为辅助组件。
【2】系统连接
STM32F103ZET6微控制器通过GPIO连接数码显示器、蜂鸣器、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和华为云平台,设计了一种智慧烟感系统。该系统可以检测烟雾浓度并上传数据到云端,通过云端进行分析和处理,实现报警和远程控制功能。通过不断地优化系统,可以不断提高系统的准确性和实用性,将其应用到更广泛的领域中。
手把手实践丨基于STM32+华为云设计的智慧烟感系统的更多相关文章
- 基于STM32+华为云IOT设计智能称重系统
摘要:选择部署多个重量传感器和必要的算法.通过WiFi 通信模块.GPS定位模块,采集车辆称重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重.地图位置等重要信息,实现对称重系统 ...
- Spring Boot 最流行的 16 条实践解读!【华为云技术分享】
置顶:华为云618大促火热进行中,全场1折起,免费抽主机,消费满额送P30 Pro,点此抢购. Spring Boot是最流行的用于开发微服务的Java框架.在本文中,将与大家分享自2016年以来笔者 ...
- SOA实践之基于服务总线的设计
在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...
- 打造极致性能数据库中间件丨LVS+Keepalive+华为云DDM之理论篇
背景说明 华为云分布式数据库中间件(Distributed Database Middleware,简称DDM),专注于解决数据库分布式扩展问题,突破了传统数据库的容量和性能瓶颈,实现海量数据高并发访 ...
- 自动驾驶轻松开发?华为云ModelArts赋能智慧出行
作为战略新兴产业,人工智能已经开始广泛应用于多个领域.近几年,科技公司.互联网公司等各领域的企业纷纷布局自动驾驶.那么,自动驾驶技术究竟发展得如何了?日前,华为云携手上海交通大学创新中心举办的华为云人 ...
- 动手实践丨手把手教你用STM32做一个智能鱼缸
摘要:本文基于STM32单片机设计了一款基于物联网的智能鱼缸. 本文分享自华为云社区<基于STM32+华为云IOT设计的物联网鱼缸[玩转华为云]>,作者: DS小龙哥 . 1. 前言 为了 ...
- CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统
摘要:以CC2530单片机为核心器件,设计一个冷链环境信息采集系统,利用传感器技术对冷藏仓内的环境参数进行采集,上传到华为云物联网云平台,然后通过手机端或移动端进行显示,便于分析,观察冷链环境信息. ...
- 大海航行靠舵手 华为云靠什么征服K8S?
Kubernetes 是Google开源的容器集群管理系统或者称为分布式操作系统.它构建在Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于 ...
- 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载
ArchSummit全球架构师峰会是InfoQ中国团队推出的重点面向高端技术管理者.架构师的技术会议,54%参会者拥有8年以上工作经验.ArchSummit聚焦业界强大的技术成果,秉承"实践 ...
- 基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一
[摘要]仓储管理存在四大细分场景:出入库管理.盘点.分拣和货物跟踪.本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践. 仓储 ...
随机推荐
- 小知识:SQL Monitor Report的使用
在上一篇 优化利器In-Memory开启和效果 中,提到的两个SQL对比,使用的是传统的dbms_xplan.display_cursor方式来查看执行计划,好处是文本输出的通用性强,基本信息也都有. ...
- odoo 开发入门教程系列-一些用户界面
一些用户界面 数据文件 (XML) 参考: 该主题关联文档可以查看Data Files. 上一章,我们通过CSV文件添加了数据.当需要添加数据格式简单时,用CSV格式还是很方便的,当数据格式更复杂时( ...
- 免费Midjourney AI绘画Prompt提示词平台合集
Midjourney AI绘图最关键的地方在于Prompt提示词写的好,一个好的提示词可以让AI模型创造出更优质的绘图,以下是8个免费的Midjourney Prompt提示词辅助平台. 编辑切换 ...
- CTF-RE-学习记录-汇编-2
汇编工具DTDebug 下载后设置好odd与插件路径,同时在属性中设置为管理员身份运行(无Administrator权限进入的时候一直在提示) 寄存器 存储数据: CPU>内存>硬盘 32 ...
- FreeSWITCH的originate命令解析及示例
FreeSWITCH版本:1.10.9 操作系统:CentOS 7.6.1810 originate经常用于发起呼叫,在实际工作过程中用到的也比较多,今天总结下基本用法,也方便我以后查阅. 一.wik ...
- 逍遥自在学C语言 | 算数运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.算数运算符简介 C语言的算数运算符,是用来完成基本的算术 ...
- 使用 screw(螺丝钉) 快速生成数据库文档
一.框架介绍 回想起那个去年的7月份,第一份实习,组长让我写一份金蝶云的SQL文档,当时一看2000多张表,当时就猛吸一根烟,然后去gitee看看有没有好的框架快速生成 SQL 文档 ,由此找到了 s ...
- 如何做到API文档规范化
定义一个好的 API 文档是优秀研发人员的标准配置,在执行接口测试之前,测试人员一定会先拿到开发给予的接口文档. 测试人员可以根据这个文档编写接口测试用例,优秀的文档可以区分好的用户体验和坏的用户体验 ...
- win32api中文在线文档
中文文档http://www.yfvb.com/help/win32sdk/ 英文手册https://www.jb51.net/books/724576.html
- [数据库/ORALCE]导入/导出数据
ORACLE数据导入/导出 工具介绍:EXP/IMP | EXPDP/IMPDP EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序 ...