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

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

时间:2024-07-26 20:57:05浏览次数:19  
标签:CODE ESP8266 WIFI STM32 源码 USER 模块 串口

文章目录

一.概要

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单片机连接,‌为智能家居、‌智能照明、‌智能车辆等多种应用场景提供解决方案。

标签:CODE,ESP8266,WIFI,STM32,源码,USER,模块,串口
From: https://blog.csdn.net/zy2232652/article/details/140705052

相关文章

  • 【一手源码展示】Java代码TikTok内嵌商城代码程序,TikTok跨境电商系统源码,TK商城源码
    这套程序已经做了很久了我这边修复二开优化也好几个版本搭建起来做起来确实费劲前后端分离的程序 二开效果页面展示:......
  • 使用git工具管理泰山派内核源码目录及抽打补丁简易流程
    目录使用git工具管理泰山派内核源码目录及抽打补丁简易流程一、使用git维护源码二、git常用的一些操作三、抽补丁四、打补丁五、补充使用git工具管理泰山派内核源码目录及抽打补丁简易流程最近,在做linux开发的过程中入手了一块泰山派RK3566的开发板,在官方提供的各......
  • VirtualBox源码编译
    由于VirtualBox项目在6.0版本后仅支持64位。因此,本次编译的版本号为5.2.44,最后一个同时支持32位和64位的版本。虽然有官方的编译指南,但是该指南并不清晰,并且并不适应所有版本。同样,本指南也并不适用于所有版本,仅在5.2.44上测试通过。PrerequisitesWIN10最好是win10虚拟机,因为......
  • 【MATLAB源码-第154期】基于matlab的OFDM系统多径信道下块状和梳妆两种导频插入方式误
    操作环境:MATLAB2022a1、算法描述OFDM(OrthogonalFrequencyDivisionMultiplexing,正交频分复用)是一种高效的无线信号传输技术,广泛应用于现代通信系统,如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分为多个正交的窄带子载波来传输数据,有效地提高了频谱利用率并降低了多径传播引起......
  • 【MATLAB源码-第159期】基于matlab的胡桃夹子优化算法(NOA)机器人栅格路径规划,输出做短
    操作环境:MATLAB2022a1、算法描述胡桃夹子优化算法(NutcrackerOptimizationAlgorithm,NOA)是一个灵感来源于胡桃夹子的故事的元启发式优化算法。这个故事中,胡桃夹子是一个能够将坚果壳轻易地破开以获取内部果仁的工具。在优化算法的语境下,这个过程被比喻为寻找问题解决方案......
  • 二叉树及其存储实现C语言(附上源码)
    1.什么是二叉树        二叉树是一种特殊的树型结构,其特点是每个结点至多只有两棵子树(即二叉树不存在度大于二的结点),并且二叉树的子树有左右之分,次序不可颠倒【有序树】。 2.二叉树的定义二叉树T:一个有穷的结点集合。    -这个集合可以为空;    -......
  • Telegram纸飞机统计机器人源码,TG群记账群发机器源码人,TG自动记账全开源版本
    Telegram纸飞机统计机器人源码,TG群记账群发机器源码人,TG自动记账全开源版本一.thinkphp6框架开发按thinkphp6部署+伪静态+php7.4数据库连接信息在config文件夹database.php文件修改后台账号:admin密码123321.(有个小数点)二.机器人部署1.去tg官方申请机器人获取到token......
  • springboot《学生手册》 线上考试系统设计与实现(源码+lw+部署文档+讲解等)
    具体实现截图技术栈后端框架SpringBoot采用springboot作为后台的框架,java框架具有简化配置和开发的效率。Spring框架目前是很多java开发者的首选框架,Spring主要有两大功能,控制反转和面向切面的编程。控制反转(IOC)可以实现代码的依赖注入,减少代码的......
  • springboot《毛泽东诗词赏析》课程网站实现(源码+lw+部署文档+讲解等)
    具体实现截图技术栈后端框架SpringBoot采用springboot作为后台的框架,java框架具有简化配置和开发的效率。Spring框架目前是很多java开发者的首选框架,Spring主要有两大功能,控制反转和面向切面的编程。控制反转(IOC)可以实现代码的依赖注入,减少代码的......
  • 【MATLAB源码】机器视觉与图像识别技术(4)---模式识别与视觉计数
    系列文章目录第一篇文章:【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载)第二篇文章:【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础第三篇文章:【MATLAB源码】机器视觉与图像识别技术(2)续—图像分割算法第四篇文章:【MATL......