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