STM32连接阿里云(从固件烧录到代码实现)

一、前言

STM32作为一款高性能、低功耗的微控制器,广泛应用于物联网项目中。为了将STM32设备接入阿里云IoT平台,我们通常需要借助Wi-Fi模块实现网络通信。ESP-01S是一款常用的Wi-Fi模块,可以与STM32配合工作,实现与阿里云平台的连接。本教程将介绍如何连接STM32与ESP-01S,并烧录必要的固件,以完成与阿里云IoT平台的通信。

百度网盘链接

本教程的代码和库文件已经上传到百度网盘,链接如下:

链接: https://pan.baidu.com/s/1rukYXAGUM0jdLfH5_RYz7A?pwd=iy2s 提取码: iy2s

复制这段内容后打开百度网盘手机App,操作更方便哦
如果遇到什么疑问,欢迎加入单片机与物联网开发的讨论群!一起学习,互相进步。在这里插入图片描述

二、准备工作

1.STM32开发板及相应的开发环境(项目中用到的是STM32F103C8T6、Keil5 MDK)。
2.ESP-01S Wi-Fi模块。
3.杜邦线若干,用于连接STM32与ESP-01S。
4.阿里云IoT平台账号及相应的产品、设备信息。
5.ESP-01S固件烧录工具,如Flash Download Tools。

在这里插入图片描述

在这里插入图片描述

三、固件烧录和AT指令连接阿里云

具体可以参考我的上篇文章:

零基础 ESP-01S使用AT指令连接阿里云(含ESP-01S 固件烧录)

四、阿里云物联网平台配置

具体可以参考我的上一篇文章:

零基础搭建自己的阿里云物联网平台

五、硬件连接

将STM32的UART串口(通常为USART1或USART2)与ESP-01S的TX、RX引脚相连,确保交叉连接(即STM32的TX接ESP-01S的RX,STM32的RX接ESP-01S的TX)。
将ESP-01S的VCC引脚连接至STM32的3.3V电源输出,GND引脚连接至STM32的GND。
确保ESP-01S的CH_PD引脚连接至高电平(如3.3V),以使其处于工作状态。

本项目用到的是串口2,连接方式如下图所示:

ESP8266模块            STM32F103C8T6
RX      ----->          pA2 
TX      ----->          pA3
GND     ----->          GND
VCC     ----->         3.3V  

六、代码讲解

首先进行MQTT 相关连接参数的宏定义

#define post   "/sys/a1smmmV6Xz0/device_klx/thing/event/property/post"


#define post_name "powerstate"

#define MQTT_set	"AT+MQTTUSERCFG=0,1,\"NULL\",\"device_klx&a1smmmV6Xz0\",\"793f59febd0e9e504bd8ca860a3d15341403ba319c35e68fcd20d7c449c2fd09\",0,0,\"\""
#define MQTT_Client "AT+MQTTCLIENTID=0,\"a1smmmV6Xz0.device_klx|securemode=2\\,signmethod=hmacsha256\\,timestamp=1708652835434|\""
                                        
#define MQTT_Pass "AT+MQTTCONN=0,\"a1smmmV6Xz0.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1"

#define WIFI_Name "wxlzss"
#define WIFI_Pass "123456789"

ESP8266 初始化函数

void ESP8266_Init(void)
{
    esp8266_send_cmd("AT+CWMODE=1","OK",50);	//配置WiFi工作模式为Station模式:就是ESP8266模块去连接自己家的wifi,
                                                            //手机也连接自己家的wifi然后实现了手机和WiFi模块的通信,(自己家wifi相当于一个中介)
    //让Wifi模块重启的命令
    esp8266_send_cmd("AT+RST","ready",20);
    delay_ms(1000);
    //让模块连接上自己的路由
	esp8266_send_cmd("AT+CWJAP=\"wxlzss\",\"123456789\"","WIFI GOT IP",300);
    
    //AT+MQTTUSERCFG - 配置 MQTT 用户属性
    esp8266_send_cmd(MQTT_set,"OK",100);
    
    //配置 MQTT 客户端 ID
    esp8266_send_cmd(MQTT_Client,"OK",100);
    
    //连接指定 MQTT协议
    esp8266_send_cmd(MQTT_Pass,"OK",300);
}

注意:这里会出现一个bug问题,会容易出现wifi模块一直卡死的问题(第一次连接wifi没问题,后面再调试会卡死上传不了数据,这是因为wifi模块发送一次AT指令后,H好像会自动连着WIFI)

我的解决办法:第一次烧录时候
esp8266_send_cmd("AT+CWJAP=“wxlzss”,“123456789"”,“WIFI GOT IP”,300);
然后再次烧录,注释掉这句话,就不会出现卡死的问题
有更好的解决办法的话可以说一下

ESP8266 发布消息函数

/*****************************************************
*函数名称:ESP8266_Send(char *property,int Data)
*函数功能:向云端发送数据
*入口参数:char *property,int Data (属性)(数据)
*出口参数:void
*****************************************************/
void ESP8266_Send(char *property,int Data)
{
    USART2_RX_STA=0;
    u2_printf("AT+MQTTPUB=0,\"%s\",\"{\\\"params\\\":{\\\"%s\\\":%d}}\",1,0\r\n",post,property,Data);
}

应用例子:ESP8266_Send("LightLux"56);

串口2接收函数

void USART2_IRQHandler(void)
{
    
    u8 Res;
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d  0x0a结尾)
    {
        Res =USART_ReceiveData(USART2);//(USART1->DR);	//读取接收到的数据
        
        if((USART2_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART2_RX_STA&0x4000)//接收到了0x0d
            {
                if(Res!=0x0a)USART2_RX_STA=0;//接收错误,重新开始
                else USART2_RX_STA|=0x8000;	//接收完成了
            }
            else //没收到0X0D
            {	
                if(Res==0x0d)USART2_RX_STA|=0x4000;
                else
                {
                    USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
                    USART2_RX_STA++;
                    if(USART2_RX_STA>(USART2_MAX_RECV_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收
                }		 
            }
        }
}
}

ESP8266 订阅消息处理函数

/*****************************************************
*函数名称:ESP8266_Received(void)
*函数功能:云端接收数据
*入口参数:char *property,int Data (属性)(数据)
*出口参数:void
   {"id":1714985048108,"params":{"powerstate":0},"version":"1.0","method":"thing.event.property.post"}
*****************************************************/
void ESP8266_Received(char *PRO)
{
    unsigned char *ret = 0;
    char *property = 0;
    unsigned char i;
    if(PRO == NULL);
    else if(USART2_RX_STA&0x8000)			//串口2接收完一帧数据
    {
        ret = USART2_RX_BUF;
        if(ret!=0)
        {
            property = strstr((const char *)ret,(const char *)PRO);
            if(property!=NULL)
            {
                for(i=0;i<2;i++)
                {
                    Property_Data[i] = *(property+12+i);
                    printf("接收到的数据为:%c\r\n",Property_Data[i]);
                    **加粗样式**
                }
                if(Property_Data[1] == '}')Property_Data[1]=0;
                USART2_RX_STA = 0;
            }
            else
            {
                USART2_RX_STA = 0;
            }
        }
        else
        {
            USART2_RX_STA = 0;	
        }
    }
}

七、 代码烧录

烧录两次即可

在这里插入图片描述

八、运行结果

这个时候,平台设备已经在线了,设置的属性的值也会进行展示
在这里插入图片描述

在这里插入图片描述

九 、总结

通过本教程,我们全面解析了STM32连接阿里云IoT平台的实现过程,涵盖了从开发环境准备到硬件连接,再到代码编写与调试的各个环节。每一步都至关重要,确保了设备能够稳定接入并受控于云平台。本教程旨在帮助开发者顺利完成STM32与阿里云的连接与控制任务。

自此,关于阿里云的教程已经介绍了70%了,后面会介绍下微信小程序或者APP连接阿里云,通过阿里云的云产品流转来实现远程控制.以及通过4G DTU连接阿里云进行远程控制.

  1. 零基础 ESP-01S使用AT指令连接阿里云(含ESP-01S 固件烧录)

  2. ESP8266 NodeMCU连接阿里云(从环境搭建到代码实现)

  3. 零基础搭建自己的阿里云物联网平台

最后,在编写过程中,我力求内容的准确与完整,但难免存在疏漏或不足之处。欢迎各位读者提出宝贵意见,共同进步。

  • 30
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨小羽ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值