STM32F407单片机编程入门(十一) ESP8266 WIFI模块实战含源码

文章目录

    • 一.概要
    • 二.ESP8266 WIFI模块主要性能参数
    • 三.ESP8266 WIFI模块芯片内部框图
    • 四.ESP8266 WIFI模块原理图
    • 五.ESP8266 WIFI模块与单片机通讯方法
      • 1.硬件连接
      • 2.ESP8266模块AT指令介绍
    • 六.STM32单片机与ESP8266WIFI模块通讯实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 七.CubeMX工程源代码下载
    • 八.小结

一.概要

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接STM32F407VET6开发板,STLINK接电脑USB口,WIFI模块如下图插在板子上。

主要信号:
板子PC13<—>WIFI模块RST脚
板子PC6<------>WIFI模块RX
板子PC7<------>WIFI模块TX
板子3.3V<----->WIFI模块3V3
板子GND<---->WIFI模块GND

在这里插入图片描述

2.软件工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振
在这里插入图片描述

配置PC6,PC7配置成串口6收发脚,波特率115200,8位数据,无校验,1位停止位。

在这里插入图片描述

串口6中断使能
在这里插入图片描述
PC13配置成输出,用于控制模块的复位脚,低电平模块会复位
在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

3.软件主要代码

串口数据接收相关代码


void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 */
UART_RecvDealwith();/* USER CODE END SysTick_IRQn 1 */
}volatile uint8_t UartRxData;
uint8_t UartTxbuf[500]={1,2,3,4,5,6,7,8,9,10};
uint8_t UartRxbuf[500],UartIntRxbuf[500],UartRxIndex=0,UartRxFlag,UartRxLen=0,UartRxTimer,UartRxOKFlag,UartIntRxLen;//接收标志函数,返回0说明没收据接收,返回1说明有数据收到
uint8_t Uart_RecvFlag(void)
{if(UartRxOKFlag==0x55){UartRxOKFlag=0;UartRxLen=UartIntRxLen;memcpy(UartRxbuf,UartIntRxbuf,UartIntRxLen);//把缓冲区的数据,放入需要解析的数组UartIntRxLen=0;return 1;}return 0;
}
//串口2在1字节接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart==&huart6)//判断是否串口2{UartRxFlag=0x55;//接收标志置位UartIntRxbuf[UartRxIndex]=UartRxData;//数据写入缓冲区UartRxIndex++;//记载数目加1if(UartRxIndex>=500)//缓冲区是500字节,如果存满,归零{UartRxIndex=0;}HAL_UART_Receive_IT(&huart6,(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;}}}
}

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_USART6_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart6,(unsigned char*)&UartRxData,1);//串口6接收中断使能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);//选择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));//连接服务器IP地址跟端口号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 ) );elsereturn ( ( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );}

4.实验效果

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

在这里插入图片描述

七.CubeMX工程源代码下载

通过网盘分享的文件:12.ESP8266 WIFI通信实验.zip
链接: https://pan.baidu.com/s/1YYRLFHz6ZAX-v5-7MVE2gQ 提取码: ag6y

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541449.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

变电站绝缘套管红外检测数据集

包含以下4个数据文件&#xff1a; /train&#xff1a;训练集 /valid&#xff1a;验证集 /test&#xff1a;测试集 README.txt&#xff1a;数据说明 【数据说明】检测目标以Pascal VOC格式进行标注&#xff0c;对每个图像进行以下预处理&#xff0c;统一调整大小为640x640。数据…

死机检测电路

目录&#xff1a; 1、死机检测概述 2、活机状态 3、死机状态 1、死机检测概述 本内容分享一个“死机检测电路”&#xff0c;用作单片机&#xff08;MCU&#xff09;死机时&#xff0c;不至于持续给负载供电。‌持续负载供电&#xff0c;比如加热丝&#xff0c;可能会引发严…

在腾讯云申请https(我得是腾讯云服务器),通过宝塔设置https

参考 一键 HTTPS&#xff1a;https://cloud.tencent.com/document/product/400/58062 DNS 验证&#xff1a;https://cloud.tencent.com/document/product/400/54500?from_cn_redirect1 申请免费的证书 访问连接&#xff1a;https://console.cloud.tencent.com/ssl 点击页…

hive分区详细教程

为什么要分区&#xff1f; 为了提高sql的查询效率 比如&#xff1a; select * from orders where create_date20230826; 假如数据量比较大&#xff0c;这个sql就是全表扫描&#xff0c;速度肯定慢。 可以将数据按照天进行分区&#xff0c;一个分区就是一个文件夹&#xff0c;当…

软件设计师——操作系统

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;软考——软件设计师&#x1f3c5;往期回顾&#x1f3c6;&#xff1a;C: 类和对象&#xff08;上&#xff09;&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱 一、操作系统…

伊犁云计算22-1 linux 逻辑卷管理

&#xff11;  三块硬盘  &#xff53;&#xff41;&#xff54;&#xff41;  先做组&#xff0c;再做逻辑 第一步添加三块硬盘&#xff0c;然后分区&#xff0c;装文件系统 这个过程参考之前的文章不说 新增了三块 &#xff53;&#xff44;&#xff42; &#xff…

vue3 快速入门系列 —— 基础

基础 前面我们已经用 vue2 和 react 做过开发了。 AIAutoPrediction 从 vue2 升级到 vue3 成本较大&#xff0c;特别是较大的项目。所以许多公司对旧项目继续使用vue2&#xff0c;新项目则使用 vue3。 有些UI框架&#xff0c;比如ant design vue1.x 使用的 vue2。但现在 an…

老年人养生之道:岁月静好,健康常伴

老年人养生之道&#xff1a;岁月静好&#xff0c;健康常伴 随着年岁的增长&#xff0c;老年人更需注重养生&#xff0c;以维持身心的和谐与健康&#xff0c;享受幸福晚年。养生不仅是一种生活态度&#xff0c;更是一种智慧的选择&#xff0c;它涵盖了饮食、运动、心理、社交等…

基于MPA-BP-Adaboost的多输入回归预测|海洋捕食者优化-BP神经网络

目录 一、主要内容&#xff1a; 二、运行效果&#xff1a; 三、Adaboost步骤&#xff1a; 四、MPA-BP的优化步骤&#xff1a; 五、本文完整代码数据下载&#xff1a; 一、主要内容&#xff1a; 本代码结合了海洋捕食者优化&#xff08;MPA&#xff09;算法与BP神经网络和A…

【医疗大数据】基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析

基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析 1、引言 1-1 医疗大数据的特点 10 V模型&#xff1a;在医疗领域&#xff0c;大数据的特点被描述为10 V&#xff0c;包括价值&#xff08;Value&#xff09;、体量&#xff08;Volume&#xff09;、速度&#xf…

抖音矩阵系统源码搭建,矩阵系统贴牌,矩阵工具开源

1. 抖音短视频矩阵系统 抖音短视频矩阵系统&#xff0c;是指通过抖音平台&#xff0c;以矩阵的形式进行短视频创作、发布和传播的一种模式。它以多样化的内容、丰富的表现形式、高度的专业化和协同性&#xff0c;吸引了大量用户和创作者的关注。 2. 短视频矩阵系统的优势 2.1 …

BLE 设备丢包理解

前言 个人邮箱&#xff1a;zhangyixu02gmail.com在学习 BLE 过程中&#xff0c;总能听到 “丢包” 一词&#xff0c;但是我查阅资料又发现&#xff0c;有大佬说&#xff0c;ATT所有命令都是“必达”的&#xff0c;不存在所谓的“丢包”。而且我发现&#xff0c;在宣传 BLE 产品…

力扣中等 153.寻找旋转排序数组中的最小值

文章目录 题目介绍题解 题目介绍 题解 正解&#xff1a;可以和数组最后一个数比较&#xff0c;来判定二分的位置是在最小值的左侧还是在最小值的右侧。 在0到n-2二分&#xff0c;如果nums[mid] > nums[n - 1]&#xff0c;则mid在最小值的左侧&#xff0c;mid和其左侧染成红…

[每周一更]-(第115期):不同系统安装godoc

文章目录 主要功能 安装WindowsmacOSLinux环境变量配置WindowsmacOS 和 Linux 如何使用 godoc 生成自己项目的文档1. 安装 godoc2. 编写注释3. 启动 godoc 服务器4. 访问文档 生成静态文档示例输出总结 godoc 是一个 Go 语言的工具&#xff0c;用于生成和查看 Go 代码的文档。它…

SAP HCM 每月生成年假解决方案(PT_QTA00)

每月生成年假定额&#xff1a;HCM复杂的模块&#xff0c;年假生成就是一个比较复杂的模块&#xff0c;每次做项目都比较怕做年假、余假生成的业务&#xff0c;因为企业业务复制&#xff0c;SAP的这块配置也很复杂&#xff0c;因为这里面涉及的知识面很多&#xff0c;工龄计算、…

数据采集与预处理,前后端结合案例(有代码),Python连接MySQL,对MySQL的增删改查

Python对MySQL的增删改查 通过Python连接MySQL """连接MySQL数据库&#xff0c;并进行增删改查&#xff0c;同时查询了MySQL版本号&#xff0c;并做了动态注册的账号&#xff0c;实现过程&#xff1a;先向userinfo当中添加account、password新字段&#xff0c…

mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题

项目场景 我在使用Mariadb数据库更新数据的时候&#xff0c;由于数据库的表格中含有中文&#xff0c;在使用mysqldump导出sql语句的时候&#xff0c;中文显示乱码&#xff0c;如下图所示&#xff1a; 环境描述 系统&#xff1a;windows10数据库&#xff1a; Mariadb -10.6.16…

空间解析几何2:空间中两线段/直线的距离【附MATLAB代码】

目录 理论公式 MATLAB代码 理论公式 MATLAB代码 公式实现 function [dis,P,Q,t1,s1]line2LineDistance(A1,B1,C1,D1) %求两线段的最短距离 % input % A1,B1为线段一的两端点 C1,D1为线段二的两端点 % output % dis,为两线段的最短距离&#xff0c;P,Q为距离最短时在两线段上…

综述论文“Towards Personalized Federated Learning”分享

综述论文“Towards Personalized Federated Learning”分享 文章目录 综述论文“Towards Personalized Federated Learning”分享I. 引言A. 联邦学习的分类B. 个性化联邦学习的动机C. 贡献 II. 个性化联邦学习的策略策略I&#xff1a;全局模型个性化策略II&#xff1a;学习个性…

简单多状态dp第一弹 leetcode -面试题17.16.按摩师 -213.打家劫舍II

a​​​​​​​面试题 17.16. 按摩师 按摩师 题目: 分析: 使用动态规划解决 状态表示: dp[i] 表示&#xff1a;选择到 i 位置时&#xff0c;此时的最长预约时长。 但是我们这个题在 i 位置的时候&#xff0c;会面临 选择 或者 不选择 两种抉择&#xff0c;所依赖的状态需要…