一、 背景
nRF24L01的成本較低,但內(nèi)部需通過(guò)SPI通信,略顯復(fù)雜,同時(shí)RF過(guò)于專(zhuān)用,接入其他系統(tǒng)時(shí)需要轉(zhuǎn)換,不方便。
ESP8266是樂(lè)鑫公司推出的廉價(jià)、但幾乎全能的WIFI芯片,被各種智能硬件廣泛使用,根據(jù)其datasheet,不但支持SPI,也可通過(guò)I2C、UART等方式進(jìn)行通信,尤其是UART,直接支持AT指令,大大簡(jiǎn)化開(kāi)發(fā)難度,相當(dāng)便利。本文即采用AT模式。
ESP8266開(kāi)發(fā)板,TB約12塊左右,右側(cè)為ESP8266,左側(cè)為25Q80BVSIG,1M閃存。
二、接線
1、ESP8266開(kāi)發(fā)板引腳圖
TX:串口寫(xiě)
GND:接地
CH_PD:高電平為可用,低電平為關(guān)機(jī)
GPIO2:可懸空
RST:重置,可懸空
GPIO0:上拉為工作模式,下拉為下載模式,可懸空
VCC:3.3V(切不可接5V,燒片)
RX:串口讀
2、接線示意

ESP8266的串口默認(rèn)波特率為115200,mega也可直接接RX0/TX0,為調(diào)試方便起見(jiàn),本文中RX0/TX0留做調(diào)試窗口,用RX1/TX1和芯片交互。如果是UNO,如果要看調(diào)試信息,只能增加一個(gè)軟串口。
三、代碼&運(yùn)行
直接通過(guò)串口直接讀寫(xiě)AT指令,但指令較多,處理繁瑣,
找到有如下的庫(kù)對(duì)AT指令做了封裝,使用十分便利,推薦。
Git地址為:
https://github.com/ekstrand/ESP8266wifi.git
具體AT指令及ESP8266相關(guān)文檔,可見(jiàn)樂(lè)鑫官方站點(diǎn):
http://espressif.com/zh-hans/support/download/documents
1) ESP8266庫(kù)安裝
下載上面的ESP8266的庫(kù)后,將其復(fù)制到Arduino安裝目錄下的libraries目錄下,啟動(dòng)ArduinoIDE后,從例子中選擇ESP8266_tcp_cli。
該庫(kù)默認(rèn)支持3個(gè)客戶端連接和1個(gè)監(jiān)聽(tīng)連接,如要增大須修改其頭文件中的如下兩個(gè)宏:
1 define SERVER ‘4’
2 define MAX_CONNECTIONS 312
2) 代碼修改
該庫(kù)設(shè)計(jì)很靈活,設(shè)置了3個(gè)串口,入串口,出串口和調(diào)試串口。
其中入串口和出串口用于AT命令發(fā)送和接收,和ESP8266的串口相連,調(diào)試串口可顯示具體交互情況(AT指令信息等)原例子中采用的是UNO,因其只有一個(gè)硬串口,所以改為Mega適用,以查看調(diào)試信息。
3) 運(yùn)行
加載運(yùn)行后,如WIFI設(shè)置正常,則可接入WIFI并取得IP,如下:
可看到調(diào)試串口輸出的AT指令,已經(jīng)連接到WIFI,并取得192.168.80.188的IP.
另外,2121端口被也監(jiān)聽(tīng)成功。
可用telnet 模擬客戶端,連接建立成功后,輸入數(shù)據(jù)0~D,hello world。
輸入的數(shù)據(jù)可從COM監(jiān)視器中看到對(duì)應(yīng)的AT指令。如下圖:
四、例子代碼解析
從原有例子中刪除了軟串口相關(guān)的處理,如下
#include 《ESP8266wifi.h》
#define esp8266_reset_pin 5
#define SERVER_PORT “2121”
#define SSID “XXXX”
#define PASSWORD “yourpass”
// 初始化,串口1和ESP8266交互,串口0做調(diào)試輸出, pin5做reset
ESP8266wifi wifi(Serial1, Serial1, esp8266_reset_pin, Serial);
void processCommand(WifiMessage msg);
uint8_t wifi_started = false;
// 自定義的應(yīng)用層命令,可根據(jù)自身應(yīng)用修改
const char RST[] PROGMEM = “RST”;
const char IDN[] PROGMEM = “*IDN?”;
void setup() {
// 調(diào)試串口啟動(dòng),波特率可隨意指定
Serial.begin(115200);
// ESP8266默認(rèn)波特率為115200(可用AT指令修改)
Serial1.begin(115200);
while (!Serial) // 等待串口初始化成功
;
Serial1.println(“Starting wifi”); // 命令
Serial.println(“Starting wifi”); // 調(diào)試log輸出
wifi.setTransportToTCP(); // TCP模式(默認(rèn)設(shè)置)
wifi.endSendWithNewline(false); // 發(fā)送數(shù)據(jù)自動(dòng)以 結(jié)尾(默認(rèn)設(shè)置)
wifi_started = wifi.begin(); // WIFI啟動(dòng)
if (wifi_started) { // 如果WIFI初始化成功
wifi.connectToAP(SSID, PASSWORD); // 指定用戶名密碼連接WIFI
wifi.startLocalServer(SERVER_PORT); // 本機(jī)(Arduino)監(jiān)聽(tīng)2121端口(做服務(wù)端)
} else {
// ESP8266 isn‘t working.。
Serial.println(“ESP8266 isn’t working.?!保?
}
}
void loop() {
static WifiConnection *connections;
// check connections if the ESP8266 is there
if (wifi_started)
wifi.checkConnections(&connections); // 檢查/獲取當(dāng)前所有連接的狀況
// check for messages if there is a connection
for (int i = 0; i 《 MAX_CONNECTIONS; i++) { // 默認(rèn)最大為3
if (connections[i].connected) {
// See if there is a message
WifiMessage msg = wifi.getIncomingMessage();
if (msg.hasData) { // 如果有數(shù)據(jù)
processCommand(msg);
}
}
}
}
void processCommand(WifiMessage msg) { // 數(shù)據(jù)處理函數(shù)
char espBuf[MSG_BUFFER_MAX];
int set;
char str[16];
Serial.print(msg.message);
// 以下為應(yīng)用層面的處理
sscanf(msg.message, “%15s %d”, str, &set);
Serial.print(str);
Serial.println(set);
if ( !strcmp_P(str, IDN) ) {
wifi.send(msg.channel, “ESP8266wifi Example”);
}
// Reset system by temp enable watchdog
else if ( !strcmp_P(str, RST) ) {
wifi.send(msg.channel, “SYSTEM RESET.。?!保?
// soft reset by reseting PC
asm volatile (“ jmp 0”);
}
// Unknown command
else {
wifi.send(msg.channel, “ERR”);
}
}
評(píng)論