零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码

一.概要

ESP8266 是一款高性能的 WIFI 串口模块,实现透明传输。只要有一定的串口知识,不需要知道 WIFI 原理就可以上手,在业内应用广泛。
ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问电脑服务器实现TCP/IP协议通讯。
该系列模块支持标准的IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。用户可以使用该系列模块为现有的设备添加联网功能,也可以构建独立的网络控制器。
在这里插入图片描述

在这里插入图片描述

二.ESP8266 WIFI模块主要性能参数

1.最小的 802.11b/g/n Wi-Fi SOC 模块
2.采用低功率32位CPU,可兼作应用处理器
3.主频最高可达160MHz
4.内置 10 bit 高精度 ADC
5.支持UART/GPIO/IC/PWM/ADC/HSPI等接口
6.集成 Wi-FiMAC/ BB/RF/PA/LNA
7.支持多种休眠模式,深度睡眠电流低至20uA
8.内嵌 Lwip 协议栈
9.支持STA/AP/STA+AP 工作模式
10.支持 Smart Config/AirKiss;一键配网
11.串口速率最高可达4Mbps
12.通用 AT 指令可快速上手
13.支持 SDK 二次开发
14.支持串口本地升级和远程固件升级(FOTA)
在这里插入图片描述

模块接口说明:
在这里插入图片描述

1.TX 模块UART串口发送脚
2.GND 接地
3.EN 芯片使能端,高电平有效
4.IO2 GPIO脚
5.RST 模块复位脚
6.IO0 模式选择脚,下载模式:外部拉低;运行模式:悬空或者外部拉高
7.3V3 3.3V 供电,外部供电电源输出电流建议在500mA以上
8.RX 模块UART串口接收脚

三.ESP8266 WIFI模块芯片内部框图

ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他
系统提供无限可能。
ESP8266 拥有完整的且自成体系的Wi-Fi网络功能,既能够独立应用,也可以作为从
机搭载于其他主机MCU运行。当ESP8266独立应用时,能够直接从外接flash中启动。
内置的高速缓冲存储器有利于提高系统性能,并且优化存储系统。
另外⼀种情况是, ESP8266 只需通过 SPI/SDIO 接口或 UART 接口即可作为 Wi-Fi
适配器,应用到基于任何微控制器设计中。
ESP8266 强大的片上处理和存储能力,使其可通过GPIO口集成传感器及其他应用的
特定设备,大大地降低了前期开发的成本。

在这里插入图片描述

四.ESP8266 WIFI模块原理图

在这里插入图片描述

五.ESP8266 WIFI模块与单片机通讯方法

1.硬件连接

一般模块不需要固件下载更新,单片机通过串口跟模块通讯就能连接路由器,单片机跟模块通常连接如下:

在这里插入图片描述

2.ESP8266模块AT指令介绍

在ESP8266的开发过程中,AT指令方法是最常用的方法,无需花大量的时间去熟悉环境,开发速度快。
AT指令是一种串口通信协议,是以AT开头的一个字符串,每个指令执行成功与否都有相应的返回,都是ASCII码字符串操作,每个发送的AT指令都需要回车换行符结束。
最常见的就是AT指令就是查询模块通讯是否正常,指令如下:
单片机发送:AT+(回车换行符)
模块响应:OK

ESP8266模块的主要AT指令如下:
串口波特率115200,8位数据,1位停止位,无校验
在这里插入图片描述

ESP8266配置成客户端模式,登录电脑服务器端口主要AT指令流程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六.STM32单片机与ESP8266WIFI模块通讯实验

1.硬件准备

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

板子与ESP8266通过5根杜邦线相连
板子G----模块第2脚(GND)
板子3.3–模块第7脚(3V3)
板子A2—模块第8脚(RX)
板子A3—模块第1脚(TX)
板子C13–模块第5脚(RST)
在这里插入图片描述

2.软件工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
配置USART2
在这里插入图片描述
配置USART2中断,和PC13引脚为输出,PC13引脚控制模块复位脚
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.软件主要代码

串口数据接收相关代码

volatile uint8_t UartRxData;
uint8_t UartTxbuf[1000]={1,2,3,4,5,6,7,8,9,10};
uint8_t UartRxbuf[1024],UartIntRxbuf[1024];
uint16_t UartRxIndex=0,UartRxFlag,UartRxLen=0,UartRxTimer,UartRxOKFlag,UartIntRxLen;

//串口清除
uint8_t UartRecv_Clear(void)
{
	UartRxOKFlag=0;
	UartRxLen=0;
	UartIntRxLen=0;
	UartRxIndex=0;
	return 1;
}

//接收标志函数,返回0说明没收据接收,返回1说明有数据收到
uint8_t Uart_RecvFlag(void)
{
		if(UartRxOKFlag==0x55)
		{
			UartRxOKFlag=0;
			UartRxLen=UartIntRxLen;
			memcpy(UartRxbuf,UartIntRxbuf,UartIntRxLen);//把缓冲区的数据,放入需要解析的数组
			UartIntRxLen=0;
			TcpClosedFlag = strstr (UartRxbuf, "CLOSED\r\n" ) ? 1 : 0;
			return 1;
		}
		return 0;
}
//串口2在1字节接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	if(huart==&huart2)//判断是否串口2
	{
		UartRxFlag=0x55;//接收标志置位
		UartIntRxbuf[UartRxIndex]=UartRxData;//数据写入缓冲区
		UartRxIndex++;//记载数目加1
		if(UartRxIndex>=1024)//缓冲区是1024字节,如果存满,归零
		{
			UartRxIndex=0;
		}
		HAL_UART_Receive_IT(&huart2,(unsigned char*)&UartRxData,1);//继续接收下一字节
 }

}

//1ms调用一次,用来判断是否收完一帧
void UART_RecvDealwith(void)
{
	if(UartRxFlag==0x55)
	{
		if(UartIntRxLen<UartRxIndex)//UartIntRxLen小于UartRxIndex,说明有收到新的数据,把接收长度增加
		{
		UartIntRxLen=UartRxIndex;
		}else
		{
			UartRxTimer++;
			if(UartRxTimer>=50)//50ms,等待,没收到新数据,说明已经收完一帧
			{
				UartRxTimer=0;
				UartRxFlag=0;
				UartRxOKFlag=0x55;
				UartRxIndex=0;
			}
		}
	}
}
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
UART_RecvDealwith();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

/**
  * @brief This function handles USART2 global interrupt.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

main函数代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart2, (uint8_t *)&UartRxData, 1);//接收中断使能
	ESP8266_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		ESP8266_STA_TCPClient_Test();//测试TCP通讯
  }
  /* USER CODE END 3 */
}

ESP8266配置相关

#define User_ESP8266_SSID     "CMCC-DAX7"          //wifi名
#define User_ESP8266_PWD      "13588084246"      //wifi密码

#define User_ESP8266_TCPServer_IP     "192.168.10.11"     //服务器IP
#define User_ESP8266_TCPServer_PORT   "8888"      //服务器端口号

  char str[100]={0};
	ESP8266_AT_Test();
	printf("正在配置ESP8266\r\n");
	ESP8266_Net_Mode_Choose(STA);
	while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD));
	ESP8266_Enable_MultipleId ( DISABLE );
	while(!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0));
	while(!ESP8266_UnvarnishSend());
	printf("\r\n配置完成");
    while ( 1 )
    {       
		sprintf (str,"杭州光子物联科技有限公司" );//格式化发送字符串到TCP服务器
		ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
		HAL_Delay(200);
		Uart_RecvFlag();//接收数据
        if(TcpClosedFlag) //判断是否失去连接
        {
            ESP8266_ExitUnvarnishSend(); //退出透传模式
            do
            {
                res = ESP8266_Get_LinkStatus();     //获取连接状态
            }   
            while(!res);

            if(res == 4)                     //确认失去连接,重连
            {               
                while (!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD ) );
                while (!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, 			User_ESP8266_TCPServer_PORT, Single_ID_0 ) );        
            } 
            while(!ESP8266_UnvarnishSend());                    
        }
    }  

//对ESP8266模块发送AT指令
// cmd 待发送的指令
// ack1,ack2;期待的响应,为NULL表不需响应,两者为或逻辑关系
// time 等待响应时间
//返回1发送成功, 0失败
bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{ 
    UartRecv_Clear(); //重新接收新的数据包
    ESP8266_USART("%s\r\n", cmd);
	 if(ack1==0&&ack2==0)     //不需要接收数据
	 {
	 return true;
	 }
	HAL_Delay(time);   //延时
	HAL_Delay(1000);
	if(Uart_RecvFlag()==1)
	{
	UartRxbuf[UartRxLen]='\0';
	}
    if(ack1!=0&&ack2!=0)
    {
        return ( ( bool ) strstr ( (const char*)UartRxbuf, ack1 ) || 
                         ( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );
    }
    else if( ack1 != 0 )  //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
        return ( ( bool ) strstr ( (const char*)UartRxbuf, ack1 ) );

    else
        return ( ( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );

}

 

4.实验效果

电脑TCP服务器收到WIFI的登录信息还有单片机发出的数据

在这里插入图片描述

七.CubeMX工程源代码下载

链接:https://pan.baidu.com/s/1okCg_2S222ugDzX70WaFVw
提取码:gx8l
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

ESP8266 WIFI模块具备强大的功能,‌能够实现与网络的无缝通信。‌它特别适用于物联网领域,‌能够轻松地通过串行通信接口与STM32单片机连接,‌为智能家居、‌智能照明、‌智能车辆等多种应用场景提供解决方案。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值