ESP8266獨立運作

ESP8266屬於SoC,內建一個32位元的處理器,比Arduino(8位元)的執行效能好上不少,
這邊實作,不透過Arduino,讓ESP8266來獨立運作。值得注意的是,ESP8266是屬於3.3V下工作的模組,
對於某些5V的感測器,液晶顯示,需要透過位準轉換模組,避免ESP8266不穩定。
優點是,佈線簡單,網路連線較Arduino+ESP8266穩定不少
缺點是,ESP8266對於感測器的支援度沒有Arduino那麼廣
請考量使用場合再選擇搭配方式。
想要把寫好的程式碼刷入ESP8266內,如同更新AT韌體一樣
主要有兩種接法:
1.透過USB UART轉接器(CP2102、PL2303系列、CH340G)
網友們分享,直接透過轉接器上的3.3V電源,有上傳失敗的疑慮,(供電電流不足所致)
建議3.3V電源用麵包板電源模組搭配18650兩顆串聯(8.4~7.4V)降壓至3.3V,另外,轉接器與麵包板的GND要接一起共地,否則也會上傳失敗。

2.把Arduino UNO上的晶片 ATMEGA328P-PU 挖起來,再上傳

但是說真的,晶片拆拆拔拔的對針腳也不是很好,
還是乖乖去買一個USB UART轉換就好

[刷程式流程]
1.先到Arduino IDE 的 檔案-->偏好設定-->額外的開發板管理員 輸入以下網址
http://arduino.esp8266.com/stable/package_esp8266com_index.json





2.點選工具-->開發板管理員

3.找到esp8266並安裝

4.上傳前選 Generic ESP8266 Module



ESP8266 WiFi 函式庫的函式列表:

 函式  模式選項 模式解說
 WiFi.mode(mode) 設定WiFi操作模式(1) WiFi_OFF
(2) WiFi_STA
(3) WiFi_AP
(4) WiFi_AP_STA
 關閉WiFi
STA模式
AP模式
STA+AP模式
 WiFi.begin(SSID,Password) 把ESP8266連入AP  
 WiFi.config(IP,Gateway,子網路遮罩) 連入靜態IP  
 WiFi.status() 查詢聯網狀態  回傳WL_CONNECTED(3)表已連上WiFi AP
 WiFi.localIP() 查詢IP  
 WiFi.macAddress() 查詢MAC實體位址  
 WiFi.RSSI() 查詢訊號強度  
 WiFi.printDiag(序列埠) 向序列埠輸出網路資訊  
 WiFi.disconnect() 中斷連線  




最基本的程式碼,如同下方紫色字體部分
此程式碼使ESP8266連上家用Wifi AP ,不具伺服器的功能

#include <ESP8266WiFi.h>
void setup() {
  Serial.begin(115200);
  WiFi.begin("WiFi網路SSID", "密碼");

  /*
   *  若要指定IP位址,請自行在此加入WiFi.config()敘述。
   WiFi.config(IPAddress(192,168,1,50),    // IP位址
               IPAddress(192,168,1,1),     // 閘道(gateway)位址
               IPAddress(255,255,255,0));  // 網路遮罩(netmask)
   */

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("");
  Serial.println("IP address: ");
  Serial.print(WiFi.localIP());
  Serial.println("WiFi status:");
  WiFi.printDiag(Serial);
}
void loop() {
}



連上AP之後,我們可以架設網站伺服器
以下的程式碼中可以觀察出來,
server.on( );  這個函式處理伺服器的網頁,例如根目錄  /  或  /index.html
語法格式是  server.on("目錄",指定運作的自訂函數);  
也就是說,每個伺服器網頁的頁面都要指定一個自訂函數,(ps.伺服器可以設定數個網頁)
像根目錄 /  指定運作 rootRouter();  這個自訂函數(ps.自訂函數名稱可以自己更改)
而rootRouter(); 中,再用server.send(代碼 , "網頁形式" , "html語法"); 這個函示送出html網頁
我們可以把我們想要寫的 html,透過字串的方式放進這個函式裡面。

#include <ESP8266WiFi.h>      // 提供Wi-Fi功能的程式庫
#include <ESP8266WebServer.h>  // 提供網站伺服器功能的程式庫

const char ssid[] = "你的WiFi網路SSID";
const char pass[] = "你的WiFi密碼";

ESP8266WebServer server(80);   // 宣告網站伺服器物件與埠號

// 定義處理首頁請求的自訂函式
void rootRouter() {
  server.send(200, "text/html", "Hello from <b>ESP8266</b>!");   //網頁的html 在此(紅色字體可做修改)
}

void setup() {
  Serial.begin(115200);  
  WiFi.begin(ssid, pass);
  /*
   *  若要指定IP位址,請自行在此加入WiFi.config()敘述。
   WiFi.config(IPAddress(192,168,1,50),    // IP位址
               IPAddress(192,168,1,1),     // 閘道(gateway)位址
               IPAddress(255,255,255,0));  // 網路遮罩(netmask)
   */

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);   // 等待WiFi連線
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected, IP: ");
  Serial.println(WiFi.localIP());  // 顯示ESP8266裝置的IP位址

  server.on("/index.html", rootRouter);  // 處理首頁連結請求的事件
  server.on("/", rootRouter);
  
  server.onNotFound([](){   // 處理「找不到指定路徑」的事件
    server.send(404, "text/plain", "File NOT found!");
  });
  
  server.begin();
  Serial.println("HTTP server started.");
}

void loop() {
    server.handleClient();  // 處理用戶連線
}




上面的實作,伺服器回應一個最簡單的網頁
網站伺服器可以有幾種功能:
1.使用者連線請求遠端伺服器回傳資料(最簡易的伺服器)
   PS.「連上伺服器」這個操作本身就是請伺服器回應資料,
  例如連接上http://tw.yahoo.com  就是請yahoo伺服器傳回首頁的頁面資料,
  上述簡易伺服器頁面則是相同的功能。
  ESP8266 或 Arduino 此時可當作簡易型電腦(伺服器)
  當使用者連線至ESP8266時,可以回傳某個我們設定好的頁面。
  在這個頁面裡面,我們可以顯示感測器(例如溫濕度計、PM2.5感測器)的即時監測數值
  詳見1.溫濕度站  
  也可以加上超連結,但是ESP8266也好、Arduino也好執行效能不高,不太適合在頁面上放太多資料

2.使用者連上伺服器的動作頁面(GET法),伺服器回應一些動作


3.使用者連上伺服器的操作頁面,伺服器回應一些動作(POST法)