目录

ESP8266简介

前言

ESP8266的工作模式

ESP8266引脚说明

ESP8266测试

步骤

单片机与esp8266交互

前言

收到数据的格式

AP模式

服务器模式

外部执行命令

代码内执行命令

代码部分

客户端模式

外部执行命令

内部执行命令

代码部分

STA模式

服务器模式

外部执行命令

代码内部执行命令

代码部分

客户端模式

外部执行命令

内部执行命令 

代码部分

ESP8266的烧录

前言

步骤

ESP8266简介

前言

  • ESP8266是一个完整且成体系的WIFI网络解决方案,能够搭载软件应用,或通过另一个应用处理器卸载掉所有的WIFI网络功能
  • 我们使用的ESP8266是串口型WIFI,速度比较低,不能用来传输图像或者视频等这些大容量数据,主要应用于数据量传输比较少的场合。

ESP8266的工作模式

  • STA模式:ESP8266通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制
  • AP模式:AP模式也是默认模式,ESP8266模块作为热点,实现手机或电脑直接与模块进行通信,实现局域网无线控制
  • STA+AP模式:两种模式的共存模式,即可以通过互联网控制,也可AP接入点控制,实现两者之间的无缝切换

ESP8266引脚说明

  • VCC:电源引脚,电源一般接3.3V
  • GND:接地
  • URXD:串口接收引脚
  • UTXD:串口发送引脚
  • RST:复位管脚,可做外部硬件复位使用
  • CH_PD:使能引脚,接3.3V
  • GPIO0:用于对模块的烧录flash芯片,烧录时接GND
  • GPIO2:该模块的外接引脚,一般不用(类似单片机的P引脚)

ESP8266测试

前言:测试ESP8266可以使用51单片机(使用单片机我经过测试不接使能引脚烧录和测试可成功),也可以使用USB转TTL模块

  • ESP模块的VCC引脚——3.3V电源引脚
  • ESP模块的GND引脚——接地
  • ESP模块的RXD引脚——USB转TTL模块的TXD引脚
  • ESP模块的TXD引脚——USB转TTL模块的RXD引脚
  • ESP模块的CH_PD引脚——3.3V

步骤

  • 将各个引脚按照上述方式连接
  • 下载好USB转TTL模块驱动CH340
  • 连接完成后打开安信可串口调试助手,将波特率改为ESP8266的默认波特率115200MHz,选好自己的串口,勾选自动换行,并打开该串口
  • 发送AT命令,若返回OK字样,那么说明模块没问题

注意:当我们只是连接ESP模块的VCC引脚,GND引脚和使能引脚,便可以通过电脑或手机搜索出该ESP模块的WIFI信号。

单片机与esp8266交互

前言

  • 引脚连线和测试时的引脚连线一样,只不过将USB转TTL模块改为单片机模块
  • 要想让模块与单片机交互,需要将模块进行配置;
  • 指令原理:设备的串口连接esp8266的串口并将修改的串口值写入到ESP模块的flash中,即使断电,也会被保存。
  • 无论配置那种工作模式,那么下面指令配置必须提前执行

AP:测试连接是否成功,连接成功后,模块回想我们返回ok

AT+RESTORE:恢复出厂设置,设置乱了的话恢复默认设置

AT+UART_DEF=波特率,8,1,0,0:将波特率改为自己设备对应的波特率

注意:

  • 每次发送命令后,命令之后必须添加回车换行,并且命令之间不能有空格。
  • 对于后面有=(也就是有配置选项的,将=及后面的配置改为?就可以对该配置信息进行查询)

收到数据的格式

前言:当使用透传模式时,那么手机发送给单片机什么信息,那么单片机就收到什么信息;当不使用透传模式时,那么手机发送给单片机的信息会被esp8266模块进行封装

不使用透传模式:手机发送:数据——单片机收到:+PID,ID号,发送数据的长度,数据

使用透传模式:手机发送:数据——单片机收到:数据

注意:

  • 当手机连接热点成功后,其中+PID,ID号是固定的,用户可以根据需要发送多少数据,然后长度就可以确定,这样串口中断就可以按照这个格式进行解析,而我们主要关注的是数据这块,数据这块内容就是手机实际给我们发送的,其他的都是esp8266给我们加的
  • 当esp8266模块作为服务器时,不可以使用透传模式;只有当esp8266作为客户端时才可以使用透传模式
  • AT+CIPMODE=值:是否开启透传模式(值为1时开启透传模式,值为0时关闭透传模式)

AP模式

服务器模式

原理:单片机连接电脑,给esp8266模块供电,esp8266模块释放wifi热点,esp8266作为服务器开放端口给连接esp8266热点的手机客户端进行连接,手机作为客户端只需要填写esp8266的IP地址和端口就能与esp8266进行通信,而esp8266通过串口与单片机进行通信,此时我们就相当于通过手机与单片机进行通信。

外部执行命令

AT+CWMODE=2:开启 AP 模式(1为station模式,2为ap模式,3为混合模式)

AT+CWSAP="wifi名","密码8位",热点通道,加密方式:设置esp8266模块wifi基础设置

  • 加密方式:(0:OPEN,1:WEP, 2:WPA_PSK,3:WPA2_PSK,4:WPA_WPA2_PSK)

AT+CIFSR:获取当前模块的IP地址(不用写也可以,这里是为了让手机客户端连接)

AT+RST:设置完成后重启

注意:以上设置最好在esp8266模块使用之前进行配置,那么这样的话就不用在代码中执行了。

代码内执行命令

AT+CIPMUX=1:开启多连接模式

AT+CIPSERVER=1,端口号:开放服务器端口

注意:这里面配置的命令需要单片机向esp8266模块发送。

代码部分
#include <regx52.h>
unsigned char key=0;
unsigned char Receive[15];
unsigned int i=0;
//延时ms函数
void delay_ms(unsigned int ms)
{
	unsigned char i,j;
	for(i=ms;i>0;i--){
		for(j=120;j>0;j--);
	}
}
void initscon(){
	SCON=0x50; //8位异步通信方式,允许接收数据
	TMOD=0x20; //配置波特率发生器T1,工作方式为2
	TH1=0xFD; //重置TL1
	TL1=0xFD; //设置初值
	EA=1;	//开启总中断
	TR1=1;	//打开波特率发生器T1
}
void SENT_At(unsigned char *At_Comd)//指针指向At指令
{
	ES = 0;//关闭串口中断
	while(*At_Comd!='\0')
	{
		SBUF = *At_Comd;
		while(!TI);//等待该字节发送完毕,发送完后硬件自动置一TI
		TI = 0;//硬件之以后必须软件置零才能进行下一次数据传送
		delay_ms(5);
		At_Comd++;//指向下一个字节
	}
}
void WIFI_Init()//通过单片机配置AT指令
{
	SENT_At("AT+CIPMUX=1\r\n");//多连接模式
	delay_ms(1000); //每发送完一套命令延时1s
	SENT_At("AT+CIPSERVER=1,8080\r\n");//开启服务器端口号
	delay_ms(1000);
	ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}
void main(){
	while(1){
		//第一次按下按键
		if(P3_1==0&&key==0){
				key=1;
			}
		//按下按键并抬起
		if(key==1&&P3_1==1){
			initscon();
			WIFI_Init();
			key=0;
		}
	}
}
void scon_isr() interrupt 4
{
	if(TI){
		TI=0; //数据发送完清TI
	}
	if(RI){
			RI=0;
			Receive[i]=SBUF; //读取接受的数据
			if(Receive[0]=='+'){
					i++;
			}else{
					i=0;} //超过数组限制i=0后跳出中断
			if(i==10){ //因为前面多个i++,所以i=10时判断
				i=0;
			//取出发送的数据进行判断
			switch(Receive[9]){
			case 1:P2_0=~P2_0;break;
			case 2:P2_1=~P2_1;break;
			case 3:P2_2=~P2_2;break;
			case 4:P2_3=~P2_3;break;
			case 5:P2_4=~P2_4;break;
			case 6:P2_5=~P2_5;break;
			case 7:P2_6=~P2_6;break;
			case 8:P2_7=~P2_7;break;
			default:P2=0xff;
			}
		}
	}
}

注意:

  • P2口为我控制8个LED灯的引脚,P3_1为我按键的引脚 
  • 这里面我只要长度为10的数据,仅仅最后一个数据用来作灯的控制数据
  • 在这里面我可以通过我的按键进行手机和wifi模块的连接(按一下按键就可以初始化wifi),通过手机发送的数字来控制8个LED灯的亮灭

客户端模式

原理:单片机连接电脑给esp8266供电,esp8266向外部发送热点,我们的手机连接esp8266发送的热点并通过端口开放自己的服务,那么esp8266模块就可以通过自己发送的热点来访问手机搭建的服务进而实现esp8266与手机的通信,因为esp8266与单片机通过串口通信,那么我们就可以通过我们的手机与单片机实现间接的通信。

外部执行命令

AT+CWMODE=2:设置工作模式为AP模式

AT+CWSAP="模块wifi名称","wifi8位密码",1,4:设置esp8266模块热点基本参数

AT+CIFSR:查询模块IP地址

内部执行命令

AT+CIPMUX=0:开启单连接模式(不写也可)

AT+CIPSTART="TCP","手机服务器IP地址",手机开放的端口:通过端口和手机服务器建立连接

AT+CIPMODE=1:开启透传模式

注意:这种模式下,手机作为服务端,那么必须始终处于监听状态,随时等待esp8266模块的连接

代码部分
#include <regx52.h>
unsigned char key=0;
unsigned char Receive;
//延时ms函数
void delay_ms(unsigned int ms)
{
	unsigned char i,j;
	for(i=ms;i>0;i--){
		for(j=120;j>0;j--);
	}
}
void initscon(){
	SCON=0x50; //8位异步通信方式,允许接收数据
	TMOD=0x20; //配置波特率发生器T1,工作方式为2
	TH1=0xFD; //重置TL1
	TL1=0xFD; //设置初值
	EA=1;	//开启总中断
	TR1=1;	//打开波特率发生器T1
}
void SENT_At(unsigned char *At_Comd)//指针指向At指令
{
	ES = 0;//关闭串口中断
	while(*At_Comd!='\0')
	{
		SBUF = *At_Comd;
		while(!TI);//等待该字节发送完毕,发送完后硬件自动置一TI
		TI = 0;//硬件之以后必须软件置零才能进行下一次数据传送
		delay_ms(5);
		At_Comd++;//指向下一个字节
	}
}
void WIFI_Init()//通过单片机配置AT指令
{
	SENT_At("AT+CIPMUX=0\r\n");//单连接模式
	delay_ms(1000); //每发送完一套命令延时1s
	SENT_At("AT+CIPSTART=\"TCP\",\"192.168.4.2\",8086\r\n");//与192.168.4.2建立连接
	delay_ms(1000);
	SENT_At("AT+CIPMODE=1\r\n");//开启透传模式
	delay_ms(1000);
	ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}
void main(){
	while(1){
		//第一次按下按键
		if(P3_1==0&&key==0){
				key=1;
			}
		//按下按键并抬起
		if(key==1&&P3_1==1){
			initscon();
			WIFI_Init();
			key=0;
		}
	}
}
void scon_isr() interrupt 4
{
	if(TI){
		TI=0; //数据发送完清TI
	}
	if(RI){
			RI=0;
			Receive=SBUF; //读取接受的数据
			switch(Receive){
			case 1:P2_0=~P2_0;break;
			case 2:P2_1=~P2_1;break;
			case 3:P2_2=~P2_2;break;
			case 4:P2_3=~P2_3;break;
			case 5:P2_4=~P2_4;break;
			case 6:P2_5=~P2_5;break;
			case 7:P2_6=~P2_6;break;
			case 8:P2_7=~P2_7;break;
			default:P2=0xff;
			}
	}
}

注意:因为开启了透传模式,所以串口中断的代码就变得简单了,就不需要从esp8266封装的数据中提取有用的信息了,若你不用透传模式,那么串口中断处代码和上面esp8266模块作为服务器的代码一样

STA模式

服务器模式

原理:单片机连接电脑,给esp8266进行供电,esp8266连接我们局域网中的热点,同时esp8266通过端口在局域网内充当服务器,那么局域网内的手机就可以通过这个局域网访问到esp8266服务器从而对esp8266服务器进行控制,而esp8266与我们的单片机通过串口进行通信,那么我们的手机就可以间接的与单片机进行通信。

外部执行命令

AT+CWMODE=1:开启station工作模式

AT+CWJAP="wifi名称","wifi密码":连接外部wifi热点(尽量连2.4g)

AT+RST:重启模块生效

代码内部执行命令

AT+CIPMUX=1:开启多连接模式(多个设备可以连接esp8266模块)

AT+CIFSR:查询esp8266模块IP地址(用于手机连接esp服务器)

AT+CIPSERVER=1,端口号:通过端口开放服务

代码部分
void WIFI_Init()//通过单片机配置AT指令
{
	SENT_At("AT+CIPMUX=1\r\n");//多连接模式
	delay_ms(1000); //每发送完一套命令延时1s
	SENT_At("AT+CIPSERVER=1,8086\r\n");//开启服务器端口号
	delay_ms(1000);
	ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}

注意:其他的代码和上面服务器模式的代码一样(只是这个wifi初始化的模块变了)。

客户端模式

原理:单片机连接电脑给esp8266进行供电,esp8266连接我们手机所在的局域网,局域网中我们的手机作为服务器开放了端口一直处于外部监听状态,由于esp8266模块和我们的手机在同一个局域网中,那么esp8266就可以主动连接我们的手机和其进行通信,由于esp8266和单片机之间通过串口进行通信,那么我们的手机就间接的与单片机进行通信。

外部执行命令

AT+CWMODE=1:设置工作模式为station模式

AT+CWJAP="wifi名称","wifi密码":连接外部wifi热点(尽量连2.4g)

AT+RST:重启模块生效

内部执行命令 

AT+CIPSTART="TCP","手机服务器IP地址",手机端口号:通过端口和手机建立连接

AT+CIPMODE=1:开启透传模式(1为透传,0为非透传)

注意:

  • 在这种情况下连接esp8266模块,那么我们的手机作为服务器就必须一直处于监听状态。
  • 不使用透传模式,那么通过手机app发送过来的数据就会被esp8266包装,进而我们取数据困难
代码部分
void WIFI_Init()//通过单片机配置AT指令
{
	SENT_At("AT+CIPSTART=\"TCP\",\"192.168.18.9\",8888\r\n");//连接服务器
	delay_ms(1000); //每发送完一套命令延时1s
	SENT_At("AT+CIPMODE=1\r\n");//开启透传模式
	delay_ms(1000);
	ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}

注意:其他的代码和上面客户端模式的代码一样(只是这个wifi初始化的模块变了)。 

ESP8266的烧录

前言

  • 当我们对模块的设置内容比较乱,并且致使我们无法完成网络调试时,我们可以通过烧录固件的行式将设置恢复为默认状态
  • 连接引脚是在ESP8266测试的引脚接线基础上多增加一条引脚接线(ESP模块的GPIO0引脚——接地)

步骤

  • 将各个引脚按照前言方式连接
  • 去https://docs.ai-thinker.com/esp8266下载flash_download_tool烧录工具和ESP8266.bin的固件(MQTT透传AT固件(固件号:1471))
  • 打开flash_download_tool后点ok

第一个绿方块填写你要烧录固件的文件位置,第二个绿方块填写你烧录固件的起始地址(就写0x0000)

按照上面的填写方式填写后(串口写你自己的串口),先点击ERASE(擦除)后再启动51单片机,当绿方块最后变成完成(擦除完成)后点击START进行烧录

这样就烧录成功了(拔掉ESP模块的GPIO0引脚后就可继续进行测试)。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐