Arduino系列的開發板大家都很熟悉,也很強大,但常見的像是Arduno Uno、Nano、Mega等,都沒有WiFi功能,所以如果我們想要擁有網路功能,就要考慮其它開發板了,其實選擇還不少,但最容易取得、CP值高、且網路資料最多的,ESP8266應該是首選。
購買Arduino材料最佳選擇:https://www.jmaker.com.tw/
ESP8266基本上算是WiFi模組,理論上它應該只是提供WiFi功能而已,但因為它的硬體夠強大,讓它可以獨立運作,當成是一塊完整開發板,而且效果完全不輸給Arduino!
ESP8266系列的模組蠻多的,EPS-01、ESP-07、ESP-12E、ESP12F等等,但一般會建議初學者選用ESP-01,因為它已焊好針腳,拿到就能進行開發。不過ESP-01也有它的缺點,就是它的可用PIN腳很少,只有GPIO0和GPIO2,而且考慮到GPIO0在燒錄時會用到,所以嚴格說起來,能自由運用的,只剩GPIO02了。不過如果只是想試試ESP8266的開發,也算可以用了啦!
當然大家也知道,還有另一種選擇,就是挑一塊廠商已經整合好的ESP8266開發板,這類開發板非常多,像是NodeMCU V2、WeMos D1等,都是不錯的選擇。
本章節以ESP-01為主角,讓大家從最基本的層面開始ESP8266的開發。
ESP-01有兩個款式,一個是ESP-01,一個是ESP-01S。硬體規格基本上是一樣的,差別在於ESP-01S的背面有印腳位的名稱,這點還蠻方便的,但缺點是它把電源的LED給省掉了,是的,通電之後是沒有LED會亮的,這點對於初學者來說真的有些困擾,所以傑森還是建議初學者選擇ESP-01就可以了。
Arduino IDE原本是沒有內建ESP8266開發板的,所以我們要新增ESP8266的開發板,並且安裝函式庫,這部份請參考傑森之前寫的教學:
我們要先準備一個USB to TTL的轉接板(USB Adapter),它可以供電給ESP-01、讓Arduino IDE和ESP-01連接,這樣我們才能上傳程式。這類的轉接板還不少,常見的有FT232RL、CP210X或CH340晶片,都是不錯的選擇,至於接頭有USB、mini USB、Micro USB能選,這就看個人喜好了。
請注意!ESP-01只能用3.3V的電,絕對不能供給5V的電,會燒掉ESP-01的!
傑森個人偏好用Micro USB,所以習慣上都用微雪的版本,貴是貴點,但就是方便,不用多準備一條線。
購買微雪FT232RL USB轉TTL模組:
https://www.jmaker.com.tw/products/waveshare-ttl
ESP-01有8支腳,但它的設計有點麻煩,8腳分兩排,一排4腳,所以不能直接插麵包板。你可以選擇直接用杜邦線來接,或是用2個4PIN的長腳排針來轉接,這樣就可以插到麵包板了。
8個PIN,除了GPIO2以外,要接7條線,很多初學者都卡在這裡,但其實只要照圖接,不會太困難。
- VCC >> 3.3V
- EN(CH_PD) >> 3.3V
- TX >> RX
- RX >> TX
- GND >> GND
我們這次要做比較完整的接線,Reset功能要有,所以加了一個小按鍵,一腳接RST,一腳接GND,按下去就觸發Reset。
另外我們還要讓ESP-01能在Programming/Flash Mode和Normal Mode兩個模式之間切換,所以再加一個Switch開關,一腳接GPIO0,一腳接GND,關閉時為Normal Mode,也就是寫好程式後,要讓程式運作的模式;如果開關切到ON,就表示為Flash Mode,要寫程式進去時,就用這個模式。
如果你真的覺得接這些線實在太困擾,沒關係,有一款ESP-01的上傳神器,完全不用接線,插上去,就能直接進行開發了!
購買ESP-01 多用途上載器:
https://www.jmaker.com.tw/products/esp-01-uploader
接好線後,工作基本上算是完成8成了,再來我們寫一支基本的程式來進行測試。這支程式主要是由ESP82665函式庫的範例HelloServer進行改寫的,主要是讓ESP-01連上家裡或教至的無線AP,取後IP,然後變成一台Web Server,讓我們可以在手機或電腦上透過瀏覽器看到ESP-01的網頁,很厲害吧!
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#ifndef STASSID
#define STASSID "AP SSID" //無線分享器的名稱
#define STAPSK "xxxxx" //密碼
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
ESP8266WebServer server(80);
void handleRoot() { //訪客進入主網頁時顯示的內容
server.send(200, "text/plain", "Hello From ESP8266 !");
}
void handleNotFound() { //找不到網頁時顯示的內容
server.send(404, "text/plain", "File Not Found");
}
void setup(void) {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// 等待WiFi連線
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //在監控視窗顯示取得的IP
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot); //綁定主網頁會觸發的副程式
server.onNotFound(handleNotFound); //綁定找不到網頁時會觸發的副程式
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
MDNS.update();
}
請注意!上傳程式前,必須先將模式切到Flash Mode,並按一下Reset鍵。上傳程式時,會出現「Hard resetting via RTS pin...」的訊息,然後停在「Connecting...」,這時只要按一下Reset鍵,就能進入上傳程序了。
上傳完成後,請把模式切回Normal Mode,再按一下Reset鍵,讓程式開始運作。
請打開監控視窗,可以在裡面看到我們的ESP-01是否已連到WiFi AP,如果連上了,就會顯示取得的IP位址。若沒看到訊息,可以按一下Reset鍵,讓它重跑一次。一般來說,IP位址一旦取得,在一定時間內是不會改變的,所以之後也不用每次都檢查了。
有了IP位址,就可以查看網頁囉!請注意,因為取得的是WiFi區段的IP位址,所以必須用在同區段網域的電腦或手機才能查看哦。
ESP-01的基本開發就完成囉!接下來,我們加一點功能,當測覽器查看「/on」網頁時,就讓GPIO2控制的LED亮起來;當測覽器查看「/off」網頁時,就讓LED熄滅。
先加一下LED的線路。
再加上LED控制的程式,其實就是多了「/on」、「/off」兩個頁面的處理,經由GPIO2的控制,瀏覽器如果查看「/on」網頁,LED就亮起來;如果查看「/off」網頁,LED就熄滅。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#ifndef STASSID
#define STASSID "AP SSID" //無線分享器的名稱
#define STAPSK "xxxxx" //密碼
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
ESP8266WebServer server(80);
void handleRoot() { //訪客進入主網頁時顯示的內容
server.send(200, "text/plain", "Hello From ESP8266 !");
}
void handleNotFound() { //找不到網頁時顯示的內容
server.send(404, "text/plain", "File Not Found");
}
void setup(void) {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
pinMode(2,OUTPUT); //設定GPIO2為OUTPUT
digitalWrite(2,LOW); //熄滅LED
// 等待WiFi連線
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //在監控視窗顯示取得的IP
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot); //綁定主網頁會觸發的副程式
server.on("/on", []() { //網頁 /on 會執行的程式
server.send(200, "text/plain", "LED ON");
digitalWrite(2,HIGH); //點亮LED
});
server.on("/off", []() { //網頁 /off 會執行的程式
server.send(200, "text/plain", "LED OFF");
digitalWrite(2,LOW); //熄滅LED
});
server.onNotFound(handleNotFound); //綁定找不到網頁時會觸發的副程式
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
MDNS.update();
}
如果你是選用ESP-01專用上載器,只要接好GND和GPIO2的線,就搞定了!
現在大家對於ESP8266的開發應該有一定的了解,下一個章節,傑森將進一步介紹,如何讓做好的這個ESP-01和Arduino配合,讓Arduino也擁有WiFi功能。
傑森創工購物網:https://www.jmaker.com.tw/
傑森創工粉絲團:https://www.facebook.com/geeksfans/