1
Arduino Wi-Fi(ESP8266) 入 門 應 用 <網 頁 控 制 LED>
ESP8266 和 樹 莓 派 3 均 可 透 過 Wi-Fi 控 制 I/O,這 是 物 聯 網 基 本 要 求 ,但 要 留 意 電 腦 和 裝 置 的 IP 需 要 在 同 一 子 網 域 , 這 樣 才 可 以 用 電 腦 網 頁 遠 端 控 制 I/O, 所 以 在 實 際 應 用 上 , 除 非 你 有 申 請 固 定 IP 位 置 方 能 真 正 做 物 聯 網 的 遠 端 監 控 , 所 以 建 議 利 用 手 機 當 作 基 地 台 。
亦 可 使 用 ThingSpeak 專業物聯網的平台網站,網址是 https://thingspeak.com,可以利用這個物聯網 平台先行開發。而聯發科 Linkit One 有提供專用網站,只要登入個人帳號即可透過網頁或手機遠端監控, 但其缺點是價格偏高,且輸出信號較弱,那是因為要像手機一樣省電。
ESP8266 優 點 是 內 建 Wi-Fi 晶 片,體 積 與 耗 電 量 都 很 小,使 用 方 式 同 Arduino,有 7 個 GPIO 可 以 控 制 , 對 於 簡 單 的 遠 端 監 控 應 是 足 夠 , 每 隻 GPIO 可 以 接 繼 電 器 控 制 家 電 , 或 是 連 接 各 式 感 測 器 傳 回 雲 端 以 便 判 斷。https://espressif.com/zh-hans/products/hardware/esp8266ex/overview
安裝使用方式如下:
1. 按『檔案→偏好設定』,URLs 輸入http://arduino.esp8266.com/stable/package_esp8266com_index.json,
按『好』,若沒看到該畫面是因為 Arduino 版本太舊,應立即更新最新版本,其實聯發科 Linkit One
也是要透過這種方式額外安裝相關驅動程式,因為預設清單並沒有最新的板子。
2. 按『工具→板子→Boards Manager...板子管理員』,拉到最下面,點選最後面的 ESP8266…,選擇最
2
3. 板子 Generic ESP8266 Module,當選擇正確,當接上電路板序列埠才可看到 COM?(GPIO4、5 印相反) 4. 若要讓 ESP8266 模組進入燒錄模式,不像 UNO 板可以直接燒錄,因為內部結構關係,若要進入 燒錄模式須同時按下 S1 鍵與 S2 鍵,心裡默數 123 ,超過 0.5 秒後先放開 S2 鍵,再默數 123 後 放開 S1 鍵,藍色燈熄滅,這樣才能進行燒錄, 實際燒錄時藍燈閃爍,剛開始會覺得麻煩,但習 慣就好。當完成燒錄後,若要恢復正常執行模式, 只要再按一下S2 鍵(右下)即可。
//瀏覽器輸入 http://server_ip/LED1on可以控制 LED1 點亮,http://server_ip/LED1off可以控制 LED1 熄滅
//========== 整體宣告部分 ============
#include <ESP8266WiFi.h> //掛載 ESP8266WiFi.h 標頭檔
const char* ssid = "chenlung88"; //crSSID 改為您所使用 WiFi 的 ssid
const char* password = "8642****"; //請將 yourPWD 改為您所使用 WiFi 的 password WiFiServer server(80); //建構 WiFi 伺服器,使用 Port 80
#define LED1 2 //定義 LED1 或繼電器連接在 GPIO2 #define LED2 4 //定義 LED2 或繼電器連接在 GPIO4 #define LED3 13 //定義 LED3 或繼電器連接在 GPIO13 #define BZ 16 //蜂鳴器連接在 GPIO16
#define ON 1 //定義繼電器之 ON(低態動作) #define OFF 0 //定義繼電器之 OFF(低態動作) //========== 初始設定部分 ============ void setup() { //設定繼電器接腳 pinMode(5, OUTPUT); digitalWrite(5, LOW); pinMode(12, OUTPUT); digitalWrite(12, LOW); pinMode(14, OUTPUT); digitalWrite(14, LOW);
3 pinMode(LED1, OUTPUT); //設定 LED1 為輸出接腳 digitalWrite(LED1, OFF); //設定 LED1 之初始狀態 pinMode(LED2, OUTPUT); //設定 LED2 為輸出接腳 digitalWrite(LED2, OFF); //設定 LED2 之初始狀態 pinMode(LED3, OUTPUT); //設定 LED3 為輸出接腳 digitalWrite(LED3, OFF); //設定 LED3 之初始狀態 //設定串列埠 Serial.begin(115200); //啟用串列埠(連接序列埠監控視窗) delay(10); //稍候 10ms Serial.println(); //換行 Serial.println(); //換行 Serial.print("Connecting to "); Serial.println(ssid); //顯示 SSID //ESP8266 模組連接 WiFi WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); //待連接 WiFi
Serial.print("."); }
Serial.println(); //換行
Serial.println("WiFi connected"); //顯示已連上 WiFi //啟動伺服器 server.begin(); Serial.println("Server started"); //顯示已啟動伺服器 //在序列埠監控視窗裡顯示 ESP8266 之 IP Serial.println(WiFi.localIP()); } //========== 主程式部分 ============ void loop() { //檢查是否有客戶端(client)連接
WiFiClient client = server.available();
if (!client) return; //若沒有客戶端連接則返回 //若有客戶端連接
Serial.println("new client"); //在序列埠監控視窗裡顯示有客戶端連接 while(!client.available()) delay(1); //等待客戶端傳入資料
//讀取客戶端傳入之需求列
String req = client.readStringUntil('\r');
Serial.println(req); //在序列埠監控視窗裡顯示客戶端需求 client.flush(); //放棄已寫入到客戶端,但尚未讀取的資料 //處理需求
int val;
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n"; if (req.indexOf("/LED1on") != -1)
{ digitalWrite(LED1, ON); //開啟 LED1 beep(1);
4 s += "<html>\r\nLED1 is ON </html>\n";
client.print(s); //在客戶端顯示訊息 }
else if (req.indexOf("/LED1off") != -1) { digitalWrite(LED1, OFF); //關閉 LED1 beep(1);
s += "<html>\r\nLED1 is OFF </html>\n"; client.print(s); //在客戶端顯示訊息 }
else if (req.indexOf("/LED2on") != -1)
{ digitalWrite(LED2, ON); //開啟 LED2 beep(1);
s += "<html>\r\nLED2 is ON </html>\n"; client.print(s); //在客戶端顯示訊息 }
else if (req.indexOf("/LED2off") != -1) { digitalWrite(LED2, OFF); //關閉 LED2 beep(1);
s += "<html>\r\nLED2 is OFF </html>\n"; client.print(s); //在客戶端顯示訊息 }
else if (req.indexOf("/LED3on") != -1)
{ digitalWrite(LED3, ON); //開啟 LED3 beep(1);
s += "<html>\r\nLED3 is ON </html>\n"; client.print(s); //在客戶端顯示訊息 }
else if (req.indexOf("/LED3off") != -1) { digitalWrite(LED3, OFF); //關閉 LED3 beep(1); s += "<html>\r\nLED3 is OFF </html>\n"; client.print(s); //在客戶端顯示訊息 } else { Serial.println("invalid request"); //在序列埠監控視窗裡顯示不正確需求 client.stop(); //停止客戶端連接 return; //返回 } client.flush(); //放棄已寫入到客戶端,但尚未讀取的資料 delay(1); //稍候 1ms Serial.println("Client disconnected"); //在序列埠監控視窗裡客戶端斷線 } //====== beep() ========== void beep(int x) { for(int i=0;i<x;i++) { tone(BZ,1000);delay(100); noTone(BZ);delay(100); } }