Loading

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

使用网络助手调试

在串口助手中输入AT+CIPSTART="TCP","192.168.3.4",8080,连接本地服务器 。

在串口助手中输入AT+CIPSEND=4, 出现‘>’后发送4个字节的数据。

如图,发送成功。

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服务器

ESP-01S的ip地址是192.168.3.2,显示客户端已连接。

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固件。

用烧录器将固件烧录进esp-01s,重新烧录前,点击ERASE,擦涂之前下载的固件。

测试

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参数设置:

测试结果:

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");

}

测试结果

posted @ 2023-02-19 16:17  记录学习的Lyx  阅读(1711)  评论(0编辑  收藏  举报