0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32+华为云设计的智能家居控制系统

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-27 10:46 次阅读

1. 功能介绍

现在物联网已经遍布生活每个角落,几乎哪里都能看到物联网的应用。物联网就是物物相连的互联网,可以将之前单机设备全部接入互联网,完成数据交互,远程控制。 比如: 智能电表(远程抄表),智能水表,智能天然气表,智能井盖(远程向市政机关上包污水污染程度、水深程度),智慧路灯,智慧停车场(APP上远程查看是否有空余车位)等等,都是物联网成功应用的例子。

现在各大平台都提供了物联网服务器,比如:OneNet(中国移动)、阿里云物联网、百度天工物接入、华为云物联网、机智云物联网、腾讯云物联网(支持自定义小程序,效果非常nice)等。

前面几篇文章已经分别介绍了,OneNet(中国移动)、阿里云物联网、腾讯云物联网 平台的接入案例。

OneNet(中国移动): https://xiaolong.blog.csdn.net/article/details/107385118

腾讯云物联网: https://xiaolong.blog.csdn.net/article/details/117167261

阿里云物联网: https://xiaolong.blog.csdn.net/article/details/107311897

这篇文章就介绍如何使用STM32接入华为云物联网平台,完成数据交互,设计案例是基于华为云物联网平台设计智能家居控制系统(模型),硬件采用STM32+ESP8266完成上云组合;通过云平台可以远程控制家里的各种电器开关,并且可以远程收集家里煤气、天然气、烟雾、光照度、温度湿度等信息

硬件介绍:

主控MCU: STM32F103ZET6

烟雾检测传感器: MQ2

天然气检测传感:MQ5

温度湿度检测传感器: DHT11

光照强度检测传感器: BH1750

物联网云平台: 华为云物联网平台

电器开关模拟采用板载的LED灯、继电器。

WIFI: ESP8266 这是支持串口AT指令控制的WIFI模块,联网比较方便。

与华为云物联网平台通信的协议: MQTT

说明: 当前程序里的MQTT协议代码是参考MQTT官方文档编写的,不是使用ESP8266内置的,所以程序并不依赖ESP8266专用或者指定的SDK,使用任意可以上网的网卡都可以套用,并不是一定非要使用ESP8266。

2. 登录华为云创建云端设备

2.1 创建产品

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

image-20211130093052619image-20211130093130834image-20211130093332117

在这里可以查看接入的协议的端口号和地址。

image-20211130093421386image-20211130093603183

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

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

image-20211130093745795image-20211130093959379image-20211130094029260

2.2 创建设备

image-20211130094202682image-20211130094444452
设备ID
61a580fad28ce3028832c2d8_esp8266_iot

设备密钥
1126626497
    
{
    "device_id": "61a580fad28ce3028832c2d8_esp8266_iot",
    "secret": "1126626497"
}

2.3 产品模型定义

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

image-20211130095128692image-20211130095303483image-20211130095419588image-20211130095504351

2.4 生成MQTT登录密匙

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

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

image-20211130101143554image-20211130101210816

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

image-20211130101436487

下面就得到了MQTT协议设备登录的参数

2.5 使用MQTT客户端软件登录

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

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

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

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

image-20211130101631861

在软件里参数填充正确之后,就看到设备已经连接成功了。

接下来打开设备页面,可以看到设备已经在线了。

image-20211130102000677

2.6 上报数据

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

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

image-20211130102227428

image-20211130104332330image-20211130104437937

总结的格式:

//订阅主题: 平台下发消息给设备
$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}}]}

下面采用MQTT软件上报数据:

image-20211130104628591image-20211130104709827

到此,设备数据已经上报成功,如果需要增加更多的属性,按照流程继续增加即可。

3. STM32+ESP8266上报数据到华为云

3.1 硬件设备效果图

image-20211130135133532image-20211130105710464

3.2 BH1750.c 光照度传感器

#include "bh1750.h"
float Read_BH1750_Data()
{
    unsigned char t0;
    unsigned char t1;
    float t;
    u8 r_s=0;
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:1\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
     if(r_s)printf("error:2\r\n");
    IIC_Stop(); //停止信号 
    
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:3\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:4\r\n");
    IIC_Stop(); //停止信号 
    
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:5\r\n");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:6\r\n");
    IIC_Stop(); //停止信号 
    
    DelayMs(300); //等待
    
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:7\r\n");
    
    t0=IIC_ReadOneByteData(); //接收数据
    IIC_SendACK(0); //发送应答信号
    t1=IIC_ReadOneByteData(); //接收数据
    IIC_SendACK(1); //发送非应答信号
    IIC_Stop(); //停止信号
    
     t=(((t0<<8)|t1)/1.2);
     return t;  
}

3.3 ESP8266.c WIFI代码

#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函数功能: ESP8266命令发送函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_SendCmd(char *cmd)
{
    u8 i,j;
    for(i=0;i<10;i++) //检测的次数--发送指令的次数
    {
        USARTx_StringSend(USART3,cmd);
        for(j=0;j<100;j++) //等待的时间
        {
            delay_ms(50);
            if(USART3_RX_FLAG)
            {
                USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                USART3_RX_FLAG=0;
                USART3_RX_CNT=0;
                if(strstr((char*)USART3_RX_BUFFER,"OK"))
                {
                    return 0;
                }
            }
        }
    }
    return 1;
}

/*
函数功能: ESP8266硬件初始化检测函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_Init(void)
{
    //退出透传模式
    USARTx_StringSend(USART3,"+++");
    delay_ms(50);
    return ESP8266_SendCmd("AT\r\n");
}


/*
函数功能: TCP服务器模式下的发送函数
发送指令: 
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
    u8 i,j,n;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    for(i=0;i<10;i++)
    {
        sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\r\n",id,len);
        USARTx_StringSend(USART3,ESP8266_SendCMD);
        for(j=0;j<10;j++)
        {
            delay_ms(50);
            if(USART3_RX_FLAG)
            {
                USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                USART3_RX_FLAG=0;
                USART3_RX_CNT=0;
                if(strstr((char*)USART3_RX_BUFFER,">"))
                {
                    //继续发送数据
                    USARTx_DataSend(USART3,data,len);
                    //等待数据发送成功
                    for(n=0;n<200;n++)
                    {
                        delay_ms(50);
                        if(USART3_RX_FLAG)
                        {
                            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                            USART3_RX_FLAG=0;
                            USART3_RX_CNT=0;
                            if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
                            {
                                return 0;
                            }
                         }            
                    }   
                }
            }
        }
    }
    return 1;
}

/*
函数功能: 配置WIFI为STA模式+TCP客户端模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
char *p     将要连接的服务器IP地址
u16 port    将要连接的服务器端口号
u8 flag     1表示开启透传模式 0表示关闭透传模式
函数返回值:0表示成功  其他值表示对应的错误
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    //退出透传模式
    //USARTx_StringSend(USART3,"+++");
    //delay_ms(50);
    /*1. 测试硬件*/
    if(ESP8266_SendCmd("AT\r\n"))return 1;
    /*2. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 2;
    /*3. 设置WIFI模式*/
    if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
    /*4. 复位*/
    ESP8266_SendCmd("AT+RST\r\n");
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    /*5. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 5;
    /*6. 配置将要连接的WIFI热点信息*/
    sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
    /*7. 设置单连接*/
    if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;
    /*8. 配置要连接的TCP服务器信息*/
    sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
    /*9. 开启透传模式*/
    if(flag)
    {
       if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 9; //开启
       if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 10;  //开始透传
       if(!(strstr((char*)USART3_RX_BUFFER,">")))
       {
            return 11;
       }
        //如果想要退出发送:  "+++"
    }
    
     //打印总体信息
    USART1_Printf("WIFI模式:STA+TCP客户端\n");
    USART1_Printf("Connect_WIFI热点名称:%s\n",ssid);
    USART1_Printf("Connect_WIFI热点密码:%s\n",pass);
    USART1_Printf("TCP服务器端口号:%d\n",port);
    USART1_Printf("TCP服务器IP地址:%s\n",ip);
    return 0;
}


/*
函数功能: TCP客户端模式下的发送函数
发送指令: 
*/
u8 ESP8266_ClientSendData(u8 *data,u16 len)
{
    u8 i,j,n;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    for(i=0;i<10;i++)
    {
        sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d\r\n",len);
        USARTx_StringSend(USART3,ESP8266_SendCMD);
        for(j=0;j<10;j++)
        {
            delay_ms(50);
            if(USART3_RX_FLAG)
            {
                USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                USART3_RX_FLAG=0;
                USART3_RX_CNT=0;
                if(strstr((char*)USART3_RX_BUFFER,">"))
                {
                    //继续发送数据
                    USARTx_DataSend(USART3,data,len);
                    //等待数据发送成功
                    for(n=0;n<200;n++)
                    {
                        delay_ms(50);
                        if(USART3_RX_FLAG)
                        {
                            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                            USART3_RX_FLAG=0;
                            USART3_RX_CNT=0;
                            if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
                            {
                                return 0;
                            }
                         }            
                    }   
                }
            }
        }
    }
    return 1;
}

3.4 main.c 主函数

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include 
#include "timer.h"
#include "esp8266.h"
#include "mqtt.h"
#include "oled.h"
#include "fontdata.h"
#include "bh1750.h"
#include "iic.h"
#include "sht3x.h"


#define ESP8266_WIFI_AP_SSID  "CMCC-Cqvn"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define ESP8266_AP_PASSWORD "99pu58cb"     //将要连接的路由器密码


//华为云服务器的设备信息
#define MQTT_ClientID "61a580fad28ce3028832c2d8_esp8266_iot_0_0_2021113002"
#define MQTT_UserName "61a580fad28ce3028832c2d8_esp8266_iot"
#define MQTT_PassWord "74af3bf3024cf9c41b13d6c63fc86e25012b54141ecfcdff3516f08665140e6f"

//订阅与发布的主题
#define SET_TOPIC  "$oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/messages/down"  //订阅
#define POST_TOPIC "$oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/properties/report"  //发布


char mqtt_message[200];//上报数据缓存区
char OLED_ShowBuff[100];
u8 ESP8266_Stat=0;


/*
函数功能: 温湿度\光强度显示
*/
void ShowTemperatureAndHumidity(float temp,float humi,float light)
{
    sprintf(OLED_ShowBuff,"T: %.2f",temp);
	OLED_ShowString(40,16*0,16,OLED_ShowBuff); 
    sprintf(OLED_ShowBuff,"H: %.2f%%",humi);
	OLED_ShowString(40,16*1,16,OLED_ShowBuff);
    sprintf(OLED_ShowBuff,"L: %.2f%%",light);
	OLED_ShowString(40,16*2,16,OLED_ShowBuff); 
}

/*
函数功能: ESP8266显示页面
*/
void ESP8266_ShowPageTable(void)
{
    if(ESP8266_Stat)OLED_ShowString(0,16*0,16,"WIFI STAT:ERROR");
    else OLED_ShowString(0,16*0,16,"WIFI STAT:OK");

    //显示字符串
    sprintf((char*)OLED_ShowBuff,"%s",ESP8266_WIFI_AP_SSID);
    OLED_ShowString(0,16*1,16,OLED_ShowBuff);	
    
    sprintf((char*)OLED_ShowBuff,"%s",ESP8266_AP_PASSWORD);   
    OLED_ShowString(0,16*2,16,OLED_ShowBuff);    
}


int main()
{
   u32 time_cnt=0;
   u32 i;
   u8 key;
   u8 page=0;
   float temp=0;
   float humi=0;
   float light=0;
   u8 motor_state=0;
   float Humidity;
   float Temperature;
    
   delay_ms(1000);
   delay_ms(1000);
    
   LED_Init();
   KEY_Init();
   IIC_Init();
    
    //OLED初始化
   OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示;
     //清屏
   OLED_Clear(0);
    
   USART1_Init(115200);
   TIMER1_Init(72,20000); //超时时间20ms

   USART3_Init(115200);//串口-WIFI
   TIMER3_Init(72,20000); //超时时间20ms
    
   Init_SHT30();
    
   USART1_Printf("正在初始化WIFI请稍等.\n");
   
   if(ESP8266_Init())
   {
      ESP8266_Stat=1;
      USART1_Printf("ESP8266硬件检测错误.\n");  
   }
   else
   {
      //非加密端口
      USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,"121.36.42.100",1883,1));
   }
   
    //2. MQTT协议初始化	
    MQTT_Init(); 
   
    //3. 连接华为云IOT服务器        
    while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
    {
        USART1_Printf("服务器连接失败,正在重试...\n");
        delay_ms(500);
    }
    USART1_Printf("服务器连接成功.\n");
    
    
    //3. 订阅主题
    if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
    {
        USART1_Printf("主题订阅失败.\n");
    }
    else
    {
        USART1_Printf("主题订阅成功.\n");
    }        
        
    while(1)
    {    
        //按键可以测试
        key=KEY_Scan(0);
        if(key==1)
        {
            //清屏
            OLED_Clear(0);
            
            //翻页
            if(page>=1)
            {
                page=0;
            }
            else
            {
                 page++;
            }         
        
            LED1=!LED1;  //LEd状态灯
        }
        else if(key==2)
        {
            LED1=!LED1;  //LEd状态灯
            time_cnt=0;
            //电机状态改变
            MOTOR_DEV=!MOTOR_DEV;
            //电机状态
            motor_state=MOTOR_DEV;
            //补光灯
            LIGHT_DEV=!LIGHT_DEV;      
        }  
        
        //接收WIFI返回的数据
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
            
            //向串口打印返回的数据
            for(i=0;i;i++)>

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制系统
    +关注

    关注

    41

    文章

    6542

    浏览量

    110465
  • 物联网
    +关注

    关注

    2903

    文章

    44257

    浏览量

    371132
  • STM32
    +关注

    关注

    2266

    文章

    10870

    浏览量

    354747
  • 智能家居
    +关注

    关注

    1926

    文章

    9510

    浏览量

    184245
  • 华为云
    +关注

    关注

    3

    文章

    2423

    浏览量

    17301
收藏 人收藏

    评论

    相关推荐

    基于STM32设计的智能家居控制系统华为IOT)

    设计了一款基于华为物联网平台的智能家居控制系统,硬件采用了STM32和ESP8266的组合,实现了设备的上
    的头像 发表于 07-11 13:58 3370次阅读
    基于<b class='flag-5'>STM32</b>设计的<b class='flag-5'>智能家居</b><b class='flag-5'>控制系统</b>(<b class='flag-5'>华为</b><b class='flag-5'>云</b>IOT)

    智能家居控制系统模型

    智能家居控制系统模型 智能家居控制系统(smarthome controlsystems,简称SCS),是以住宅为平台,家居电器及
    发表于 10-28 21:21

    【Aworks申请】智能家居控制系统

    管理系统,提升家居智能、安全、便利、舒适,并实现环保控制系统平台。智能家居控制系统
    发表于 07-06 15:48

    智易申请】基于STM32智能家居远程控制系统研究

    申请理由:理由:通过STM32开发板开发出一套远程控制智能家居系统,使用户能够随时随地控制家中的空调、热水器等
    发表于 07-24 17:18

    智易申请】智能家居控制系统

    申请理由:自己学习研究智能家居系统,由于我是是学生没有那么多钱买开发版!而且学校制PCB板的条件有限,到现在缺一个主机控制板,所以申请这款开发版项目描述:我在学校实验室做过智能家居外围
    发表于 07-31 07:52

    【MiCOKit申请】智能家居的远程控制系统

    的FogCloud 完成设备和手机APP 之间的交互,扩展板提供了物联网常用的各种传感器,方便实现物联网应用的各种功能。鉴于此,提出了基于MiCoKit的智能家居的远程控制系统的申请。项目描述: 该项
    发表于 08-22 17:28

    【Tisan物联网申请】基于Tisan的智能家居远程控制系统

    这次体验定会收获颇丰。故提出了基于Tisan的智能家居远程控制系统的申请。项目描述: 该项目主要分为3大部分:智能家居系统的数据采集,智能家居
    发表于 10-15 10:09

    【IntoRobot Atom申请】基于IntoRobot Atom的智能家居控制系统的研究应用

    地方便了使用者的“二次开发”,故提出了基于IntoRobot Atom的智能家居远程控制系统的申请。项目描述:1 切身体验IntoRobot Atom开发套件硬件资源,软件资源和开发环境;2 结合本人现有
    发表于 12-29 16:19

    智能家居控制系统如何走进生活?

    、娱乐和阅读,这样的生活离我们已经越来越近了……  智能家居控制系统如何走进生活?事实上,随着物联网技术的积累,计算、大数据以及人工智能技术的进步,以及传统家电厂商、通信厂商以及互联
    发表于 05-02 11:47

    论文-基于stm32智能家居远程控制系统

    用户提供高效、舒适、节能的居住和工作环境的智能家居系统是非常有前景的。本课题在分析智能家居的研究现状、发展趋势、研究意义的基础上提出了基于STM32
    发表于 03-19 13:34

    【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件试用 】智能家居检测控制系统

    项目名称:智能家居检测控制系统试用计划:申请理由:主要是想使用国产OS Harmony并提出试用建议,然后是基于对智能家居的热爱,想实现一个智能家居相关的集环境监控,
    发表于 10-29 14:22

    ZigBee与Android的智能家居控制系统设计

    ZigBee与Android的智能家居控制系统设计智能家居是在传统住宅的基础上,利用现代科学技术,诸如网络通信、安全防范、自动控制、音视频等技术将
    发表于 08-06 09:02

    如何用STM32嵌入式实现智能家居控制系统

    如何用STM32嵌入式实现智能家居控制系统呢?智能家居控制系统有哪些功能呢?
    发表于 10-19 09:40

    一种基于STM32智能家居控制系统

    一种基于STM32智能家居控制系统,实现对家居智能控制
    发表于 06-14 17:25 38次下载

    智能家居控制系统设计方案

    这是基于STM32设计的智能家居控制系统,采用ESP8266连接OneNet平台。
    的头像 发表于 02-28 14:05 7082次阅读
    <b class='flag-5'>智能家居</b><b class='flag-5'>控制系统</b>设计方案