本文分享自华为云社区《依据STM32+NBIOT+华为云IOT规划的智能井盖》,作者:DS小龙哥 。

一、概述

智能井盖是一种经过物联网技术完结对井盖状况监测和办理的设备。当时介绍依据STM32微操控器,BC26 NBIOT模组以及华为云IOT渠道规划一款智能井盖体系。该体系经过光线传感器、霍尔传感器、温湿度传感器等设备完结井盖状况的实时监测,经过NBIOT网络将数据上传到华为云IOT渠道,再经过云渠道下发操控指令完结远程办理。

运用场景

智能井盖体系能够广泛运用于城市办理、交通建造等领域,其间具体运用场景包含:

(1)实时监测井盖状况,及时发现井盖敞开或异常情况,进步城市办理的效率和安全性;

(2)供给实时环境监测数据,协助提升城市环境监测才干;

(3)运用NBIOT网络和华为云渠道的远程操控功能,能够完结智能井盖的开关操控和监管,避免人工操作不便和监管不到位引起的危险。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

二、硬件规划

本体系的硬件规划首要包含传感器模块和操控模块两部分,其间传感器模块首要担任收集井盖状况信息,操控模块则担任数据处理和通讯。

【1】传感器模块

(1)光线传感器:光线传感器用于感知井盖上方光线强度,判别井盖是否显露地上。当井盖被遮住时,光线传感器输出低电平;当井盖暴露在外时,光线传感器输出高电平。

(2)霍尔传感器:霍尔传感器用于感知井盖状况(开/关),当井盖开启时,霍尔传感器输出高电平;当井盖封闭时,霍尔传感器输出低电平。

(3)温度传感器和湿度传感器:温度传感器和湿度传感器用于感知井盖下方的环境温湿度,实时反馈给体系,便于监测井盖下方环境状况。

【2】操控模块

(1)STM32微操控器:运用STM32F103C8T6微操控器,首要担任传感器数据收集、处理和操控模块与NBIOT模组之间的通讯。

(2)BC26 NBIOT模组:运用BC26 NBIOT模组,经过NBIOT网络将收集到的井盖状况数据上传到华为云IOT渠道,同时支撑远程操控井盖开关。

(3)LED指示灯:选用不同颜色的LED指示灯,将井盖状况(开/关、异常、低电量)实时反馈给用户。

软件规划 软件规划首要包含STM32微操控器程序规划和华为云IOT渠道开发两部分。

STM32微操控器程序规划: 首要包含三个模块:传感器收集模块、数据处理模块和通讯模块。其间传感器收集模块担任收集传感器数据并进行处理;数据处理模块依据收集的数据进行逻辑处理,判别井盖状况;通讯模块担任与NBIOT模组之间的通讯,将处理后的数据上传至华为云IOT渠道。

三、华为云IOT渠道开发

在华为云IOT渠道上,需求进行设备接入、数据模型界说、规则引擎配置和运用开发等四个中心模块的开发。其间,设备接入模块包含设备注册、获取设备证书、树立衔接等步骤,以保障设备与云渠道之间的安全通讯;数据模型界说模块需求依据实践需求界说相应的数据模型,包含上传数据格局、设备属性和服务等。规则引擎配置模块需求完结实时音讯推送、远程操控和告警等功能。运用开发模块则是将完整的智能井盖体系进行打包,为用户供给一致的操作接口。

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

翻开官网,查找物联网,就能快速找到 设备接入IoTDA

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

3.1 物联网渠道介绍

华为云物联网渠道(IoT 设备接入云服务)供给海量设备的接入和办理才干,将物理设备联接到云,支撑设备数据收集上云和云端下发指令给设备进行远程操控,合作华为云其他产品,协助我们快速构筑物联网解决方案

运用物联网渠道构建一个完整的物联网解决方案首要包含3部分:物联网渠道、事务运用和设备。

物联网渠道作为衔接事务运用和设备的中间层,屏蔽了各种杂乱的设备接口,完结设备的快速接入;同时供给强壮的敞开才干,支撑职业用户构建各种物联网解决方案。

设备能够经过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网渠道,并运用LWM2M/CoAP、MQTT、HTTPS协议将事务数据上报到渠道,渠道也能够将操控指令下发给设备。

事务运用经过调用物联网渠道供给的API,完结设备数据收集、指令下发、设备办理等事务场景。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

3.2 注册物联网服务

地址: www.huaweicloud.com/product/iot…

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

注册标准版免费单元。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

注册之后,点击总览,检查接入信息。 我们当时设备预备选用MQTT协议接入华为云渠道,这儿能够看到MQTT协议的地址和端口号等信息。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

总结:

 端口号:   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>

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

MQTT协议接入端口号有两个,1883对错加密端口,8883是证书加密端口,单片机无法加载证书,所以运用1883端口比较合适。 接下来的ESP8266就选用1883端口衔接华为云物联网渠道。

3.3 创立产品

(1)创立产品

点击右上角创立产品。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

(2)填写产品信息

依据自己产品名字填写,设备类型选择自界说类型。

(3)增加自界说模型

产品创立完结之后,点击进入产品概况页面,翻到最下面能够看到模型界说。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

模型简单来说: 便是寄存设备上传到云渠道的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状况图等等,这些我们都能够独自创立一个模型保存。

3.4 增加设备

产品是归于上层的抽象模型,接下来在产品模型下增加实践的设备。增加的设备终究需求与实在的设备相关在一起,完结数据交互。

(1)注册设备

点击右上角注册设备。

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

(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…

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

事务流程:

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

(2)华为云渠道MQTT协议运用约束

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

(3)主题订阅格局

协助文档地址:support.huaweicloud.com/devg-iothub…

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

关于设备而言,一般会订阅渠道下发音讯给设备 这个主题。

设备想接纳渠道下发的音讯,就需求订阅渠道下发音讯给设备 的主题,订阅后,渠道下发音讯给设备,设备就会收到音讯。

(4)主题发布格局

关于设备来说,主题发布表明向云渠道上传数据,将最新的传感器数据,设备状况上传到云渠道。

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

协助文档地址:support.huaweicloud.com/usermanual-…

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

3.6 MQTT三元组

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

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

(1)MQTT服务器地址

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

协助文档地址:console.huaweicloud.com/iotdm/?regi…

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

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的登录信息了。

下面是翻开的页面:

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

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值。

五、总结

当时文章介绍依据STM32微操控器、BC26 NBIOT模组和华为云IOT渠道,完结了一款智能井盖体系。该体系经过多种传感器完结了井盖状况的实时监测和数据上传,在运用上具有重要的运用场景和实践运用价值。整体介绍了体系硬件和软件规划的各个环节,对相关产品的开发供给了一定的参考价值和规划思路。

点击关注,第一时刻了解华为云新鲜技术~