单片机之ESP8266模块
前言ESP8266是一个完整且成体系的WIFI网络解决方案,能够搭载软件应用,或通过另一个应用处理器卸载掉所有的WIFI网络功能我们使用的ESP8266是串口型WIFI,速度比较低,不能用来传输图像或者视频等这些大容量数据,主要应用于数据量传输比较少的场合。引脚连线和测试时的引脚连线一样,只不过将USB转TTL模块改为单片机模块要想让模块与单片机交互,需要将模块进行配置;设备的串口连接esp826
目录
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引脚后就可继续进行测试)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)