单片机之ESP8266模块

目录

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,工作方式为2TH1=0xFD; //重置TL1TL1=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);//等待该字节发送完毕,发送完后硬件自动置一TITI = 0;//硬件之以后必须软件置零才能进行下一次数据传送delay_ms(5);At_Comd++;//指向下一个字节}
}
void WIFI_Init()//通过单片机配置AT指令
{SENT_At("AT+CIPMUX=1\r\n");//多连接模式delay_ms(1000); //每发送完一套命令延时1sSENT_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,工作方式为2TH1=0xFD; //重置TL1TL1=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);//等待该字节发送完毕,发送完后硬件自动置一TITI = 0;//硬件之以后必须软件置零才能进行下一次数据传送delay_ms(5);At_Comd++;//指向下一个字节}
}
void WIFI_Init()//通过单片机配置AT指令
{SENT_At("AT+CIPMUX=0\r\n");//单连接模式delay_ms(1000); //每发送完一套命令延时1sSENT_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); //每发送完一套命令延时1sSENT_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); //每发送完一套命令延时1sSENT_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引脚后就可继续进行测试)。

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

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

相关文章

【vue3】插件@tsparticles/vue3、tsparticles实现粒子特效

文章目录 一、安装依赖二、全局引入三、使用 一、安装依赖 npm i tsparticles/vue3 npm i tsparticles二、全局引入 // main.js import Particles from tsparticles/vue3 import { loadFull } from tsparticlesconst app createApp(App) app.use(Particles, {init: async (e…

常见面试算法题-九宫格按键输入法

■ 题目描述 九宫格按键输入&#xff0c;判断输出&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连续按同一个按键会依次出现这个按键上的字母&#xff0c;如果输入”/”或者其他字符&#xff0c;则循环中…

如何试用 Ollama 运行本地模型 Mac M2

首先下载 Ollama https://github.com/ollama/ollama/tree/main安装完成之后&#xff0c;启动 ollma 对应的模型&#xff0c;这里用的是 qwen:7b ollama run qwen:7b命令与模型直接交互 我的机器配置是M2 Pro/ 32G&#xff0c;运行 7b 模型毫无压力&#xff0c;而且推理时是用…

【Proteus】蜂鸣器播放音乐

按键按一次&#xff0c;蜂鸣器响一次 &#xff0c;LCD1602同步。 #include <REGX52.H> #include <INTRINS.H>unsigned int keynum; sbit RSP3^0; //** sbit RWP3^1; //** sbit EP3^2; //** sbit buzzerP1^5; void delay(unsigned int n)//1ms {unsigned char a,…

数字藏品app开发

数字藏品是指使用区块链技术&#xff0c;对应特定的作品、艺术品生成的唯一数字凭证。在保护其数字版权的基础上&#xff0c;数字藏品实现了真实可信的数字化发行、购买、收藏和使用。数字藏品是数字出版物的一种新形态&#xff0c;具有唯一的IP数字身份和所有权信息&#xff0…

用Amazon Bedrock上最新模型Claude3 Opus制作网页小游戏

2024年4月16日&#xff0c;亚马逊云科技官方发布Anthropic Claude系列最强模型 Claude 3 Opus现已在Amazon Bedrock平台上正式可用&#xff0c;这一更新对于亚马逊云科技的用户和开发者们来说是个重大的好消息。因为企业云端应用可以更便捷、安全地集成Claude 3 Opus的API&…

Ubuntu 部署ChatGLM3大语言模型

Ubuntu 部署ChatGLM3大语言模型 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 源码&#xff1a;https://github.com/THUDM/ChatGLM3 部署步骤 1.服务器配置 Ubuntu 20.04 8核(vCPU) 32GiB 5Mbps GPU NVIDIA T4 16GB 硬盘 100GiB CUDA 版本 12.2.2/…

[2021最新]Java时间戳和日期时间互转换

代码&#xff1a; import java.text.ParseException; import java.text.SimpleDateFormat;public class MainProcess {public static void main(String[] args) throws ParseException {// 1.set formatSimpleDateFormat timeSmat new SimpleDateFormat("yyyy-MM-dd HH:…

多模态之ALBEF—先对齐后融合,利用动量蒸馏学习视觉语言模型表征,学习细节理解与论文详细阅读:Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation &#xff08;ALBEF&#xff09;在融合之前对齐&#xff1a;利用动量蒸馏进行视觉与语言表示学习 Paper: arxiv.org/pdf/2107.07651.pdf Github: https://github.com/salesforce/…

从零实现诗词GPT大模型:数据集介绍和预处理

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 本章将介绍该系列文章中使用的数据集&#xff0c;并且编写预处理代码&#xff0c;处理成咱们需要的格式。 一、数据集介绍 咱们使用的数据集名称是chinese-poetry&#xff0c;是一个在github上开源的中文诗…

[svelte]属性和逻辑块

属性 / Default values • Svelte 教程 | Svelte 中文网 属性 Declaring props 到目前为止&#xff0c;我们只处理了内部状态——也就是说&#xff0c;这些值只能在给定的组件中访问。 在任何实际应用程序中&#xff0c;都需要将数据从一个组件向下传递到其子组件。为此&…

IO基础合集

IO基础合集 1. File类1.1 概述1.2 构造方法1.3 常用方法获取功能的方法绝对路径和相对路径判断功能的方法创建删除功能的方法 1.4 目录的遍历 2. IO概述2.1 什么是IO2.2 IO的分类2.3 IO的流向说明图解2.4 顶级父类们 3. 字节流3.1 一切皆为字节3.2 字节输出流【OutputStream】3…