轻松学会WiFi模块(ESP8266)—基于STM32,学到就是赚到!

目录

前言

一、ESP8266介绍

二、如何实现WiFi传输?代码详解附上

三、结果实现流程与展示

四、总结

题外话:


前言

哎哎哎,发觉好久没有更新博客了,最近一直事情比较多,也没什么时间注意博客,不过接下来时间会有了,继续更新STM32F1和MSP430的文章,觉得有帮助的记得收藏点赞哦!关注博主,更多新鲜知识第一时间知道,不容错过哦!

今天这一讲注意涉及到WiFi模块ESP8266的使用,主要是用WiFi来控制LED0亮灭,包括会详细介绍一下该模块的使用,废话不多说,正题进入···

参考资料:WIFI模块ATK-ESP8266(ESP 01) — 正点原子资料下载中心 1.0.0 文档 (openedv.com)

一、ESP8266介绍

互联网+时代,无线传输、无线通信尤为重要,那么在WiFi通信方面就数ESP8266用的最为广泛了,因为ESP8266是一个具备高性能的模块,在不了解其原理的情况下,只要有一定的串口知识理解,那么就可以轻松上手该模块,进而实现手机WiFi操作。简单来说,就是利用编程来实现WiFi模块的透明传输。

一些使用参考资料可以参考正点原子官网

 这里我们看到该模块有8个接口,但是实际上我们只需要用到五个接口就可以操作这个WiFi模块了,主要是3.3V、GND、RXD、TXD、EN这五个接口可以看上图,RXD接单片机上的TXD接口(这里我用的是串口3,所以接PB10),TXD接单片机上的RXD接口(即PB11),EN接3.3V即可。

那么他有哪些指令呢?

博客上有许多关于AT指令的文章,这里推荐一篇文章给大家:

ESP8266 WIFI模块AT指令汇总_尘埃世界的博客-CSDN博客_esp8266at指令集

该博主详细地介绍了许多指令,大家可以不断尝试各种指令,在这我就不会详细介绍这些指令了,相信大家仔细阅读该博主的文章,肯定也有所收获,这里我只是作为一名小小搬运工哈哈

这里你会发现它有三种模式即STA、AP、混合,那么我们该如何使用呢,这里简单说明一下

STA模式就是类似一个接收模式,就是开启该模式后,你只能通过串口给他发送信息,ESP8266只负责接收,而不会产生一个热点,(手机或其他设备是找不到热点的)然后这模式我一般会直接用来调试各种AT指令,通过串口调试助手进行数据传输

AP模式就简单了,就是它发出去一个热点,供手机或其他设备连接,如果要实现手机连热点来控制单片机,那么该模式就要开启了。

混合模式就是两者同时实现。

接下来关于传输的方式,一般都是采用透传比较好,如果不采用透传模式,那么每发送一次数据都要发送一次AT+CIPSEND=<param>的指令就显得尤为麻烦,因此模式一般设置为透传模式,退出透传模式就给指令“+++”即可,后面代码里也有具体涉及到透传模式的退出操作,后面代码再一一介绍。

二、如何实现WiFi传输?代码详解附上

串口3初始化函数:

#include "delay.h"
#include "usart3.h"
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"	 
#include "timer.h" 

	u8 res;	
//串口接收发送缓存区		
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; 			
u8  USART3_TX_BUF[USART3_MAX_SEND_LEN]; 		



vu16 USART3_RX_STA=0;   	

//串口3中断
void USART3_IRQHandler(void)
{
      
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
	{	 
		res =USART_ReceiveData(USART3);		 
		if((USART3_RX_STA&(1<<15))==0)
		{ 
			if(USART3_RX_STA<USART3_MAX_RECV_LEN)	
			{
				TIM_SetCounter(TIM7,0);         				
				if(USART3_RX_STA==0) 				
				{
					TIM_Cmd(TIM7,ENABLE);
				}
				USART3_RX_BUF[USART3_RX_STA++]=res;	
			}else 
			{
				USART3_RX_STA|=1<<15;			
			} 
		}
	}  				 											 
}   

//串口3初始化 
void usart3_init(u32 bound)
{  

	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); 

 	USART_DeInit(USART3); 
		 //USART3_TX   PB10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
   
    //USART3_RX	  PB11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
	
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	
  
	USART_Init(USART3, &USART_InitStructure);
  

	USART_Cmd(USART3, ENABLE);              
	

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); 
	

	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_Init(&NVIC_InitStructure);	
	
	
	TIM7_Int_Init(1000-1,7200-1);		
	USART3_RX_STA=0;		
	TIM_Cmd(TIM7,DISABLE);			

}
//串口3printf函数,保证输入不大于设定长度
void u3_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART3_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART3_TX_BUF);		
	for(j=0;j<i;j++)						
	{
	  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); 
		USART_SendData(USART3,USART3_TX_BUF[j]); 
	} 
}

ESP8266初始化函数:

#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h" 
#include "delay.h"
#include "lcd.h"

//ESP8266初始化
void esp8266_start_trans(void)
{
	
	esp8266_send_cmd("AT+CWMODE=2","OK",50);//设置为AP模式

	esp8266_send_cmd("AT+RST","ready",20);//重启
	
	delay_ms(1000);       
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);
	
	esp8266_send_cmd("AT+CWSAP=\"ESP8266\",\"12345678\",1,4","OK",200);//设置WiFi名称、密码,模式
	esp8266_send_cmd("AT+CIPMUX=1","OK",20);//进入透传模式
	esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);//设置端口8080
	esp8266_send_cmd("AT+CIPSEND","OK",50);//开始发送数据
}

//退出透传模式
u8 esp8266_quit_trans(void)
{
	u8 result=1;
	u3_printf("+++");
	delay_ms(1000);					
	result=esp8266_send_cmd("AT","OK",20);
	if(result)
		printf("quit_trans failed!");
	else
		printf("quit_trans success!");
	return result;
}

//发送指令,返回0发送成功,1则失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	
	if(ack&&waittime)		
	{
		while(--waittime)	
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)
			{
				if(esp8266_check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
				
					break;
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 


//检测是否应答指令
u8* esp8266_check_cmd(u8 *str)
{
	char *strx=0;
	if(USART3_RX_STA&0X8000)		
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
	} 
	return (u8*)strx;
}


//向ESP8266发送指令(数据)的函数,暂时用不到,可以自己斟酌加上
//u8* esp8266_send_data(u8 *cmd,u16 waittime)
//{

//	char temp[5];
//	char *ack=temp;
//	USART3_RX_STA=0;
//	u3_printf("%s",cmd);	
//		LCD_ShowString(30,130,200,16,16,cmd);	
//	if(waittime)		
//	{
//		while(--waittime)	
//		{
//			delay_ms(10);
//			if(USART3_RX_STA&0X8000)
//			{
//				USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
//				ack=(char*)USART3_RX_BUF;
//				printf("ack:%s\r\n",(u8*)ack);
//			LCD_ShowString(30,190,200,16,16,(u8*)ack);	
//				USART3_RX_STA=0;
//				break;
//			} 
//		}
//	}
//	return (u8*)ack;
//} 

主函数:

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart3.h"
#include "esp8266.h"
#include "string.h"
#include "timer.h"
#include "led.h"


 int main(void)
 {	
	char a[15];	 
	delay_init();	    	 			  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			
	uart_init(115200);	 			
	usart3_init(115200);	 
	LED_Init();  
	esp8266_start_trans();		//ESP8266初始化			

 	while(1)
	{
	if(USART3_RX_STA&0x8000)
		{
    		sprintf(a,"%s",USART3_RX_BUF);

			if(strstr((const char*)a,"on")) //输入on,LED0亮
				LED0=0;
			if(strstr((const char*)a,"off")) //输入off,LED0灭
				LED0=1;	
	
			USART3_RX_STA=0;
			
			
	}
 }
}
 
 

三、结果实现流程与展示

下面如何用手机实现控制呢?

1、首先在手机端下载一个TCP,在各大浏览器搜索就有了

2、打开WiFi,搜索你设置的热点并连接

3、查看该WiFi的地址

这里可能会有一定的误差错误,可能会是192.168.4.1,好像要正确的我是去串口调试助手查了一下,跟这里又不太一样,具体原因我也不太了解,如果手机上显示的IP地址不对,那就只能利用调试助手进行一下AT指令查询,这样比较准确,就把串口更改一下就行了(记得代码串口也要更改,自己尝试上手比较有收获)。

4、打开TCP,输入地址和端口,连接上热点,然后就可以进行各种命令了

结果:

输入on

 输入off 

 

四、总结

哈哈,学到这里就会发现你已经轻松掌握了如何使用ESP8266WiFi串口模块了,那么接下来就是对所学知识的巩固与实践操作,再然后就是利用该模块进阶完成各种设计,祝大家会有所收获,同时这里附上一个优秀博主的文章,我也是从那里吸取经验的,他那里有更为详细得讲解,遇到问题直接扣扣博主,一定会有所解决的,加油

优秀文章链接:

【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)_Yngz_Miao的博客-CSDN博客_stm32wifi模块

以上就是我这一期的全部内容了,讲的可能不太好,希望大家多多包涵,也可以给博主一个赞,你的每一次点赞都是我前进方向上的动力,一起加油!

走过路过觉得可以给博主点个赞哈哈

题外话:

挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”

学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++stack_queue

stack_queue 容器适配器stack详解栈适配器栈模拟实现 队列详解队列适配器queue模拟实现 容器适配器 除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器:stack(栈),queue(队列),priority_queue(优先队列)。适配器是标准库中的一个通用概念。容器&#xff0c;迭代器和…

Blazor第三方组件库推荐:BootstrapBlazor UI

文章目录 前言资源适合人群如何开始环境配置开始新项目Server和Wasm的区别.NET CORE 不支持 7.0运行结果 使用组件发布项目配置到IIS里面 样式问题 前言 Blazor是C#全栈追求极致开发速度的一个前后端不分离的框架&#xff0c;上限是在Winform,WPF,MAUI等宿主环境上面运行的全平…

uniapp 中过滤获得数组中某个对象里id:1的数据

// 假设studentData是包含多个学生信息的数组 const studentData [{id: 1, name: 小明, age: 18},{id: 2, name: 小红, age: 20},{id: 3, name: 小刚, age: 19},{id: 4, name: 小李, age: 22}, ]; // 过滤获取id为1的学生信息 const result studentData.filter(item > ite…

MySQL操作命令详解:增删改查

文章目录 一、CRUD1.1 数据库操作1.2 表操作1.2.1 五大约束1.2.2 创建表1.2.3 修改表1.2.3 删除表1.2.4 表数据的增删改查1.2.5 去重方式 二、高级查询2.1 基础查询2.2 条件查询2.3 范围查询2.4 判空查询2.5 模糊查询2.6 分页查询2.7 查询后排序2.8 聚合查询2.9 分组查询2.10 联…

SpringBoot搭建WebSocket初始化

1.java后端的maven添加websocket依赖 <!-- websocket依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.实例化ServerEndpointExport…

合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务

互联网、AI等技术的全球普及为人们提供便捷服务的同时&#xff0c;也带来了信息安全领域的诸多挑战。保护用户隐私及数据安全&#xff0c;是科技企业规范、健康发展的重心。近期&#xff0c;上海合合信息科技股份有限公司&#xff08;简称“合合信息”&#xff09;顺利通过国际…

测试|Junit相关内容

测试|Junit相关内容 文章目录 测试|Junit相关内容0.Junit说明1.Junit注解TestDisabledBeforeAll和AfterAllBeforeEach和AfterEach 2.Junit参数化单参数多参数&#xff08;多种/多组&#xff09;CSV获取参数&#xff08;支持多种&#xff09;CSV文件获取参数&#xff08;支持多种…

tomcat限制IP访问

tomcat可以通过增加配置&#xff0c;来对来源ip进行限制&#xff0c;即只允许某些ip访问或禁止某些来源ip访问。 配置路径&#xff1a;server.xml 文件下 标签下。与同级 <Valve className"org.apache.catalina.valves.RemoteAddrValve" allow"192.168.x.x&…

单片机中的通用LED驱动

前言 项目中需要用到很多的LED灯&#xff0c;存在不同的闪烁方式&#xff0c;比如单闪&#xff0c;双闪&#xff0c;快闪&#xff0c;慢闪等等&#xff0c;我需要一个有如下特性的LED驱动 方便的增加不同闪烁模式可以切换闪烁模式增加LED数目不会有太多的改动方便移植&#x…

Jmeter教程

目录 安装与配置 一&#xff1a;下载jdk——配置jdk环境变量 二&#xff1a;下载JMeter——配置环境变量 安装与配置 一&#xff1a;下载jdk——配置jdk环境变量 1.新建环境变量变量名:JAVA_HOME变量值&#xff1a;&#xff08;即JDK的安装路径&#xff09; 2.编辑Path%J…

Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流

最近&#xff0c;Stability AI正式发布了下一代文生图模型——Stable Diffusion XL 1.0这次的1.0版本是Stability AI的旗舰版生图模型&#xff0c;也是最先进的开源生图模型。 在目前的开放式图像模型中&#xff0c;SDXL 1.0是参数数量最多的。官方表示&#xff0c;这次采用的…

指向字符串常量(字符串右值)的char指针,free的时候为什么会报错?

起因是如下代码 char *p "abc"; free(p);先说结果&#xff0c;这里会报错&#xff0c;会报一个错误如下 一开始还没反应过来&#xff0c;只知道 “test_content” 是一个右值&#xff0c;这是一个指向右值的指针。 但是free的时候为什么会报错呢&#xff1f; 首…

【无网络】win10更新后无法联网,有线无线都无法连接,且打开网络与Internet闪退

win10更新后无法联网&#xff0c;有线无线都无法连接&#xff0c;且打开网络与Internet闪退 法1 重新配置网络法2 更新驱动法3 修改注册表编辑器法4 重装系统 自从昨晚点了更新与重启后&#xff0c;今天电脑就再也不听话了&#xff0c;变着花样地连不上网。 检查路由器&#xf…

JAVA基础原理篇_1.1—— 关于JVM 、JDK以及 JRE

目录 一、关于JVM 、JDK以及 JRE 1. JVM 2. JDK 3. JRE 二、为什么说 Java 语言“编译与解释并存”&#xff1f; 2.2 将高级编程语言按照程序的执行方式分为两种&#xff1a; 2.2 Java的执行过程&#xff1a; 2.3 所以为什么Java语言“编译与解释"共存&#xff1a…

2023华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

滥⽤合法商⽤程序⽤以进⾏访问控制

背景 攻击对抗日益激烈的局势下&#xff0c;安全产品的围追堵截使得攻击者将目光逐渐转向合法工具的滥用。通过使用具有合法签名的应用程序进行访问控制可以有效提高攻击隐匿性&#xff0c;也对防守及检测提出新的挑战。本文以Vscode、AnyDesk、GotoAssist为例探索攻击者用于访…

网页版Java五子棋项目(一)websocket【服务器给用户端发信息】

网页版Java五子棋项目&#xff08;一&#xff09;websocket【服务器给用户端发信息】 一、为什么要用websocket二、websocket介绍原理解析 三、代码演示1. 创建后端api&#xff08;TestAPI&#xff09;新增知识点&#xff1a;extends TextWebSocketHandler重写各种方法 2. 建立…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)七:工作台界面实现

一、本章内容 本章实现工作台界面相关内容,包括echart框架引入,mock框架引入等,实现工作台界面框架搭建,数据加载。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集-工作台界面布局实现 五、…

基于VR技术的新型实验室教学模式——VR线上生物实验室

随着科技的发展&#xff0c;虚拟现实技术已经逐渐走进了我们的生活。在教育领域中&#xff0c;虚拟现实技术也被广泛应用于各种学科的教学中。其中&#xff0c;VR线上生物实验室是广州华锐互动开发的&#xff0c;一种基于VR技术的新型教学模式&#xff0c;它能够为学生提供更加…

vCenter Server Appliance(VCSA )7.0 部署指南

部署准备 1、下载VMware-VCSA-all-7.0.0-xxxx.iso文件&#xff0c;用虚拟光驱挂载或者解压运行&#xff0c;本地系统以win10拟光驱挂载为例&#xff0c;运行vcsa-ui-installer/win32/installer.exe。 2、选择“安装”&#xff0c;VCSA 7.0版本同时提供其他选项。 第一阶段 3、…