ESP8266 控制 LED
說明
透過此範例
能根據網址的內容來進行開啟或關閉 LED 燈
網頁的部分 可以額外做個表單
來送 GET
請求 以便控制 LED 燈
例如:
http://192.168.1.225/open
開啟 LED 燈
http://192.168.1.225/close
關閉 LED 燈
電路圖
更詳細的接法 可以參考上一篇文章
LED 13 PIN 的部分是直接用 UNO 內建的燈
進行測試的
指令流程
AT+RST
重置 WIFIAT+CWMODE=1
設置 ESP8266 為StationAT+CWJAP="SSID","PASSWORD"
設置 WIFI 帳號密碼AT+CIPMUX=1
開啟多人連線功能AT+CIPSERVER=1,80
開啟 Web Server 並設定 Port 為 80AT+CIPSEND=0,30
傳送資料 並設定資料的大小AT+CIPCLOSE=0
關閉連線
指令執行結果
AT+RST
AT+RST
重置 WIFI
如果執行成功會回傳OK
AT+CWMODE
欲設置 ESP8266 為 Station 的話
要將參數設置為 1
AT+RST
才會成功設置
AT+CWJAP
設置方式如下
SSID
為 WIFI 的名稱
PASSWORD
為 WIFI 的密碼
AT+CWJAP="SSID","PASSWORD"
如果連接成功 回傳OK
連接失敗 回傳 ERROR
AT+CIFSR
連接完畢後 輸入 AT+CIFSR
就可以取得 ESP8266 的 IP 位置
AT+CIPMUX
參數設置為 1 時 啟動多人連線
參數設置為 0 時 啟動單人連線
修改成功 回傳 OK
如果之前已經修改過的話
回傳 Link is builded
AT+CIPSERVER
參數 mode
為 0 關閉 Server 模式
為 1 開啟 Server 模式
這裡 Port 設置為 HTTP Port 80
AT+CIPSERVER=mode,port
客戶端連線
請在瀏覽器上輸入 ESP8266 的 IP 位置
輸入完後
瀏覽器會跟 ESP8266 建立 TCP 的連接
從監控台上可看到 客戶端的連線資訊
這裡解釋一下 +IPD 接收到的數據形式
+IPD,<id>,<len>:<data>
<id>
收到連線的 id 號碼<len>
資料長度<data>
接收到的數據
AT+CIPSEND
在客戶端已經建立 連線的時候
Server 端 要傳送資料 給 Client 端
參數指定 欲傳送的資料長度
AT+CIPSEND=<lenght>
如果傳送成功則回傳 OK
如果失敗的話則回傳 ERROR
AT+CIPCLOSE
發送完資料後要關閉與 Client 的連接
參數設置為
+IPD
後面的 id
號碼
AT+CIPCLOSE=<id>
如果正確的話回傳 OK
失敗的話回傳 ERROR
這裡可以觀察到直到關閉與 Client 的連接
瀏覽器才會顯示 OK
客戶端傳送 GET URL
這邊輸入 http://192.168.0.103/open
來觀察如果網址後面多加 open 字串的話
會得到甚麼結果
可以從監控台那邊觀察到
GET /open
因此我們就可以根據這個字串
來進行控制 LED 的動作了
程式碼
以下程式碼就是針對上述的流程
進行撰寫的
#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
}
One comment
太棒了吧 太強拉
好酷喔|´・ω・)ノ