本文分享自华为云社区《依据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渠道上,需要进行设备接入、数据模型界说、规则引擎装备和运用开发等四个中心模块的开发。其中,设备接入模块包含设备注册、获取设备证书、树立衔接等步骤,以保证设备与云渠道之间的安全通讯;数据模型界说模块需要依据实践需求界说相应的数据模型,包含上传数据格式、设备特点和服务等。规则引擎装备模块需要完结实时音讯推送、长途操控和告警等功用。运用开发模块则是将完好的智能井盖体系进行打包,为用户供给一致的操作接口。
华为云官网: www.huaweicloud.com/
翻开官网,查找物联网,就能快速找到 设备接入IoTDA。
3.1 物联网渠道介绍
华为云物联网渠道(IoT 设备接入云服务)供给海量设备的接入和办理才干,将物理设备联接到云,支撑设备数据收集上云和云端下发指令给设备进行长途操控,合作华为云其他产品,协助咱们快速构筑物联网解决方案。
运用物联网渠道构建一个完好的物联网解决方案主要包含3部分:物联网渠道、事务运用和设备。
物联网渠道作为衔接事务运用和设备的中间层,屏蔽了各种复杂的设备接口,完结设备的快速接入;一起供给强大的敞开才干,支撑职业用户构建各种物联网解决方案。
设备能够经过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网渠道,并运用LWM2M/CoAP、MQTT、HTTPS协议将事务数据上报到渠道,渠道也能够将操控指令下发给设备。
事务运用经过调用物联网渠道供给的API,完结设备数据收集、指令下发、设备办理等事务场景。
3.2 开通物联网服务
地址: www.huaweicloud.com/product/iot…
开通标准版免费单元。
开通之后,点击总览,检查接入信息。 咱们当时设备准备选用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协议接入协助文档在这儿: support.huaweicloud.com/devg-iothub…
事务流程:
(2)华为云渠道MQTT协议运用限制
(3)主题订阅格式
协助文档地址:support.huaweicloud.com/devg-iothub…
关于设备而言,一般会订阅渠道下发音讯给设备 这个主题。
设备想接收渠道下发的音讯,就需要订阅渠道下发音讯给设备 的主题,订阅后,渠道下发音讯给设备,设备就会收到音讯。
(4)主题发布格式
关于设备来说,主题发布表明向云渠道上传数据,将最新的传感器数据,设备状态上传到云渠道。
这个操作称为:特点上报。
协助文档地址:support.huaweicloud.com/usermanual-…
3.6 MQTT三元组
MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像咱们平时登录QQ,微信相同要输入账号密码才干登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。
接下来介绍,华为云渠道的MQTT三元组参数怎么得到。
(1)MQTT服务器地址
要登录MQTT服务器,首要记住先知道服务器的地址是多少,端口是多少。
协助文档地址:console.huaweicloud.com/iotdm/?regi…
MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上运用比较困难,所以当时的设备是选用1883端口进衔接的。
依据上面的域名和端口号,得到下面的IP地址和端口号信息: 假如设备支持填写域名能够直接填域名,不支持就直接填写IP地址。 (IP地址便是域名解析得到的)
华为云的MQTT服务器地址:121.36.42.100
华为云的MQTT端口号:1883
(2)生成MQTT三元组
华为云供给了一个在线工具,用来生成MQTT鉴权三元组: iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
翻开这个工具,填入设备的信息(也便是刚才创立完设备之后保存的信息),点击生成,就能够得到MQTT的登录信息了。
下面是翻开的页面:
3.7 参考案例
华为云渠道部署开发也能够参考这儿:
bbs.huaweicloud.com/blogs/38107…
【依据华为云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和华为云渠道,规划了一种才智烟感体系。该体系能够检测烟雾浓度并上传数据到云端,经过云端进行剖析和处理,完结报警和长途操控功用。经过不断地优化体系,能够不断进步体系的准确性和实用性,将其运用到更广泛的领域中。
点击重视,第一时刻了解华为云新鲜技术~