ESP8266 控制 LED

說明

透過此範例

能根據網址的內容來進行開啟或關閉 LED 燈

網頁的部分 可以額外做個表單

來送 GET 請求 以便控制 LED 燈

例如:

http://192.168.1.225/open 開啟 LED 燈

http://192.168.1.225/close 關閉 LED 燈

電路圖

更詳細的接法 可以參考上一篇文章
LED 13 PIN 的部分是直接用 UNO 內建的燈
進行測試的

電路圖

指令流程

  1. AT+RST 重置 WIFI
  2. AT+CWMODE=1 設置 ESP8266 為Station
  3. AT+CWJAP="SSID","PASSWORD" 設置 WIFI 帳號密碼
  4. AT+CIPMUX=1 開啟多人連線功能
  5. AT+CIPSERVER=1,80 開啟 Web Server 並設定 Port 為 80
  6. AT+CIPSEND=0,30 傳送資料 並設定資料的大小
  7. AT+CIPCLOSE=0 關閉連線

指令執行結果

AT+RST

AT+RST 重置 WIFI

如果執行成功會回傳OK

AT+RST

AT+CWMODE

欲設置 ESP8266 為 Station 的話

要將參數設置為 1

注意:該指令執行前一定要先執行過 AT+RST 才會成功設置

AT+CWMODE

AT+CWJAP

設置方式如下

SSID 為 WIFI 的名稱

PASSWORD 為 WIFI 的密碼

AT+CWJAP="SSID","PASSWORD"

如果連接成功 回傳OK

連接失敗 回傳 ERROR

AT+CWJAP

AT+CIFSR

連接完畢後 輸入 AT+CIFSR

就可以取得 ESP8266 的 IP 位置

AT+CIFSR

AT+CIPMUX

參數設置為 1 時 啟動多人連線

參數設置為 0 時 啟動單人連線

修改成功 回傳 OK

如果之前已經修改過的話

回傳 Link is builded

AT+CIPMUX

AT+CIPSERVER

參數 mode

為 0 關閉 Server 模式

為 1 開啟 Server 模式

這裡 Port 設置為 HTTP Port 80

AT+CIPSERVER=mode,port

AT+CIPSESVER

客戶端連線

請在瀏覽器上輸入 ESP8266 的 IP 位置

輸入完後

瀏覽器會跟 ESP8266 建立 TCP 的連接

從監控台上可看到 客戶端的連線資訊

這裡解釋一下 +IPD 接收到的數據形式

+IPD,<id>,<len>:<data>

  1. <id> 收到連線的 id 號碼
  2. <len> 資料長度
  3. <data> 接收到的數據

Client_Connect

AT+CIPSEND

在客戶端已經建立 連線的時候

Server 端 要傳送資料 給 Client 端

參數指定 欲傳送的資料長度

AT+CIPSEND=<lenght>

如果傳送成功則回傳 OK

如果失敗的話則回傳 ERROR

AT+CIPSEND

AT+CIPCLOSE

AT+CIPCLOSE

發送完資料後要關閉與 Client 的連接

參數設置為

+IPD 後面的 id 號碼

AT+CIPCLOSE=<id>

如果正確的話回傳 OK

失敗的話回傳 ERROR

這裡可以觀察到直到關閉與 Client 的連接

瀏覽器才會顯示 OK

客戶端傳送 GET URL

這邊輸入 http://192.168.0.103/open

來觀察如果網址後面多加 open 字串的話

會得到甚麼結果

可以從監控台那邊觀察到

GET /open

因此我們就可以根據這個字串

來進行控制 LED 的動作了

Client_Url_Request

程式碼

以下程式碼就是針對上述的流程

進行撰寫的

#include <SoftwareSerial.h>
#define _baudrate 115200
#define SSID "WIFI NAME"
#define PASS "WIFI PASSWORD"
SoftwareSerial ESP(4,3); // ESP8266 ESP-01: Tx, Rx

void setup() {
    Serial.begin(_baudrate);
    ESP.begin(_baudrate);
    pinMode(13, OUTPUT); // LED Pin
    ReSet(); // Reset WiFi
    SetAsStation(); // Set WiFi As a Station
    Wifi_Connect(); // Connect to Wifi
    multiple_access(); // open multiple access
    WebServer(); // open web server
}

void loop() {
    if ( Serial.available() ) {
        ESP.write( Serial.read() );
    }
    if ( ESP.available() ) { // receive message from ESP-01
      if ( ESP.find("+IPD,") ) {
            String msg = "";
            byte connID = ESP.read()-48; // client's connection ID
            while( ESP.available() ) { // client's request from the web browser
                msg += (char)ESP.read();
            }
            sendHTML(connID,msg.c_str()); // send HTML message to client

            // Control LED Use url:http://ip_address/open to open LED
            // url:http://ip_address/close to close LED
            
            if(msg.indexOf("GET /open") >= 0)
            {
              digitalWrite(13, HIGH);
              Serial.println("Open LED");
            }
            else if(msg.indexOf("GET /close") >= 0)
            {
              digitalWrite(13, LOW);
              Serial.println("Close LED");
            }
            delay(300);
      }
    }
}

void ReSet(){
  bool state = true;
  sendATcmd("AT+RST\r\n",3000);
  Serial.println("Initialize ESP-01 ...");
  while(state){
      if(ESP.find("OK")){
        Serial.println("Reset ESP8266: OK"); // reset ESP-01
        state = false;
      }
      else{
        sendATcmd("AT+RST\r\n",3000);  
        Serial.println("Reset ESP8266: False");
      }
    }
}


void SetAsStation(){
  bool state = true;
  ESP.println("AT+CWMODE=1"); // Set ESP8266 As Station
  while(state){
      if(ESP.find("OK")){
        Serial.println("Set ESP8266 As Station: OK");
        state = false;
      }
      else{
        ESP.println("AT+CWMODE=1"); 
        Serial.println("Set ESP8266 As Station: False");
        delay(500);
      }
    }
} 

void Wifi_Connect(){
    bool state = true;
    String cmd="AT+CWJAP=\"";
    cmd+=SSID;
    cmd+="\",\"";
    cmd+=PASS;
    cmd+="\"";
    ESP.println(cmd);
    Serial.println("Connecting WiFi");
    for (int timeout=0 ; timeout<20 ; timeout++)
    {
      if(ESP.find("OK"))
      {
        Serial.println("Connect WiFi: OK");
        break;
      }
      else if(timeout==19){
        Serial.println("WiFi Connect fail...");
        Serial.println("WiFi Reconnect..");
        ESP.println(cmd);
        timeout=0; // Reset Timer
      }
      else
      {
        Serial.println("Wifi Loading...");
        delay(500);
      }
    }
}

void multiple_access(){
  bool state = true;
  sendATcmd("AT+CIPMUX=1\r\n",3000);
  while(state){
      if(ESP.find("OK")){
        Serial.println("Open CIPMUX: OK"); // reset ESP-01
        state = false;
      }
      else{
        sendATcmd("AT+CIPMUX=1\r\n",3000); 
        Serial.println("Open CIPMUX: False");
      }
    }
}

void WebServer(){
  bool state = true;
  sendATcmd("AT+CIPSERVER=1,80\r\n",2000); // start server at port:80
  while(state){
      if(ESP.find("OK")){
        Serial.println("Open WebServer: OK"); // reset ESP-01
        Serial.println("\nServer started at port 80 ...");
        state = false;
      }
      else{
        sendATcmd("AT+CIPSERVER=1,80\r\n",2000); // start server at port:80 
        Serial.println("Open WebServer: False");
      }
    }
}


void sendHTML(byte connID,char* msg) {
    char html[256];
    char cipSend[256];
    char cipClose[256];

    sprintf(html,"%s", msg);
    sprintf(cipSend,"AT+CIPSEND=%d,%d\r\n",connID,strlen(html));
    sprintf(cipClose,"AT+CIPCLOSE=%d\r\n",connID);
    sendATcmd(cipSend,1000);
    sendATcmd(html,1000);
    sendATcmd(cipClose,1000);
}

// Sent AT command
void sendATcmd(char* cmd, unsigned int delay) {
    ESP.print( cmd ); // send AT command to ESP-01
    setDelay(delay);
}


void setDelay(unsigned int delay) {
    unsigned long timeout = delay+millis();
    while( millis()<timeout ) {} // NOP
}
Last modification:April 1, 2020
If you think my article is useful to you, please feel free to appreciate