轻松学会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   PB10GPIO_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	  PB11GPIO_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);//设置端口8080esp8266_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!");elseprintf("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之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…

java excel导出 本地运行数据正常 docker或者服务器导出数据为空 已解决

加上这个 response.addHeader("Content-Type","application/octet-stream;charsetutf-8"); 如图

认识这对搭档,解决 90% 的查询问题

在excel里&#xff0c;对于“查找”的实现&#xff0c;vlookup绝对是使用得最为频繁的一个函数。 但是&#xff0c;遇到下面问题&#xff0c;vlookup就没用了。 下面的表格记录了员工的信息&#xff0c;现在想通过“姓名”查找对应的“工号”。如图所示&#xff0c;通过输入不同…

opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()

人脸识别是指程序对输入的人脸图像进行判断&#xff0c;并识别出其对应的人的过程。人脸识别程 序像我们人类一样&#xff0c;“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然&#xff0c;要实现人脸识别&#xff0c;首先要判断当前图像内是否出现了人脸&…

Databend 开源周报第 107 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解连接参数 …

Linux知识点 -- Linux多线程(二)

Linux知识点 – Linux多线程&#xff08;二&#xff09; 文章目录 Linux知识点 -- Linux多线程&#xff08;二&#xff09;一、线程互斥1.背景概念2.多线程访问同一个全局变量3.加锁保护4.问题5.锁的实现 二、线程安全1.可重入与线程安全2.常见情况3.可重入与线程安全的联系 三…

excel文本函数篇2

本期主要介绍LEN、FIND、SEARCH以及后面加B的情况&#xff1a; &#xff08;1&#xff09;后缀没有B&#xff1a;一个字节代表一个中文字符 &#xff08;2&#xff09;后缀有B&#xff1a;两个字节代表一个中文字符 1、LEN(text)&#xff1a;返回文本字符串中的字符个数 2、…

七夕给TA满分宠爱!浪漫攻略为约会加分

浪漫的七夕将至&#xff0c;无论是异地恋人还是约会情侣&#xff0c;怎么能缺少节日仪式感~精心策划的约会计划&#xff0c;让浪漫“超级加倍”。 美好的二人世界&#xff0c;共度甜蜜时光&#xff0c;当然需要提前做好攻略&#xff0c;风和日丽的好天气能为约会加分不少。在规…

Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

文章目录 一、企业镜像源1、阿里云2、网易1633、搜狐镜像4、华为 二&#xff1a;高校镜像源1、清华源2、北京大学3、中国科学技术大学源 &#xff08;USTC&#xff09;4、 上海交通大学5、山东大学6、 吉林大学开源镜像站7、 哈尔滨工业大学开源镜像站8、 西安交通大学软件镜像…

java网络编程

目录 1. 什么是网络编程? 2. 网络编程三要素 2.1 IP 2.1.1 常见CMD命令 2.1.2 InetAddress 2.2 端口号 2.3 协议 3. UDP通信程序 3.1 UDP的三种通信方式 4. TCP通信程序 4.1 三次握手四次挥手 1. 什么是网络编程? 在网络通信协议下&#xff0c;不同计算机上运行的程…

如何在前端实现WebSocket发送和接收TCP消息(多线程模式)

目录 第一步&#xff1a;创建WebSocket连接第二步&#xff1a;监听WebSocket事件第三步&#xff1a;发送消息第四步&#xff1a;后端处理函数说明 当在前端实现WebSocket发送和接收TCP消息时&#xff0c;可以使用以下步骤来实现多线程模式。本文将详细介绍如何在前端实现WebSoc…

抖音短视频SEO矩阵系统源码开发

一、概述 抖音短视频SEO矩阵系统源码是一项综合技术&#xff0c;旨在帮助用户在抖音平台上创建并优化短视频内容。本文将详细介绍该系统的技术架构、核心代码、实现过程以及优化建议&#xff0c;以便读者更好地理解并应用这项技术。 二、技术架构 抖音短视频SEO矩阵系统采用前…

情人节特别定制:多种语言编写动态爱心网页(附完整代码)

写在前面案例1&#xff1a;HTML Three.js库案例2&#xff1a;HTML CSS JavaScript案例3&#xff1a;Python环境 Flask框架结语 写在前面 随着七夕节的临近&#xff0c;许多人都在寻找独特而令人难忘的方式来表达爱意。在这个数字时代&#xff0c;结合创意和技术&#xff0…

多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测&#xff0c;WOA-CNN-GR…

【JavaEE基础学习打卡04】JDBC之MySQL数据库安装

目录 前言一、JDBC与数据库二、MySQL数据库1.MySQL数据库2.MySQL服务下载安装3.MySQL服务启动停止4.MySQL命令 三、MySQL客户端安装总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天赋并不高&#xff0c;可贵在努力&#xff0c;坚持…

EmbedPress Pro 在WordPress网站中嵌入任何内容

EmbedPress Pro可让您通过高级自定义、自定义品牌、延迟加载和更多惊人功能嵌入源。为古腾堡块和Elementor编辑器提供支持的一体化 WordPress 嵌入解决方案。使用 EmbedPress 在古腾堡创建交互式内容。使用 EmbedPress 的古腾堡块立即将任何内容嵌入到您的网站。 网址: EmbedP…

CentOS下载ISO镜像的方法

目录 一、CentOS 介绍 二、进入CentOS 官方网站 三、步骤 一、CentOS 介绍 CentOS&#xff0c;中文意思是社区企业操作系统是Linux发行版之一&#xff0c;是免费的、开源的、可以重新分发的开源操作系统。 CentOS Linux发行版是一个稳定的&#xff0c;可预测的&#xff0…

API自动化管理: 从繁琐到轻松

在数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;在软件开发中扮演着至关重要的角色。然而&#xff0c;API管理可能会变得十分繁琐&#xff0c;耗费大量时间和资源。那么&#xff0c;如何实现API自动化管理&#xff0c;从而节省时间、提高效率&#xff0c…

海外ios应用商店优化排名因素之应用名称

当我们的应用出现在搜索结果中时&#xff0c;用户会更详细地查看并转到我们的应用程序页面&#xff0c;引入页面视图&#xff0c;点击下载应用&#xff0c;或者是直接忽略。所以在获得曝光度之后如何决定完全取决于优化因素&#xff0c;例如应用图标、屏幕截图和视频预览以及其…