Stm32+ESP-01S连接MQTT服务器
ESP-01S+串口助手调试
ESP-01S和USB转TTL的接线
ESP-01S | USB转TTL |
---|---|
TX | RX |
RX | TX |
GND | GND |
3V3(单独供电) | |
AT指令
AT //模块测试
AT+CWMODE=1 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
AT+CWLAP //列出可用wifi列表
AT+CWJAP="qianxiaohan","qq1804068646" //连接wifi
AT+CIFSR //查询ip
AT+CIPSTA? //显示网络状态,ip、网关、子网掩码
AT+CIPSTART="TCP","192.168.3.4",8080 //连接TCP服务器
AT+CIPSEND=4 //向服务器发送4个字节
ESP8266 SAT模式
参考esp8266使用手册,安信可官网下载。
参考链接:https://blog.csdn.net/weixin_46251230/article/details/126217560
使用网络助手调试
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161117208-1072120845.png)
在串口助手中输入AT+CIPSTART="TCP","192.168.3.4",8080,连接本地服务器 。
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161117584-1789945107.png)
在串口助手中输入AT+CIPSEND=4, 出现‘>’后发送4个字节的数据。
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161117970-571735535.png)
如图,发送成功。
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161118344-1359600258.png)
ESP-01S+串口助手+stm32调试
PA9:USART1_TX //串口1发送端
PA10:USART1_RX //串口1接收端
PA2:USART2_TX
PA3:USART2_RX
STLINK | stm32 | esp-01s | USB转TTL |
---|---|---|---|
PA9 | RX | ||
TX | RX | ||
GND | GND | GND | GND |
3.3V | 3.3V | 3.3V | |
SWDIO | DIO | ||
SWCLK | CLK |
esp-01s的GND不能和USB转TTL的GND接在一起
项目main.c,在keil项目中发送AT指令。stm32--->esp-01s--->CH340串口
USART1_Init(115200); //设置串口波特率
/*esp8266连接串口1发送指令,使用了printf重定向到串口*/
printf("AT+RST\r\n");
Delay_ms(5);
printf("AT+CWMODE=1\r\n");
Delay_ms(5);
printf("AT+CWJAP=\"qianxiaohan\",\"qq1804068646\""); //连接wifi
Delay_ms(5);
printf("AT+CIPSTART=\"TCP\",\"192.168.3.4\",8080"); //建立tcp连接
Delay_ms(5);
printf("AT+CIPMODE=1"); //选择透传模式,进入透传模式后tcp不会超时断开
Delay_ms(5);
将程序下载到stm32中,串口助手接收区,显示已连接wifi,且已连接本地TCP服务器
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161118744-2058153719.png)
ESP-01S的ip地址是192.168.3.2,显示客户端已连接。
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161119093-707610811.png)
ESP-01S向本地服务器发送数据
项目地址: [esp8266串口发送](F:\Keil MDK\Stm Project\esp8266串口发送)
接线:
stm32 | esp-01s |
---|---|
PA3(usart2) | TX |
PA2 | RX |
PC14 | RST |
3.3V | 3.3V |
GND | GND |
stm32 | usb转ttl |
---|---|
PA9(usart1) | RX |
PA10 | TX |
GND | GND |
stm32 | DHT11 |
---|---|
3.3V | + |
PB12 | OUT |
GND | - |
使用网络调试助手设本机为服务器,ESP8266作为从机连接服务器。
主函数:
int main(void)
{
Hardware_Init();
ESP8266_Init();
OLED_ShowChinese(2,1,0); //显示"温度"
OLED_ShowChinese(2,3,2);
OLED_ShowChinese(1,1,4); //显示"湿度"
OLED_ShowChinese(1,3,6);
while(1)
{
cnt++;
if(cnt%150==0)
DHT11_GetData(); //DHT11每1s采集数据
if(cnt==600) //发送给本地服务器
{
cnt=0;
sprintf(ts,"humidity:%d.%d\r\n",Data[0],Data[1]);
ESP8266_SendData((unsigned char*)ts, 15); //ESP8266向服务器发送数据
}
Show_th();
}
}
OLED温度湿度显示函数:
void Show_th(void)
{
//显示湿度
OLED_ShowNum(1,8,Data[0],2); //整数部分
OLED_ShowChar(1,10,'.');
OLED_ShowNum(1,11,Data[1],1); //小数部分
OLED_ShowString(1,13,"%RH"); //显示单位
//显示温度
OLED_ShowNum(2,8,Data[2],2); //整数部分
OLED_ShowChar(2,10,'.');
OLED_ShowNum(2,11,Data[3],1); //小数部分
OLED_ShowSymbol(2,13,0); //显示单位
}
ESP8266初始化函数
void ESP8266_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//ESP8266复位引脚
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initure.GPIO_Pin = GPIO_Pin_14; //GPIOC14-复位
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Initure);
GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
Delay_ms(250);
GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
Delay_ms(500);
ESP8266_Clear();
UsartPrintf(USART_DEBUG, "1. AT\r\n"); //向串口1输出信息
while(ESP8266_SendCmd("AT\r\n", "OK"))
Delay_ms(500);
UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
Delay_ms(500);
UsartPrintf(USART_DEBUG, "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
Delay_ms(500);
UsartPrintf(USART_DEBUG, "4. CWJAP\r\n"); //连接wifi
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
Delay_ms(500);
UsartPrintf(USART_DEBUG, "5. CIPSTART\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) //连接tcp服务器
Delay_ms(500);
UsartPrintf(USART_DEBUG, "6. ESP8266 Init OK\r\n");
}
网络调试助手和串口助手截图:
ESP8266向公共MQTT服务器发送消息(串口助手)
烧录固件
esp8266要先刷MQTT固件,在安信可科技官网可以下载。测试使用的是esp-01s,查对应的手册,下载1M的MQTT固件。
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161123903-1659682406.png)
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161124293-893041614.png)
用烧录器将固件烧录进esp-01s,重新烧录前,点击ERASE,擦涂之前下载的固件。
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161124669-1814123298.png)
测试
esp-01s和USB to TTL连线:
STLINK连接电脑,给stm32供电,stm32再给ESP-01S供电
ESP-01S | USB转TTL |
---|---|
TX | RX |
RX | TX |
GND | GND |
3V3(单独供电) | |
AT指令:
AT+RST //复位
AT+CWMODE=1 //设置为STA工作方式(客户端)
AT+CWJAP="qianxiaohan","qq1804068646" //连接wifi
AT+MQTTUSERCFG=0,1,"ESP32","espressif","1234567890",0,0,"" //配置用户信息
AT+MQTTCONN=0,"3.228.54.173",1883,0 //连接MQTT服务器,使用公共MQTT服务器broker-cn.emqx.io TCP端口:1883
AT+MQTTSUB=0,"lyx",1 //订阅主题和发布的主题要一样
AT+MQTTPUB=0,"lyx","{\"temperture\":23.4}",1,0 //发布主题,json格式
AT+MQTTCLEAN=0 //断开连接
测试工具MQTTX+串口助手
MQTTX参数设置:
![](https://img2023.cnblogs.com/blog/2126010/202302/2126010-20230219161125066-268700733.png)
测试结果:
ESP8266向公共MQTT服务器发送数据
项目地址:[STM32+ESP8266+MQTT](F:\Keil MDK\Stm Project\esp8266+mqtt)
接线同"ESP8266向本地服务器发送数据"
主函数:
#include "stm32f10x.h" // Device header
#include "OLED.H"
#include <stdio.h>
#include "Delay.h"
#include "usart.h"
#include "esp8266.h"
#include "DHT11.h"
#include "Timer.h"
char ts[50];
int Temperature;
int Shidu;
uint8_t Lock;
uint8_t Switch2;
extern char RECS[250];
extern char Data[5]; //DHT11数据串
uint16_t cnt;
void Show_th(void)
{
//显示湿度
OLED_ShowNum(1,8,Data[0],2); //整数部分
OLED_ShowChar(1,10,'.');
OLED_ShowNum(1,11,Data[1],1); //小数部分
OLED_ShowString(1,13,"%RH"); //显示单位
//显示温度
OLED_ShowNum(2,8,Data[2],2); //整数部分
OLED_ShowChar(2,10,'.');
OLED_ShowNum(2,11,Data[3],1); //小数部分
OLED_ShowSymbol(2,13,0); //显示单位
}
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
OLED_Init();
Usart1_Init(115200); //串口1,打印信息用
Usart2_Init(115200); //串口2,驱动ESP8266用
UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
}
int main(void)
{
Hardware_Init();
ESP8266_Init();
OLED_ShowChinese(2,1,0); //显示"温度"
OLED_ShowChinese(2,3,2);
OLED_ShowChinese(1,1,4); //显示"湿度"
OLED_ShowChinese(1,3,6);
while(1)
{
cnt++;
if(cnt%150==0)
DHT11_GetData(); //DHT11每1s采集数据
if(cnt==900) //发送给MQTT broker
{
cnt=0;
sprintf(ts,"AT+MQTTPUB=0,\"lyx\",\"{\\\"temperture\\\":%d.%d\\,\\\"humidity\\\":%d.%d}\",1,0\r\n",
Data[2],Data[3],Data[0],Data[1]);
UsartPrintf(USART_DEBUG, ts);
ESP_PUB(ts);
}
Show_th(); //OLED显示数据
}
}
主题发布:
void ESP_PUB(char *cmd)
{
while(ESP8266_SendCmd(cmd, "MQTTSUBRECV")) //判断MQTTSUBRECV是否是cmd的子串
Delay_ms(500);
}
ESP8266初始化函数
void ESP8266_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//ESP8266复位引脚
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initure.GPIO_Pin = GPIO_Pin_14; //GPIOC14-复位
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Initure);
GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
Delay_ms(250);
GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
Delay_ms(500);
ESP8266_Clear();
UsartPrintf(USART_DEBUG, "1. RST\r\n"); //向串口1输出信息
while(ESP8266_SendCmd("AT+RST\r\n", "OK")) //向esp8266发送指令
Delay_ms(500);
//esp8266设置为SAT模式(设备)
UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
Delay_ms(500);
//启动DHCP
UsartPrintf(USART_DEBUG, "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
Delay_ms(500);
//连接wifi
UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
Delay_ms(500);
//连接MQTT broker的用户信息配置
UsartPrintf(USART_DEBUG, "5. AT+MQTTUSERCFG\r\n");
while(ESP8266_SendCmd(ESP8266_MQTT_USERCFG, "OK"))
Delay_ms(500);
//连接MQTT服务器
UsartPrintf(USART_DEBUG, "6. AT+MQTTCONN\r\n");
while(ESP8266_SendCmd(ESP8266_MQTT_CONN, "MQTTCONNECTED"))
Delay_ms(500);
//订阅主题
UsartPrintf(USART_DEBUG, "7. AT+MQTTSUB\r\n");
while(ESP8266_SendCmd(ESP8266_MQTT_SUB, "OK"))
Delay_ms(500);
UsartPrintf(USART_DEBUG, "8. ESP8266 Init OK\r\n");
}