Arduino--ESP8266 无线模块(四)
官网:https://www.espressif.com/zh-hans
2015年物联网处于爆发的一年,乐鑫的ESP8266WIFI 芯片成为强烈的催化剂。成功的将2014年前的40以上的WIFI成本压缩到现在的10元左右。内置WIFI前端和高性能的32位MCU,基本引爆物联网市场,几乎牵扯到电子的行业,都可以用上,比如WIFI开关 灯具 WIFI定位 电饭锅 空气净化器 等消费类小家电与大家电,都面临这一场技术革新,与新的用户体验!比如你仅仅增加10元的成本就可以把自己的产品被手机控制了。
文档资料:https://www.espressif.com/zh-hans/support/download/documents

-
Esp8266特点:
1)低功耗、高集成度的 Wi-Fi 芯片。
2)最小系统仅需 7 个元器件
3)超宽工作温度范围:-40°C 至 +125°C
4)ESP8285 : ESP8266 内封 8 Mbit Flash。
5)ESP8266EX 有三种运行模式:激活模式、睡眠模式和深度睡眠模式,能够延长电池寿命。
最小系统搭建(强调:烧录时候,一定要让GPIO0处于低电平,即接GND):
最小系统
TX:串口写
GND:接地
CH_PD:高电平为可用,低电平为关机
GPIO2:可悬空
RST:重置,可悬空
GPIO0:上拉为工作模式,下拉为下载模式,可悬空
VCC:3.3V(切不可接5V,烧片)
RX:串口读
示例代码:
https://github.com/esp8266/Arduino

-
工作模式
1)AP+STA模式
ESP8266模块可以作为一个工作站,所以我们可以将它连接到Wi-Fi网络。它也可以作为软接入点(soft-AP)运行,建立自己的Wi-Fi网络。因此,我们可以将其他站连接到这样的ESP模块。ESP8266也可以在工作站和软接入点模式下工作。
AP+STA模式
2)STA 模式
站级有几个功能,以方便管理Wi-Fi连接。如果连接丢失,ESP8266将自动重新连接到上一次使用的接入点,一旦它再次可用。模块重启也会发生同样的情况。
STA 模式
-
使用TTL调试
使用USB接Esp8266,CH_PD需要串联一个10kΩ的电阻后,再连接3.3v的电源。
串口调试 -
常用AT指令:
1)重启模块
指令为AT+RST
重启模块
-
查看版本信息
指令为AT+GMR
查看版本信息
3)恢复出厂设置
指令为AT+RESTORE

4)设置应用模式
指令为AT+CWMODE=3
注释:1为Station,2为AP,3为AP兼Station 模式

5)查询工作模式
指令为AT+CWMODE?

6)查看附近无线网络
指令为AT+CWLAP

7)加入AP
指令为AT+CWJAP="SSID","PWD"
ChinaNet-304

8)退出接AP
指令为:AT+CWQAP
9)设置AP模式下的参数
指令为:AT+CWSAP
设置命令
AT+CWSAP=<ssid>,<pwd>,<chl>, <ecn>
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
---|---|---|---|
<ecn> | 加密方式 | 0 | OPEN |
<ecn> | 加密方式 | 1 | WEP |
<ecn> | 加密方式 | 2 | WPA_PSK |
<ecn> | 加密方式 | 3 | WPA2_PSK |
<ecn> | 加密方式 | 4 | WPA_WPA2_PSK |
<ssid> | 接入点名称 | 字符串参数 | |
<pwd> | 密码 | 字符串型,最长64字节,ASCII编码 | |
<chl> | 通道号 |
10)获取本地IP地址
指令为AT+CIFSR


11)设置透传模式
指令为AT+CIPMODE=1
1 为STA模式

STA模式:(透传模式)
ESP8266模块要和电脑(服务端)在同一个局域网中。对路由器不需要任何其他的配置,只需要知道WIFI名称和密码;也不需要有外网;
12)连接到服务器
指令为AT+CIPSTART="TCP","服务器IP地址",端口
先在电脑打开服务端:


12)发送数据
发送数据:AT+CIPSEND
指令为:


12)退出透传模式
退出透传模式的办法是发送+++(后面不要加回车)即可退出。
14)AT+CIOBAUD=9600 修改波特率
T+CWMODE? //查询工作模式 1.Station (客户端模式)2.AP (接入点模式)3.Station+AP (两种模式共存)
更多请查看文档:AT-Espressif AT 指令集_AIThinkerMod_v021
二、电路原理图


arduino | ESP8266 |
---|---|
0 | TX |
1 | RX |
GND | GND |
VCC | VCC 3.3V |
2 | CH_PD |
注意:电压一定要为3.3V
连接好后,ESP8266板上的LED会亮。
三、安装库文件
1)选择首选项:

在其他Board Manager URL字段中输入https://arduino.esp8266.com/stable/package_esp8266com_index.json。 您可以添加多个URL,用逗号分隔。

2)开发板管理器



3)开发板选板
http://www.cnblogs.com/kekeoutlook/p/8286117.html


文档地址:
https://arduino-esp8266.readthedocs.io/en/latest/installing.html
第3方库文件下载地址:
https://github.com/itead/ITEADLIB_Arduino_WeeESP8266


四、Arduino与Esp8266硬串口连接
就是将Arduino的串口直接到Esp8266串口,注意RX连RX,TX连TX。
- 连接
ESP8266 | Arduino Uno |
---|---|
TX | 1(TX1) |
GND | GND |
CH_PD | 串联10KΩ电阻连接3.3v |
GPIO2 | - |
RST | - |
GPIO0 | - |
VCC | 3.3V |
RX | 0 (RX0) |
CH_PD需要串联一个10kΩ的电阻后,再连接3.3v的电源
- 代码
#include <Arduino.h> const int tx = 1; const int rx = 0; //硬串口连接 void setup() { //Serial.begin(9600); 注意!!千万别加这行代码 pinMode(rx,INPUT_PULLUP); pinMode(tx,INPUT_PULLUP); } void loop() { }
-
测试
可以直接发AT指令给Esp8266:
波特率一定要先115200。
每个版本的ESP8266波特率不同,一般是115200,你可以多测试几次。
串口调试
五、Arduino与Esp8266软串口连接
- Esp8266软串口连接
把ESP8266 的波特率改为9600。之前我们连接的Arduino上的0和1是硬串口。
注意,使用软串口连接导线时,模块的rx连接Arduino的tx,模块的tx连接Arduino的rx。
设置arduino上的8号口为RX,9号口为TX。就需要把ESP8266 的TX连接到Arduino的9号口上,模块的RX连接Arduino的8号口上。
ESP8266 | Arduino Uno |
---|---|
VCC | 3.3V(不能接5V,可能会烧坏) |
GND | GND |
CH_PD | (10k电阻)3.3V (实际上可以不加电阻) |
RX | 9(接软串口发送端,自定义) |
TX | 8(接软串口接收端,自定义) |
- 代码
#include <Arduino.h> #include <SoftwareSerial.h> //软串口通讯 SoftwareSerial espSerial(9, 8); //定义虚拟串口名为mySerial RX为9, TX为8 void setup() { espSerial.begin(115200); //初始化虚拟串口 esp8266 01波特率 Serial.begin(115200); //初始化Arduino默认串口 } char a; void loop() { //虚拟串口的用法和默认串口的用法基本一样 if (Serial.available()) { espSerial.write(Serial.read()); } if (espSerial.available()) { Serial.write(espSerial.read()); } }
波特率最好一致,否则会出现乱码。
-
测试
获取

六、 AP模式
Arduino上电,它通过软串口(Arduino的9号和8号脚)发送命令,
配置espson8266为 AP模式
wifi名称:test
密码:123456
通过硬串口向电脑打印调试信息,以及espson8266收到指令后发出的信息。
- 代码
#include <Arduino.h> #include <SoftwareSerial.h> //串口模块 #define DEBUG true SoftwareSerial esp8266(9, 8); //使Rx-Arduino线为插脚9,使Tx-Arduino线为插脚8。 String sendCommand(String command, const int timeout, boolean debug) { String response = ""; esp8266.print(command); // 将读取字符发送到ESP8266 long int time = millis(); while ((time + timeout) > millis()) { while (esp8266.available()) { // ESP有数据,因此将其输出显示到串行窗口 char c = esp8266.read(); //读下一个字符。 response += c; } } if (debug) { Serial.print(response); } return response; } void setup() { Serial.begin(115200); esp8266.begin(115200); //esp波特率 sendCommand("AT+CWMODE=2\r\n", 2000, DEBUG); //重置模式为AP // delay(20000); String s = "AT+CWSAP=\"test\",\"123456\",11,0\r\n"; sendCommand(s, 2000, DEBUG); //设置模式 Serial.println("1"); // delay(30000); sendCommand("AT+RST\r\n", 2000, DEBUG); //设置模式 delay(3000); sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); //为多个连接配置 // delay(20000); sendCommand("AT+CIPSERVER=1,6000\r\n", 1000, DEBUG); //服务端口为 6000 Serial.println("Server Ready"); } void loop() { //读取esp数据 if (esp8266.available()) { Serial.write(esp8266.read()); } //读取arduino数据 if (Serial.available()) { esp8266.write(Serial.read()); } }
- 测试:





七、工作站模式
四、代码
烧入代码蓝色LED会亮起。
#include <Arduino.h> #include <SoftwareSerial.h> //串口模块 #include <SerialESP8266wifi.h> //8266模块 #define sw_serial_rx_pin 4 //将此引脚连接到esp8266上的TX #define sw_serial_tx_pin 6 //将此引脚连接到esp8266上的RX #define esp8266_reset_pin 5 //将此引脚连接到esp8266上的CH_PD,而不是复位。 (让重置不连接) //设置串口引脚 SoftwareSerial swSerial(sw_serial_rx_pin, sw_serial_tx_pin); //最后一个参数设置ESP8266模块的本地echo选项。 //添加串口启用本地回显和wifi调试 SerialESP8266wifi wifi(swSerial, swSerial, esp8266_reset_pin, Serial); String inputString; boolean stringComplete = false; unsigned long nextPing = 0; void setup() { inputString.reserve(20); swSerial.begin(9600); Serial.begin(9600); while (!Serial) ; Serial.println("Starting wifi"); wifi.setTransportToTCP(); // 默认TCP协议 // wifi.setTransportToUDP();//连接服务器时会使用UDP,默认为TCP wifi.endSendWithNewline(true); // 将使用换行符和回车符结束所有传输,即println ..默认为true wifi.begin(); //打开本地ap和服务器(TCP),本地服务,如果别的Wifi连接本模块 // wifi.startLocalAPAndServer("MY_CONFIG_AP", "123456", "5", "2121"); // 指定用户名密码连接WIFI,连接其它的Wifi wifi.connectToAP("ChinaNet-304", "houjianjunxunteng1"); wifi.connectToServer("192.168.1.9", "2121"); wifi.send(SERVER, "ESP8266 test app started"); } void loop() { //确保esp8266已启动.. if (!wifi.isStarted()) wifi.begin(); //将您在arduino控制台中输入的内容发送到服务器 static char buf[20]; if (stringComplete) { inputString.toCharArray(buf, sizeof buf); wifi.send(SERVER, buf); inputString = ""; stringComplete = false; } //发送Ping命令 if (millis() > nextPing) { wifi.send(SERVER, "Ping ping.."); nextPing = millis() + 10000; } //监听收到的消息并回显,将等待收到消息,或者最大6000毫秒.. WifiMessage in = wifi.listenForIncomingMessage(6000); if (in.hasData) { if (in.channel == SERVER) Serial.println("Message from the server:"); else Serial.println("Message a local client:"); Serial.println(in.message); //回显; wifi.send(in.channel, "Echo:", false); wifi