最近在做毕设,其中想把STM32连接ESP8266来连接云平台。一开始是想直接编写一个使用MQTT协议上云的代码来完成的,但因为没有物联网的知识,想直接移植别人写好的又很难放进我自己的代码里,导致进度一直被卡。最近发现有使用MQTT上云的AT固件,能直接向ESP8266发送AT命令来连接云服务器,马上就实现了STM32上云。
其实也有其他作者写了相关文章,不过我自认为自己比较菜,写的代码也比较简单,移植也相对简单,下面是相关介绍。
硬件:STM32F103C8T6+ESP8266-01
开发软件:Keil5
云服务器:腾讯云(其实腾讯云和阿里云连接方式差不多)
AT固件下载:AT固件汇总 | 安信可科技
如果和我一样是用ESP8266-01的记得要烧录1471号,因为flash大小是不一样的。烧录教程挺多的,我就不讲了。

| STM32 | ESP8266 |
| PA2 | RX |
| PA3 | TX |
| VCC | 3.3V |
| EN | 3.3V |
| GND | GND |
在云平台注册,新建产品、设备,得到"client_id","username","password"三个物联网参数,就可以进行代码操作啦!
我是用串口2连接ESP8266的
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
USART_DeInit(USART2); //复位串口2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2_TX PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2_RX PA.10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ITsta; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART2, &USART_InitStructure); //初始化串口
USART_ITConfig(USART2, USART_IT_RXNE, ITsta); //开启中断
USART_Cmd(USART2, ENABLE); //使能串口
配置好STM32后,使用下面7个AT指令,就可以连接云平台了。
AT+RST
AT+RESTORE
AT+CWMODE=1
AT+CIPSNTPCFG=1,8,"ntp.tencent.com"
AT+CWJAP="WiFi名字","WiFi密码"
AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,""
AT+MQTTCLIENTID=0,"ClienId"
AT+MQTTCONN=0,"连接域名",1883,1
这里要注意的是,发送AT指令之间要延时一段时间。我看别人似乎不需要延时,但我在测试的时候确实是要加延时程序的,不知道是不是我的硬件问题。通过以下代码向ESP8266发送AT指令。
ESP8266_send("AT+RST");
DelayMs(5000);
ESP8266_send("AT+CWMODE=1"); //设置为softAP模式
DelayMs(1000);
ESP8266_send("AT+CIPSNTPCFG=1,8,ntp1.tencent.com");
DelayMs(1000);
ESP8266_send("AT+CWJAP=\"WIFI名\",\"WIFI密码\"" ); //输入WIFI名,WIFI密码
DelayMs(5000);
ESP8266_send("AT+MQTTUSERCFG=0,1,\"NULL\",\"username\",\"passward\",0,0,\"\"" ); //
DelayMs(5000);
ESP8266_send("AT+MQTTCLIENTID=0,\"clienid\"");
DelayMs(3000);
ESP8266_send("AT+MQTTCONN=0,\"产品ID.iotcloud.tencentdevices.com\",1883,1"); //服务器,端口
DelayMs(5000);
ESP8266_send("AT+MQTTSUB=0,\"$thing/down/property/产品ID/设备ID\",1"); //订阅腾讯云下发主题
DelayMs(3000);
这是我的向ESP8266发送数据代码
void ESP8266_send( char *s){
while (*s) {
Usart2_Send(*s);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
s ++;
}
Usart2_Send(0x0d);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
Usart2_Send(0x0a);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
void Usart2_Send(uint16_t ch)
{
USART2->DR = (ch & (uint16_t)0x01FF);
}
如果你连接的是腾讯云,那这里直接招模板写就行。但是,如果你要连接阿里云,在clienid填写要小心每一个,都要加转义字符即\,。
当你上述代码没有问题,在STM32烧录后,稍等片刻,云平台就会显示你的设备已经上线。

本文介绍了如何使用STM32F103C8T6配合ESP8266-01,借助MQTTAT固件实现连接腾讯云的过程。通过发送特定的AT指令,设置ESP8266的网络连接、MQTT参数,并在STM32中实现指令发送,最终实现设备上线。遇到的问题包括指令间需要添加延时,以及阿里云客户端ID需要转义字符。
3万+

被折叠的 条评论
为什么被折叠?



