基于STM32+NBIOT+华为云IOT设计的智能井盖

发布者:浊酒最新更新时间:2023-10-11 来源: elecfans关键字:STM32  NBIOT  智能井盖 手机看文章 扫描二维码
随时随地手机看文章

一、概述

智能井盖是一种通过物联网技术实现对井盖状态监测和管理的设备。当前介绍基于STM32微控制器,BC26 NBIOT模组以及华为云IOT平台设计一款智能井盖系统。该系统通过光线传感器、霍尔传感器、温湿度传感器等设备实现井盖状态的实时监测,通过NBIOT网络将数据上传到华为云IOT平台,再通过云平台下发控制指令实现远程管理。


应用场景

智能井盖系统可以广泛应用于城市管理、交通建设等领域,其中具体应用场景包括:

(1)实时监测井盖状态,及时发现井盖开放或异常情况,提高城市管理的效率和安全性;

(2)提供实时环境监测数据,帮助提升城市环境监测能力;

(3)利用NBIOT网络和华为云平台的远程控制功能,可以实现智能井盖的开关控制和监管,避免人工操作不便和监管不到位引起的危险。

image-20230426095637493image-20230426095643915

二、硬件设计

本系统的硬件设计主要包括传感器模块和控制模块两部分,其中传感器模块主要负责采集井盖状态信息,控制模块则负责数据处理和通信。

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

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

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

image-20221204193824815

3.1 物联网平台介绍

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

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

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

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

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

img

3.2 开通物联网服务

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

image-20221204194233414

开通标准版免费单元。

image-20230420181306316image-20230420181322092

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

image-20230423111235524

总结:

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

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

Microsoft Windows [版本 10.0.19044.2846]
(c) Microsoft Corporation。保留所有权利。

C:Users11266>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:Users11266>

image-20230423111213624

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

3.3 创建产品

(1)创建产品

点击右上角创建产品。

image-20230420181503524

(2)填写产品信息

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

(3)添加自定义模型

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

image-20230420181615129

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

3.4 添加设备

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

(1)注册设备

点击右上角注册设备。

image-20230421091842025

(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

img

业务流程:

img

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

描述限制
支持的MQTT协议版本3.1.1
与标准MQTT协议的区别支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg
MQTTS支持的安全等级采用TCP通道基础 + TLS协议(最高TLSv1.3版本)
单帐号每秒最大MQTT连接请求数无限制
单个设备每分钟支持的最大MQTT连接数1
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关3KB/s
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝1MB
MQTT连接心跳时间建议值心跳时间限定为30至1200秒,推荐设置为120秒
产品是否支持自定义Topic支持
消息发布与订阅设备只能对自己的Topic进行消息发布与订阅
每个订阅请求的最大订阅数无限制

(3)主题订阅格式

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

image-20221207153310037

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

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

(4)主题发布格式

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

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

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

image-20221207153637391

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

image-20230411141412090

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

下面是打开的页面:

image-20221207154917230

3.7 参考案例

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

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

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


四、读取烟雾气体浓度

【1】MQ2传感器

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


#include "stm32f10x.h"

#include 

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 ppmn", 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 PPMrn", mq4_value);

   while (1);

}

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


五、总结

当前文章介绍基于STM32微控制器、BC26 NBIOT模组和华为云IOT平台,实现了一款智能井盖系统。该系统通过多种传感器实现了井盖状态的实时监测和数据上传,在应用上具有重要的应用场景和实际应用价值。整体介绍了系统硬件和软件设计的各个环节,对相关产品的开发提供了一定的参考价值和设计思路。


关键字:STM32  NBIOT  智能井盖 引用地址:基于STM32+NBIOT+华为云IOT设计的智能井盖

上一篇:STM32片内RTC亚秒特性的应用示例(下)
下一篇:利用STM32定时器实现呼吸灯

推荐阅读最新更新时间:2024-11-10 20:20

STM32到CONST的全局变量
程序如下: const int globalConstDat = 12; int globalDat = 11; int main(void) { int localDat = 6; const int localConstDat = 7; USART_Configuration(); //ptint to PC from USART1 printf( &globalConstDat = 0x%p, &globalDat = 0x%prnrn , &globalConstDat, &globalDat); printf( &localDat = 0x%p, &localConstDat = 0x%prn , &localDat
[单片机]
STM32学习基本 存储器、CRC、电源
1、STM32命名规则? 例子:STM32 F 103 C 8 T 6 A xxx 其中: (1) 产品系列 STM32:基于ARM核心的32位微控制器; (2)产品类型: F:通用型 (3)产品子系列: 101:基本型;102:USB基本型,USB2.0全速设备;103:增强型;105/107:互联型。 (4)引脚数目: T:36脚;C:48脚;R:64脚;V:100脚;z:144脚。 (5)闪存存储器容量: 4:16k;6:32k;8:64k;B:128k;C:256k;D:384k;E:512K。 (6)封装: H:BGA;T:LQFP;U:VFQFPN;Y:WLCSP64; (7)温度范围: 6:工业级:-4:0-85;7
[单片机]
STM32 关于定时器相关问题的探讨(二)
4.硬件设计 4.1LED驱动电路 利用单片机产生得PWM驱动电路直接驱动LED电路来验证,当输出PWM宽度变化时可以看到此时LED亮度变化,此时只需要将LED上拉就可以实现验证。当输入为低电平时,LED灯发光 4.2 SPWM滤波方案 利用高级定时器,我们能产生一系列PWM脉宽随时间变化的PWM波形,通过简单的RC滤波就可以将SPWM滤波成正弦波 5.软件设计过程 5.1 四路pwm输出配置 5.1.1 GPIO初始化 初始化引脚(PA6、PA7,PB0、PB1),这里拿出初始化PA6例子 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RC
[单片机]
<font color='red'>STM32</font> 关于定时器相关问题的探讨(二)
STM32外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序
本篇介绍STM32如何外接温湿度传感器实现当前环境温湿度的读取,并显示到OLED屏幕上。 1 DTH11温湿度传感器 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,包括一个电阻式感湿元件和一个NTC测温元件。 1.1 数据读取协议 微控制器MCU与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。 从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT1
[单片机]
<font color='red'>STM32</font>外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序
STM32基于固件库学习笔记(3)串口的收发功能+WiFi基础配置
串口设置的一般步骤 1) 串口时钟使能,GPIO 时钟使能   注:串口是挂载在 APB2 下面的外设还需要需要挂载复用时钟使能 //挂载时钟(复用PA) 串口时钟使能,GPIO 时钟使能,复用时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); 2) 串口复位 //系统刚开始配置外设的时候,都会先执行复位该外设的操作。 void USART_DeInit(USART_TypeDef* USARTx);//串口复位 3) GPIO 端口模式设置  注意:RXT、TXT输
[单片机]
<font color='red'>STM32</font>基于固件库学习笔记(3)串口的收发功能+WiFi基础配置
STM32串口发送问题
在串口1发送中,第一个字总是发不出来,单步调试发送正常,硬件上电复位发送不正常,发现是STM32上电复位后需要先读取 USART_SR,然后写 USART_DR,解决办法在串口初始化加入USART_GetFlagStatus(USART2, USART_FLAG_TC); void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GP
[单片机]
STM32 定时器中断函数
#include timer.h #include led.h //晶振是8MHZ,默认CPU是9倍频, //通用定时器 3 中断初始化 //这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M // SYSCLK:72M // AHB:72M // APB1(PCLK1):36M // APB2(PCLK2):72M // PLL:72M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器 3 //定时器溢出时间计算方式Tout=((arr+1)*(psc+1))/Ftus. voidTIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitT
[单片机]
STM32之PVD电压检测
如果VDD或者VDDA电压高于或低于PVD设定阈值都产生中断,表现为每中断一次,LED1就亮变灭或者灭变亮。 /******************************************************************************** * @file PWR/PVD/main.c * @author MCD Application Team * @version V3.4.0 * @date 10/15/2010 * @brief Main program body. *********************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved