首页 > 其他分享 >Stm32+MQTT+ESP-01S

Stm32+MQTT+ESP-01S

时间:2023-02-19 16:23:42浏览次数:62  
标签:Delay ESP8266 OLED Stm32 MQTT 01S ms 串口 GPIO

ESP8266+串口助手调试

ESP8266-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个字节的数据。

如图,发送成功。

ESP8266+串口助手+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,显示客户端已连接。

ESP8266向本地服务器发送数据

项目地址: [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");

}

测试结果

标签:Delay,ESP8266,OLED,Stm32,MQTT,01S,ms,串口,GPIO
From: https://www.cnblogs.com/qianxiaohan/p/17134926.html

相关文章

  • Web浏览器端通过https 使用mqtt通讯
    做的产品简介这次需要做一个web端的上课平台,有音视频通讯,有白板(画板)功能,有文字通讯等。技术点音视频通讯需要走Webrtc需要跟ios,android,windows,mac客户端互......
  • STM32 - 定时器1 - 定时器详解
    目录1.什么是定时器1.1数量&来源1.2用途2.通用定时器框图2.1输入时钟2.2时基单元2.3输入捕获/输出比较通道1)输入阶段:2)输出阶段:3.模式配置3.1计数器模式3.2输入捕......
  • stm32 gpio外部中断
    使用过外部中断可知,中断模式可以选择上升沿触发或者下降沿触发,或者双边沿触发,例如下降沿触发,引脚由高电平变到低电平,进入外部中断,只要外部中断中的逻辑判断没有while循环导......
  • stm32入门--流程
    //使用固件库点亮LEDintmain(void){//定义一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDefGPIO_InitStructure;//开启GPIO端口时钟......
  • 基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
    一、前言在STM32项目开发中,经常会用到存储芯片存储数据。比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复;在存储芯片里也会存放很多资源文件。比如......
  • win64环境下监听键盘操作并发送MQTT消息
    1.MQTT服务安装下载EMQX做MQTT代理服务器https://www.emqx.cn/downloads/broker/v4.2.7/emqx-centos7-4.2.7-x86_64.zip解压安装即可启动MQTT服务器在emqx/bin目录下......
  • 2-STM32+Air724UG基本控制篇(自建物联网平台)-整体运行测试-Android扫码绑定Air724,并
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>......
  • STM32 SPI硬件NSS
    STM32SPI硬件NSSSTM32F1的SPINSS引脚并不是通常认为的,打开硬件NSS后在发送数据的时候NSS输出低,去片选从设备,在发送完成后释放从设备,硬件NSS而是用来实现多主机模式的。......
  • STM32定时器TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数详解
    ———————————————————————————————————————————版权声明:本文为CSDN博主「qlexcel」的原创文章,遵循CC4.0BY-SA版权协议,转载请......
  • stm32f103 sdio 移植st官方例程
    第一步:建立驱动文件建立sdio_sdcard.h和sdio_sdcard.c,并将这两个文件添加到MDK工程中,如下图   第二步:移植官方例程1.找到STM32F10x_StdPeriph_Lib_V3.5.0\Pr......