写点什么

基于 STM32+ 华为云 IOT 设计的云平台监控系统

作者:DS小龙哥
  • 2022 年 6 月 26 日
  • 本文字数:8844 字

    阅读完需:约 29 分钟

1. 前言

智能系统作为新兴产业,是国家重点发展产业之一。国外自美国在 1984 年建设出真正的智能建筑至今为止已经有 30 多年的历史了。由于智能家居的安全、高效、便捷以,及智能化等独特魅力,使智能家居行业在 2003 年逐步进入我国的家居市场,但是由于我国起步晚,使得智能家居行业标准在我国家居市场上并不统一。随着全球资源的不断减少以及环境的破坏,“节能环保”成为了全球科技发展的首要要求,而“全球智能化”在节能环保方面的优势使得智能家居成为了发展主流,因此具有十分广阔的市场前景。同时,随着科技的进步,传统建筑已经不能满足现代人对生活方面舒适度的需求,而智能系统也在不知不觉间渗入我们的生活。


智能家居(smart home)以住宅为平台,利用嵌入式单片机为核心控制器来实现无 线通信、安全防范及自动控制技术的智能家居环境的系统集成,用以实现对智能家居 环境的远程安防监控,环境监测以及各个子系统的控制,构建了高效智能的住宅设施 与家庭安全的管理系统,家居智能性、安全性,便利性和舒适性等都有显著提高,有效的提高了人们生活品质。


智能家居不仅提供舒适宜人且高品位的家庭生活空间,实现更智能的家庭安防系统;还将家居环境由原来的被动静止结构转变为具有能动智慧的工具,提供全方位的信息交互功能。物联网中的无线传感器应用对家庭的智能防灾,灯光控制,以及家电联网都提供了一种很好的解决办法。而且使用 GPRS 通信模块,可以将家庭中的突发事件信息告知户主,并且进行智能报警。这样就极大降低了家庭意外灾难的损失。


本次设计结合现代生活的具体需求,设计出一套基于华为云 IOT 设计的云平台监控系统,可以远程实时查看家里光照强度、温湿度等信息,支持在云端控制家里的电器设备,实现远程控制。

2. 具体需求

主要实现对光照强度、温湿度等信息的实时监测,将相关信息、设备状态信息等实时显示,通过 ESP8266wifi 模块进行联网可实现远程数据传输,利用华为云 IOT 物联网云平台,MQTT 传输协议,调用华为云 IOT 平台提供的接口设计上位机实现远程控制显示。


硬件选项要求:


(1)ESP8266 串口 WIFI,用来与 OneNet 进行远程通信。


(2)DHT11 温度传感器,检测本地环境的温度湿度信息。


(3)继电器,来模拟控制家里的电器。


(4)BH1750 光敏传感器,检测环境光强度


(5)MQ135 空气质量传感器。可以检测可燃气体、烟雾浓度,实现火警预警。


(6)OLED 显示屏显示本地的传感器的参数情况,实时展示










3. 硬件选型

3.1 继电器

3.2 ESP8266 WIFI

(1)模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP 协议栈,能够实现串口与 WIFI 之间的转换(2)模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统(3)模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFIAP 的模式,从而快速构建串口-WIFI 数据传输方案


3.3 MQ-135 空气质量传感器

MQ135 传感器对氨气、硫化物、苯系蒸汽的灵敏度高,对烟雾和其它有害的监测也很理想。这种传感器可检测多种有害气体,是一款适合多种应用的低成本传感器。




3.4 DHT11 温湿度传感器

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有可靠性与卓越的长期稳定性,成本低、相对湿度和温度测量、快响应、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括一个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。可用于暖通空调、除湿器、测试及检测设备、消费品、汽车、自动控制、数据记录器、气象站、家电、湿度调节器、医疗、其他相关湿度检测控制。


特点如下:


1、可以检测周围环境的湿度


2、可以检测周围环境的温度


3、湿度测量范围:20%-95%(0 度-50 度范围)湿度测量误差:+-5%4、温度测量范围:o 度-50 度温度测量误差:+-2 度


4、工作电压 3.3V-5V


5、输出形式数字输出



3.5 STM32 系统板

主控 CPU 采用 STM32F103RCT6,这颗芯片包括 48 KB SRAM、256 KB Flash、2 个基本定时器、4 个通用定时器、2 个高级定时器、51 个通用 IO 口、5 个串口、2 个 DMA 控制器、3 个 SPI、2 个 I2C、1 个 USB、1 个 CAN、3 个 12 位 ADC、1 个 12 位 DAC、1 个 SDIO 接口,芯片属于大容量类型,配置较高,整体符合硬件选型设计。当前选择的这款开发板自带了一个 1.4 寸的 TFT-LCD 彩屏,可以显示当前传感器数据以及一些运行状态信息。


3.6 OLED 显示屏


特点:


OLED是有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层、和玻璃基板、当有电流通过时、这些有机材料就会发光、而且OLED显示屏幕可视角大、功耗低、OLED由于同时具备自发光、不需背光源(只是供电不会亮的、驱动程序和接线正确才会点亮)对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高、而OLED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的显示效果好、模块供电可以是3.3v也可以是5V、不需要修改模块电路、OLED屏具有多个控制指令、可以控制oLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCH、图案等、同时为了方便应用在产品上、预留4个M3固定孔、方便用户固在机壳上。
复制代码

3.7 母对母杜邦线

3.8 BH1750 光敏传感器

4. 登录华为云创建云端产品与设备

4.1 创建产品

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






MQTT (1883)  a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com  
复制代码


我们设备接入的协议选择 MQTT,端口对应是 1883


接下来继续创建产品,点击产品页面,点击右上角创建产品:




4.2 创建设备


4.3 产品模型定义

这一步就是设置上报设备的属性,也就是设备的数据类型定义。





4.4 生成 MQTT 登录密匙

创建完产品、设备之后,接下来就需要知道如何通过 MQTT 协议登陆华为云服务器。


官方的详细介绍在这里: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112




MQTT 设备登陆密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/


4.5 使用 MQTT 客户端软件登录

所有的参数已经得到,接下来采用 MQTT 客户端登录华为云进行测试。


下面这个软件是自己开发的,为了方便测试 MQTT 协议登录。


华为云物联网平台的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com


华为云物联网平台的 IP 地址是: 121.36.42.100



4.6 上报数据

官方文档: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112


在这个文档里介绍了 MQTT 上报数据的格式。





总结的格式:


//订阅主题: 平台下发消息给设备$oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/messages/down
//设备上报数据$oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/properties/report
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了){"services": [{"service_id": "dht11","properties":{"DHT11-C":50}}]}
复制代码


5. STM32 设备端代码

STM32 连接华为云 IOT 的工程代码 Get: https://download.csdn.net/download/xiaolong1126626497/81993720


串口上会输出当前程序运行的状态信息,可以打开串口调试助手查看。


5.1 LCD 汉字取模

LCD 上需要显示汉字,使用点阵字模取模软件进行取模。


5.2 硬件连线


1. ESP8266 WIFI接线ATK-ESP8266串口WIFI模块与STM32的串口2相连接。PA2(TX)--RXD 模块接收脚PA3(RX)--TXD 模块发送脚GND---GND 地VCC---VCC 电源(3.3V~5.0V)
2. TFT 1.44 寸彩屏接线GND 电源地VCC 接5V或3.3v电源SCL 接PC8(SCL)SDA 接PC9(SDA)RST 接PC10DC 接PB7CS 接PB8BL 接PB11
3. DHT11 温湿度VCC--VCCGND---GNDDAT---PA5
4. LED灯-模拟房间的照明灯VCC--->5VDAT--->PB12 GND--->GND
5. 智能窗帘-模拟家里的窗帘VCC--->5VDAT--->PB13 GND--->GND
6. MQ135空气质量检测传感器VCC--->5VGND--->GNDDAT--->PA1
7. BH1750环境光检测模块:SDA-----PB5SCL-----PB6GND---GND 地VCC---VCC 电源(3.3V~5.0V)
8. 板载LED灯接线LED1---PA8LED2---PD2
9. 板载按键接线K0---PA0 K1---PC5 K2---PA15
复制代码

5.2 keil 工程布局

工程 Get 地址: https://download.csdn.net/download/xiaolong1126626497/81993720



5.3 main.c 代码

MQTT 协议连接华为云 IOT 源码工程参考: https://download.csdn.net/download/xiaolong1126626497/81993720


#include "stm32f10x.h"#include "led.h"#include "delay.h"#include "key.h"#include "usart.h"#include <string.h>#include "timer.h"#include "esp8266.h"#include "motor.h"#include "oled.h"#include "dht11.h"#include "adc.h"#include <string.h>#include <stdlib.h>#include "font.h"#include "mqtt.h"#include "iic.h"#include "bh1750.h"
/*
(1)ESP8266 串口WIFI,用来与华为云IOT进行远程通信。
(2)DHT11 温度传感器,检测本地环境的温度湿度信息。
(3)继电器,来模拟控制家里的电器。
(4)BH1750 光敏传感器,检测环境光强度
(5)MQ135 空气质量传感器。可以检测可燃气体、烟雾浓度,实现火警预警。
(6)OLED显示屏显示本地的传感器的参数情况,实时展示
*/

//华为物联网服务器的设备信息#define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510"#define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497"#define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242"
//订阅与发布的主题#define SET_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down" //订阅#define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report" //发布

//设置连接的路由器信息#define CONNECT_WIFI "Xiaomi_meizi6" //将要连接的路由器名称 --不要出现中文、空格等特殊字符#define CONNECT_PASS "12170307yu" //将要连接的路由器密码
#define CONNECT_SERVER_IP "121.36.42.100" //服务器IP地址#define CONNECT_SERVER_PORT 1883 //服务器端口号
//JTAG模式设置,用于设置JTAG的模式//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭; #define JTAG_SWD_DISABLE 0X02#define SWD_ENABLE 0X01#define JTAG_SWD_ENABLE 0X00 void JTAG_Set(u8 mode){ u32 temp; temp=mode; temp<<=25; RCC->APB2ENR|=1<<0; //开启辅助时钟 AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24] AFIO->MAPR|=temp; //设置jtag模式}

u8 motor_flag=0; //窗帘的状态 0表示关闭 1表示打开u8 led_flag=0; //房间照明灯状态 0表示关闭 1表示打开u16 MQ135_data=0; //MQ135烟雾传感器的值u8 DHT11_T=0; //环境温度u8 DHT11_H=0; //环境湿度u8 BH1750_data=0; //环境光照强度
char request_id[100];char mqtt_message[100];
//WIFI发送数据存储区域char data_buff[300];
int main(){ u8 esp8266_state=0; u8 key; u8 i; u32 time_cnt=0; u32 timer_hour_cnt=0; //记录定时的时间 JTAG_Set(JTAG_SWD_DISABLE); //释放PA15 LED_Init(); KEY_Init(); USART1_Init(115200); Moto_Init(); //风扇、加热棒初始化 USART2_Init(115200);//串口-WIFI TIMER2_Init(72,20000); //超时时间20ms DHT11_Init(); //初始化DHT11 Lcd_Init(); //LCD初始化 Lcd_Clear(0); //清屏为黑色 LCD_LED_SET;//通过IO控制背光亮 AdcInit(); //ADC初始化--检测MQ2烟雾传感器的数据 IIC_Init(); printf("正在初始化WIFI请稍等.\r\n"); for(i=0;i<5;i++) { if(ESP8266_Init()==0) { esp8266_state=1; break; } else { esp8266_state=0; printf("ESP8266硬件检测错误.\n"); } } if(esp8266_state) { printf("准备连接服务器....\r\n"); //非加密端口 printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1)); //2. MQTT协议初始化 MQTT_Init();
//3. 连接服务器 for(i=0;i<5;i++) { if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0) { esp8266_state=1; break; } esp8266_state=0; printf("服务器连接失败,正在重试...\n"); delay_ms(500); } printf("服务器连接成功.\n");
//3. 订阅主题 if(MQTT_SubscribeTopic(SET_TOPIC,0,1)) { printf("主题订阅失败.\n"); } else { printf("主题订阅成功.\n"); } } //环境温度 LCD_ShowChineseFont(0,0,16,HZ_FONT_16[0],RED,0); LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[1],RED,0); LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[2],RED,0); LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[3],RED,0); //环境湿度 LCD_ShowChineseFont(0,16*1,16,HZ_FONT_16[4],RED,0); LCD_ShowChineseFont(16*1,16*1,16,HZ_FONT_16[5],RED,0); LCD_ShowChineseFont(16*2,16*1,16,HZ_FONT_16[6],RED,0); LCD_ShowChineseFont(16*3,16*1,16,HZ_FONT_16[7],RED,0); //光照强度 LCD_ShowChineseFont(0,16*2,16,HZ_FONT_16[8],RED,0); LCD_ShowChineseFont(16,16*2,16,HZ_FONT_16[9],RED,0); LCD_ShowChineseFont(16*2,16*2,16,HZ_FONT_16[10],RED,0); LCD_ShowChineseFont(16*3,16*2,16,HZ_FONT_16[11],RED,0); //空气质量 LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[12],RED,0); LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[13],RED,0); LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[14],RED,0); LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[15],RED,0); //智能照明 LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[16],RED,0); LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[17],RED,0); LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[18],RED,0); LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[19],RED,0); //智能窗帘 LCD_ShowChineseFont(0,16*5,16,HZ_FONT_16[20],RED,0); LCD_ShowChineseFont(16,16*5,16,HZ_FONT_16[21],RED,0); LCD_ShowChineseFont(16*2,16*5,16,HZ_FONT_16[22],RED,0); LCD_ShowChineseFont(16*3,16*5,16,HZ_FONT_16[23],RED,0); while(1) { //按键可以手动控制开启窗帘和LED灯 key=KEY_Scan(); if(key)printf("key=%d\r\n",key); //控制LED灯 if(key==2) { led_flag=!led_flag; if(led_flag) { LED_OUT=1; } else { LED_OUT=0; } } //控制继电器 if(key==1) { motor_flag=!motor_flag; if(motor_flag) { MOTOR_OUT=1; } else { MOTOR_OUT=0; } } //轮询时间到达 if(time_cnt>=100) { time_cnt=0; LED1=!LED1; //读取光强度 BH1750_data=Read_BH1750_Data(); printf("环境光强度:%d\r\n",BH1750_data); //获取环境温湿度 if(DHT11_Read_Data(&DHT11_T,&DHT11_H)) { printf("温度读取失败.\r\n"); } printf("环境温度:%d\r\n环境湿度:%d\r\n",DHT11_T,DHT11_H); //获取空气质量 MQ135_data=GetAdcCHxDATA(1); printf("空气质量:%d\r\n",MQ135_data); //LCD屏实时显示温湿度、空气质量,系统工作状态等等。 //环境温度 sprintf(data_buff,"%d",DHT11_T); Gui_DrawFont_GBK16(72,16*0,RED,0,(u8*)data_buff); //环境湿度 sprintf(data_buff,"%d",DHT11_H); Gui_DrawFont_GBK16(72,16*1,RED,0,(u8*)" "); Gui_DrawFont_GBK16(72,16*1,RED,0,(u8*)data_buff); //环境光强度 sprintf(data_buff,"%d",BH1750_data); Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)" "); Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)data_buff); //空气质量 sprintf(data_buff,"%d",MQ135_data); Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)" "); Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff); //智能照明 sprintf(data_buff,"%d",led_flag); Gui_DrawFont_GBK16(72,16*4,RED,0,(u8*)" "); Gui_DrawFont_GBK16(72,16*4,RED,0,(u8*)data_buff);
//智能窗帘 sprintf(data_buff,"%d",motor_flag); Gui_DrawFont_GBK16(72,16*5,RED,0,(u8*)" "); Gui_DrawFont_GBK16(72,16*5,RED,0,(u8*)data_buff);
//上报数据 sprintf(data_buff,"{\"services\":{\"BH1750\":[{\"v\":%d}],\"DHT11_H\":[{\"v\":%d}],\"DHT11_T\":[{\"v\":%d}],\"MQ135\":[{\"v\":%d}],\"motor\":[{\"v\":%d}],\"LED\":[{\"v\":%d}]}}", BH1750_data,DHT11_H,DHT11_T,MQ135_data,motor_flag,led_flag); MQTT_PublishData(POST_TOPIC,data_buff,0); printf("更新数据.\r\n"); } // 接收WIFI返回的数据 if(USART2_RX_FLAG) { USART2_RX_BUFFER[USART2_RX_CNT]='\0'; printf("WIFI收到数据:\r\n"); //向串口打印服务器返回的数据 for(i=0;i<USART2_RX_CNT;i++) { printf("%c",USART2_RX_BUFFER[i]); } /* LED_ON 智能照明灯打开 LED_OFF 智能照明灯关闭 MOTOR_ON 智能窗帘打开 MOTOR_OFF 智能窗帘关闭 */ //如果是下发了属性 if(USART2_RX_CNT>5) { //向服务器应答 if(strstr((char*)&USART2_RX_BUFFER[5],"cmd/request/")) { char *p=NULL; p=strstr((char*)&USART2_RX_BUFFER[5],"cmd/request/"); if(p) { //解析数据 strncpy(request_id,p+12,36); } //上报给服务器的数据 sprintf(mqtt_message,"success"); //应答主题 sprintf(data_buff,"$sys/501579/dev1/cmd/response/%s",request_id); MQTT_PublishData(data_buff,mqtt_message,0); printf("发布主题:%s\r\n",data_buff); printf("发布数据:%s\r\n",mqtt_message); } //LED:0 LED:1 MOTOR:0 MOTOR:1 //开灯 if(strstr((char*)&USART2_RX_BUFFER[5],"LED:0")) { LED_OUT=0; led_flag=0; } //关灯 else if(strstr((char*)&USART2_RX_BUFFER[5],"LED:1")) { LED_OUT=1; led_flag=1; } //开窗帘 else if(strstr((char*)&USART2_RX_BUFFER[5],"MOTOR:0")) { MOTOR_OUT=0; motor_flag=0; } //关窗帘 else if(strstr((char*)&USART2_RX_BUFFER[5],"MOTOR:1")) { MOTOR_OUT=1; motor_flag=1; } } USART2_RX_CNT=0; USART2_RX_FLAG=0; } DelayMs(10); time_cnt++; timer_hour_cnt++; }}
复制代码


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

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

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

评论

发布
暂无评论
基于STM32+华为云IOT设计的云平台监控系统_6月月更_DS小龙哥_InfoQ写作社区