2015年9月26日 星期六

ESP8266 入門學習套件支援 Arduino IDE 開發環境之安裝、使用說明與範例

網頁最後修改時間:2016/01/08
本篇網頁介紹 ESP8266, ESP-01 如何直接使用 Arduni IDE 開發、編譯和上傳程式,捨棄原本需要額外處理 AT 指令的微控制器,只要 ESP8266, ESP-01 自己本身就可以搞定所有事!

在接下來的網頁內容,將會以上面那張照片為例,使用 ESP8266, ESP-01 開啟 mDNS 服務,使用者可以使用網頁 ( http://esp8266.local/, http://[esp8266_ip] ) 或是網址輸入的方式控制二通道光隔離繼電器模組所連接的燈泡開啟或是關閉。

NOTE: 網頁中的操作會修改 ESP8266 現有的韌體,請先看清楚網頁內容之後再操作。一但進行操作,任何風險請自己負責!

-*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//**/-*-
網頁中的程式碼使用賣場中的 "二通道光隔離繼電器模組" 和 "ESP8266 入門學習套件" 測試通過。
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
*********************************************************************************
網頁中所使用的零件可至露天賣場購買:
更多 ESP8266 商品,請至分類賣場
*********************************************************************************
要達到這個目的,必須先完成下面幾個東西:
  • 讓 Arduino IDE 支援 ESP8266 無線網路模組,才能進行開發
  • 撰寫顯示的控制網頁
  • 程式碼撰寫、編譯和上傳至 ESP8266
環境與硬體:
完成之後的實際情形,如下面影片中的操作過程

ESP8266 硬體套件安裝:
ESP8266 屬於第三方開發的晶片,因此要在 Arduino IDE 環境中開發,必須讓 Arduino IDE "認識" 它,方法就是安裝或是手動加入其硬體套件相關的資料與檔案。只要完成該硬體套件的安裝,就可以使用熟悉的 Arduino IDE 語法以及介面進行 ESP8266 晶片的開發。

步驟如下:
  1. 選擇 "File/Preferences",在 "Additional Boards Manager URL: " 欄位輸入
    http://arduino.esp8266.com/package_esp8266com_index.json
    完成後,按下 "OK" 離開。
  2. 選擇 "Tools/Board:/Boards Manager...",畫面出現後要等待連線到伺服器取得相關的資料列表。完成之後在尋找欄中輸入 ESP8266,不一會兒就會出現相關的硬體套件
    Boards Manager, esp8266 硬體套件
    用滑鼠點一下列表,在該項右方就會出現 "Install" 的按鈕 ( 因為我之前已經安裝,所以是顯示 "Remove" 按鈕 ),按下它開始安裝!安裝好之後就可以在 Arduino IDE 中開始撰寫 ESP8266 板子的程式了!
繼電器控制的網頁介面撰寫:
如果只是簡單的網頁,直接使用 HTML 撰寫幾行就可以搞定。但那跟網路上隨手可得的那些範例有什麼不同 ? 但也不是說要寫得多複雜!只不過希望,網頁介面能夠在開關繼電器的時候,可以有圖示清楚的告訴使用者,現在的 ESP8266 GPIO 狀態是處在燈泡開啟還是在關閉的情況 ( 只能得知 GPIO 的狀態,燈泡實際是開啟或是關閉只能由使用者觀察得知。沒辦法!ESP8266 ESP-01 只有開放兩隻接腳 )。

那要怎麼開始呢 ?

首先要先取得兩張圖片,一張是燈泡亮的圖片,另一張是燈泡暗的圖片 ( 或是隨便兩張不同的圖片就可以,大小不拘!WHY ????  [Q1] )。將這兩張照片存放到網路去,這樣才能用網址列存取。

接著開始撰寫網頁畫面,可以使用自己熟悉的撰寫方式,若是不喜歡直接撰寫 HTML 程式,可以使用下面一個所見及所得的免費網頁撰寫軟體 ( BlueGriffon ) ,撰寫顯示與控制繼電器的網頁介面
撰寫顯示與控制的網頁介面
撰寫網頁的時候,主要是要考慮到如何畫面如何讓使用者操作,以及如何讓網頁回傳資料給伺服器 ( 這時把 ESP8266 視為 Web Server 就容易想像 ) 處理。因為,當使用者輸入網址連線到 Web Server 的時候,Web Server 要回傳控制網頁給 Client 端,Client 端的使用者在網頁中操作後傳回資料給 Web Server。

我的想法是:給使用者按鈕,讓他自己選擇要開啟或是關閉哪一個 GPIO。按鈕按下後,WebServer 再回覆相同的網頁,並且根據現在 GPIO 的狀態顯示不一樣的燈泡開關圖示再按鈕上面。

一但設計好顯示網頁之後,將"原始碼模式"複製裡面所有的程式碼,複製/貼上到記事本 ( 或是其他文字編輯器 ) 。等一下要將這些程式碼簡化、優化和修改,不然是無法直接使用的。
<!DOCTYPE html>
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type">
    <title>ESP8266 ESP-01 Arduino IDE Dev.</title>
  </head>
  <body>
    <h1 style="text-align: center;">2-way relay control page<br>
      <span style="font-size: xx-small; font-weight: normal; text-align: start;">
        <i><span style="font-size: x-small;">created by ruten.proteus</span></i></span></h1>
    <br>
    <div style="text-align: center;"> <img alt="Switch OFF" src="http://bit.ly/1WigGPz"
        style="height: 150px;"><br>
      <b><i><u>GPIO0</u></i></b>&nbsp;&nbsp; <a href="/gpio01"><button>Turn
          ON</button></a>&nbsp;&nbsp;&nbsp; <a href="/gpio00"><button>Turn
          OFF</button></a>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <br> <br>
      <img alt="Switch ON" src="http://bit.ly/1L5FRD9" style="height: 150px;"><br>
      <b><i><u>GPIO2</u></i></b>&nbsp;&nbsp; <a href="/gpio21"><button>Turn
          ON</button></a>&nbsp;&nbsp;&nbsp; <a href="/gpio20"><button>Turn
          OFF</button></a>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      </div>
  </body>
</html>
有那些東西需要修改呢 ?

修改之前,先來說明一下修改之後的 HTML 程式碼怎麼被使用:當使用者在瀏覽器 ( Client 端 ) 輸入 ESP8266 WebServer 的網址,ESP8266 會根據不同的網址輸入啟動不同的副程式;主要是設定 GPIO 開或關的狀態,然後將圖示的網址更新到 HTML 程式碼裡面再回應給 Client 端,完成動作。

首先一開始,必須要將 HTML 程式碼中一不必要的 Tag 和參數設定去除掉,盡量減少字元數目,減少程式處理的複雜性以及增加回應的速度。

移除與簡化的重點:要著重在 WebServer 回應 Client 端需求時有哪些參數會被修改,以及那些參數會由函式送出而不用撰寫的,都可以先被移除。

例如,
  • <meta> 裡面的 contet 就可以由 ESP8266WebServer.send() 函式送出,所以可以移除
  • <img> 裡面的 href 所指定的網址,必須根據使用者設定且確認狀態之後來設定不同圖示網址,因此這個地方必須設定為 %s
  • 參數中的 " 都要修改為 \"
  • ...
最後,轉換成字串格式。每一行都要移動到最前面,並且要在每一行的後面加上 \ ( 沒錯!就是 \,用來連接字串中的每一行),記得第一行前端與最後一行末端都要加上 " 形成字串。
"<html>\
<head>\
<meta http-equiv=\"content-type\">\
<title>ESP8266 ESP-01 Arduino IDE Dev.</title>\
</head>\
<body>\
<h1 style=\"text-align: center;\">2-way relay control page<br />\
<span style=\"font-size: xx-small; font-weight: normal; text-align: start;\">\
<i><span style=\"font-size: x-small;\">created by ruten.proteus</span></i></span></h1><br />\
<div style=\"text-align: center;\">\
<img alt=\"Switch OFF\" src=%s style=\"height: 150px;\" /><br />\
<b><i><u>GPIO0</u></i></b>&nbsp;&nbsp;\
<a href=\"/gpio01\"><button>Turn ON</button></a>&nbsp;&nbsp;&nbsp;\
<a href=\"/gpio00\"><button>Turn OFF</button></a>\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\
<br /><br />\
<img alt=\"Switch ON\" src=%s style=\"height: 150px;\" /><br />\
<b><i><u>GPIO2</u></i></b>&nbsp;&nbsp;\
<a href=\"/gpio21\"><button>Turn ON</button></a>&nbsp;&nbsp;&nbsp;\
<a href=\"/gpio20\"><button>Turn OFF</button></a>\
</div></body></html>"
完成的 HTML 字串就如上面所示,雖然可以將字串輸入到 Arduino IDE 的 Sketch 中,但是經過測試,編譯時會出現 java 錯誤的訊息,而且是非常惱人錯誤!雖然 Arduino 的 issue 說了這問題已經在新版本 IDE 解決了,但是還是編譯不過去。

最後採用下面方式試著解決:
  • 以由後向前的方式將字串剪下,然後進行編譯。如果編譯成功,再將字串貼回去再剪下一小段重新編譯,直到出現編譯失敗。這樣的方式可以讓程式先找出字串上的語法錯誤,還有哪裡會開始出現字串太長無法解析的錯誤。
  • 確認字串格式都沒問題而是太長的關係之後,開始縮減字串長度。哪一段程式碼是好的選擇呢 ? 我的選擇是按鈕前後的 <a><button>...</button></a>,這代表使用者按下之後的動作,若是之後要做修改,可以不必要改 HTML 字串,而是由程式前面的字串參數直接來改會比較容易。
所以最後結果就是如下面所示
"<html>\
<head>\
<meta http-equiv=\"content-type\">\
<title>ESP8266 ESP-01 Arduino IDE Dev.</title>\
</head><body>\
<h1 style=\"text-align: center;\">2-way relay control page<br />\
<span style=\"font-size: xx-small; font-weight: normal; text-align: start;\">\
<i><span style=\"font-size: x-small;\">created by ruten.proteus</span></i></span></h1><br />\
<div style=\"text-align: center;\">\
<img alt=\"Switch OFF\" src=\"https:%c%c%s\" style=\"height: 150px;\" /><br />\
<b><i><u>GPIO0</u></i></b>&nbsp;&nbsp;\
%s&nbsp;&nbsp;&nbsp;%s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\
<br /><br />\
<img alt=\"Switch ON\" src=\"https:%c%c%s\" style=\"height: 150px;\" /><br />\
<b><i><u>GPIO2</u></i></b>&nbsp;&nbsp;\
%s&nbsp;&nbsp;&nbsp;%s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\
</div></body></html>"
不管之後使用者選擇以何種方式來解決字串過長的問題,上面只是提供了眾多方法的一種,只要能夠編譯通過上傳到 ESP8266 後正常動作,都是好方法!

電路圖:

ESP8266, ESP-01 與兩通道光隔離繼電器的接線圖
*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
各部分實際接線
實際接線 - 01
實際接線 - 02
實際接線 - 03

程式碼編譯、上傳與測試:
打開一個新的 Sketch,儲存名稱為 twoWayRelay

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 程式碼 - 01 / 04, 標頭
修改下面關於路由器的資料 ( ssid password );設定 WebServer 連線的 port 為 80,port 可以自行設定
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#define GPIO0 0
#define GPIO2 2
#define OFF   HIGH
#define ON    LOW

const char* ssid     = "路由器名稱";
const char* password = "路由器連線密碼";

MDNSResponder mdns;

// Create an instance of the server
// specify the port to listen on as an argument
ESP8266WebServer server(80);


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 程式碼 - 02 / 04, setup()
設定與 ESP8266 通訊的速度為 115200;使用 ssid password 與路由器建立無線網路連線,程式會一直等待連線成功再輸出路由器分配的 localIP,否則就輸出 .;無線網路連線建立之後,初始化 ESP8266WebServer,再開啟 mDNS 建立一個名為 esp8266 的 WebServer,之後就可以讓同在一個區域網路的網路裝置 "esp8266.local"連線至 WebServer ( 必須裝置支援 mDNS,不然就必須使用 localIP 所取得的 IP 位址連線至 WebServer )。

最後,根據不同的連結位址,設定相對應的 WebServer 回應處理方式。
void setup() {
  Serial.begin(115200);
  delay(10);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());

  // set up mDNS responder:
  if( mdns.begin("esp8266", WiFi.localIP() ) )  // http://esp8266.local/
  {
    Serial.println( "MDNS responder started" );
  }

  server.on( "/", webroot );  // http://esp8266local/
  server.on( "/gpio00", [] {  // GPIO0 OFF, http://esp8266.local/gpio00
    digitalWrite( GPIO0, OFF );
    webroot();
  });
  server.on( "/gpio01", [] {  // GPIO0 ON,  http://esp8266.local/gpio01
    digitalWrite( GPIO0, ON );
    webroot();
  });
  server.on( "/gpio20", [] {  // GPIO2 OFF, http://esp8266.local/gpio20
    digitalWrite( GPIO2, OFF );
    webroot();
  });
  server.on( "/gpio21", [] {  // GPIO2 ON, http://esp8266.local/gpio21
    digitalWrite( GPIO2, ON );
    webroot();
  });

  // GPIO init
  pinMode( GPIO0, OUTPUT );
  pinMode( GPIO2, OUTPUT );
  digitalWrite( GPIO0, OFF );
  digitalWrite( GPIO2, OFF );

  Serial.println( "HTTP Server Started" );
}


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 程式碼 - 03 / 04, webroot()
webroot() 函式前方字串定義是用來取代 HTML 字串中的某些位置,也是為了縮短字串;為了能夠讓輸出的 HTML 字串能夠根據 GPIO 的狀態更換圖示,先宣告一個可容納很多字的字元陣列,利用 snprintf 函式組合成最後要輸出回應的 HTML 格式的字串;這個字串利用 ESP8266WebServer send() 函式送出,其中的引數:以 200 表示網頁伺服器 OK ( HTTP 狀態碼 );"text/html;charset=UTF-8" 表示 content type;temp 就是要輸出給 Client 端的 HTML 程式碼。
// Lamp ON 照片位址
const char* lampON  = "bit.ly/1L5FRD9";
// Lamp OFF 照片位址
const char* lampOFF = "bit.ly/1WigGPz";
// GPIO 按鈕字串
const char* strGpio01 = "<a href=\"/gpio01\"><button>Turn ON</button></a>";
const char* strGpio00 = "<a href=\"/gpio00\"><button>Turn OFF</button></a>";
const char* strGpio21 = "<a href=\"/gpio21\"><button>Turn ON</button></a>";
const char* strGpio20 = "<a href=\"/gpio20\"><button>Turn OFF</button></a>";

void webroot()
{
  // print GPIO setting page
  char temp[2048];

  snprintf( temp, 2048,
"<html>\
<head>\
<meta http-equiv=\"content-type\">\
<title>ESP8266 ESP-01 Arduino IDE Dev.</title>\
</head><body>\
<h1 style=\"text-align: center;\">2-way relay control page<br />\
<span style=\"font-size: xx-small; font-weight: normal; text-align: start;\">\
<i><span style=\"font-size: x-small;\">created by ruten.proteus</span></i></span></h1><br />\
<div style=\"text-align: center;\">\
<img alt=\"Switch OFF\" src=\"https:%c%c%s\" style=\"height: 150px;\" /><br />\
<b><i><u>GPIO0</u></i></b>:&nbsp;&nbsp;\
%s&nbsp;&nbsp;&nbsp;%s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\
<br /><br />\
<img alt=\"Switch ON\" src=\"https:%c%c%s\" style=\"height: 150px;\" /><br />\
<b><i><u>GPIO2</u></i></b>:&nbsp;&nbsp;\
%s&nbsp;&nbsp;&nbsp;%s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\
</div></body></html>",
      0x2f, 0x2f,
      ((digitalRead( GPIO0 ))?lampOFF:lampON),  // to choice gpio00 icon
      strGpio01, strGpio00,
      0x2f, 0x2f,
      ((digitalRead( GPIO2 ))?lampOFF:lampON),   // to choice gpio02 icon
      strGpio21, strGpio20
    );
  
  server.send( 200, "text/html;charset=UTF-8", temp );
}


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 程式碼 - 04 / 04, loop()
mDNS 狀態與 Client 端的需求處理。
void loop() {
  mdns.update();
  server.handleClient();
}


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 韌體上傳參數設定
原始未經過修改的 "Generic ESP8266 Module" 韌體上傳參數
要上傳編譯之後的程式,必須先根據自己所使用的 ESP8266, ESP-## ( ## 代表是哪一個 ESP8266 電路板型號 ),在 "Tools" 選單中選擇對應的參數,其中比較舉足輕重的參數為下面這三個
  • "Flash Mode:"
  • "Flash Frequency:"
  • "Flash Size:"
其他的就是跟速度有關係,維持現狀就好!
那麼怎麼取得這三個參數呢 ?
最簡單的方式就是使用 AT 指令 ( AT+RST )!但這只能使用一次,一但上傳 Arduino IDE 編譯的韌體之後就沒辦法再用了,所以只能用一次!
其他的方法:問賣的人或是製造商最快!

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* ESP8266, ESP-01 韌體燒錄電路圖
燒錄之前,請先完成下面的接線。上傳之完成之後,先關閉電源,再拔掉連接到 GPIO0 的 GND 線,重新開啟電源之後就可以開始程式的測試。
ESP8266, ESP-01 韌體燒錄接線圖
ESP8266, ESP-01 接腳示意圖
ESP8266, ESP-01 韌體燒錄實際接線示意圖

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 韌體上傳
首先,請先按 "Compile" 按鈕確認編譯完全沒有錯誤之後,再按下 "Upload" 上傳編譯之後的韌體,完成之後的輸出畫面如下所示
編譯、上傳之後的 Arduino IDE 輸出畫面
結論:
一般小型應用上,體積通常是考慮的重點。尤其若是加上需要無線或是網路的功能時,就需要額外的晶片支持。由於 ESP8266 具備無線網路的功能,當與 Arduino IDE 做結合時,除了原本的無線網路功能之外,若是所需要的 GPIO 不多的情況之下,"ESP8266 入門學習套件" 就能在不需要其他額外微控制器的情況之下,自己完成所有的事情。

若需求的 GPIO 較多,且需要加入其他外掛模組的情況下,則"ESP8266 Arduino IDE 開發板"不但可以相容既有的 Arduino Shield,而且開發方式跟既有的 Arduino 板子一樣,只需要一條 MicroUSB 線就可以很容易的撰寫與上傳程式到開發板中。

總之,若應用上需要用到無線網路功能,在快速開發且時間限制的情況下,可以嘗試一下使用 ESP8266 配合在現有的應用中,相信是個不錯的選擇!

<< 相關網頁與連結 >>

29 則留言:

  1. 哈囉 請問一下 有用 WEB 端 幫 ESP8266 設定帳號密碼的部分教學嗎!!? THX

    回覆刪除
  2. 板主請問一下,要esp8266.local有動作,還要有什麼設備嗎?輸入IP位址可正常動作,但輸入esp8266.local卻找不到網頁!!

    回覆刪除
    回覆
    1. windows 有些不支援 mDNS,用手機試試!
      另外,看一下這篇網頁的說明,安裝 iTune 或許可以解決。
      http://blog.binkery.com/computer/mdns.html

      刪除
    2. 想用來遙控鐵捲門,但一開機relay都會動一下,造成誤動作,請問要如何解決??

      刪除
    3. 繼電器模組是低態動作,加個 10K 電阻到 3V3 與 GPIO 之間試試!

      .................3V3
      ..................|
      ..................|
      ..................\
      ................../ 10K
      ..................\
      ..................|
      [ESP-01, GPIO] ___|____ [relay IN]

      刪除
    4. 有點疑問,3v3通過10k是為了維持high嗎?那這樣gpio on的時候也是輸出3.3v?那active low是怎判斷的呢?

      刪除
    5. 1.) 是讓 [relay IN]維持 HIGH
      2.) 對。不過這是因為要消除 ESP8266 開機瞬間準位是 LOW 的問題造成 relay 會有切換的情況產生。
      3.) 依靠邏輯準位。

      刪除
    6. 可能我表達不好,我的疑問是外接的電路可以讓relay不動作,但是為啥gpio在output low的時候可以讓relay動作,外接電路不是還在嗎?因為當開機的時候gpio也是在low的狀態下,我有點不太懂

      刪除
    7. 當 ESP8266 IO = LOW,則另外一邊的 REALY IO = ESP8266 IO = LOW,因為這時候的電壓是接腳對地的電壓,所以是 LOW。
      如果還是不懂,就實際接個電路用電表量一下就清楚了。

      刪除
    8. 我這提升電阻的主要目的是relay模組是5v供電,esp01是3.3v供電,Esp的Hi僅3.3v在啓始狀態時,3.3v的輸出易造成relay的誤動作。

      刪除
    9. 這款 relay 模組可以使用外接電源輸入,也就是訊號輸入與繼電器驅動的電源可以分開,因此訊號輸入可以改用 3.3V 做電源輸入,而繼電器驅動使用 5V。

      刪除
    10. 把跳線拿開改接3.3v對吧,esp output low的時候是等於接地嗎?是真的接地嗎?如果我relay input改用一顆2n7000來當開關最接地,gate 接gpio 這樣會比較好嗎?本來想用2n2222不過限流20ma算出13k電阻感覺跟網路講的都差距太大

      刪除
    11. 網頁中的電路在一開電的瞬間是會讓繼電器跳動一下,這是因為繼電器是低準態動作導致。解決的方法為什麼會接 3V3 而不是 5V,是因為(1) 不會弄死 ESP-01 (2) ESP-01 雖然是 3V3,但是高、低準態的輸出電壓還是在可以開、關光隔離的範圍之內(這個可以去看光隔離的資料手冊)進而驅動繼電器 (即便繼電器都是使用 5V );重點是ESP-01 是輸出不是當作輸入,若是當作輸入就不可以使用大於 5V 的電壓。

      繼電器前方有一個 3-pin 的地方,上面有 jumper,拿掉之後就可以將前方光隔離與繼電器驅動隔開。前方光隔離可以使用 3.3V 驅動,這樣就跟 esp8266 用的電一樣;後方繼電器的部分就接 5V。不需要接電晶體。


      另外問一下:使用 2015/2/5 給的提升電路沒有用嗎?

      刪除
    12. 單純想討論一下,因為在國外看到類似的八通道板子,他們卻接2n2222,敢到奇怪想仔細研究一下內容,所以雖然esp是output但是low的狀態是有接地的?如果有接地我的疑惑就解開了,但是如果是進esp那不知道多少電流esp會掛掉

      刪除
    13. 在gpio02有用,但gpio00仍然會有誤動作,但時間較短。

      刪除
    14. 應該是驅動繼電器的方法吧 ! 使用光隔離的繼電器模組,前面的光隔離晶片內部就包含一顆LED 與光電晶體(詳細可以看資料手冊或是上網 Google 一下),前面邏輯部分與後面繼電器驅動是區隔開的。
      若是不用光隔離的繼電器模組,大部分直接使用電晶體驅動,應該就是你說的那樣。

      ESP8266EX 晶片的資料查到的耐電流分 source 與 sink
      1.) 12mA here refers to the source current and sink current is greater than 12mA.
      2.) 12mA is for per pin and each pin is the same.
      3.) Drive capacity current of all GPIO pins total can be 16 x 12 mA

      刪除
    15. 謝謝您對於我問題的回覆 ! 我照了一下資料,發現您所說的情況應該是這網頁所說的:

      https://zoetrope.io/tech-blog/esp8266-bootloader-modes-and-gpio-state-startup
      -----/*-/*-/*-/*-/*-/*-
      開機經過 40ms 後,GPIO0 會有 100ms 進行 350HZ 頻率的震盪,所以至少避開在開機之後 200ms 後再去使用 GPIO0

      "Here’s what we found: 40ms after startup, the GPIO0 line is driven with a signal at around 350 Hz for around 100 ms. So make sure you don’t rely on GPIO0 being stable for the first ~200 ms after startup."
      ------/*-/*-/*-/*-/*-/-
      但 GPIO2 沒有這情況。

      刪除
    16. 感謝各位經驗的分享,小弟學到很多,謝謝

      刪除
  3. 您好 我的IDE是1.6.6版 為何依樣輸入http://arduino.esp8266.com/package_esp8266com_index.json後,Boards Manager卻顯示unmatched brace in the patten 很困擾我,麻煩您幫忙了,謝謝

    回覆刪除
    回覆
    1. 剛使用 Arduino IDE 1.6.5-r5 做測試沒有問題!
      使用與網頁不同版本的軟體,出現問題請使用跟網頁相同本的軟體試試。

      ESP8266 與 Arduino IDE 也些版本相同性有問題,建議您若是要用比網頁更新版的版本要用 arduino-nightly-build,才不會有問題!

      刪除
  4. 你可使用 server.arg("XXX"),讀出 FORM的ELEMENT值,
    用 server.method()判斷METHOD 是GET 1或POST 2,
    我都用亂數產生一個4位數字輸出到畫面,再經簡單運算產生一個6位數字當密碼來遙控鐵捲門.
    ESP8266的random固定產生亂數,如要真正的亂數在void setup中,多一行randomSeed(ESP.getCycleCount());
    就可以了.

    回覆刪除
  5. 最後我在RELAY IN的地方接上拉電阻10K到5V,再接一個5K到ESP-01的GPIO,就可以了,謝謝

    回覆刪除
  6. 請問為什麼用ArduinoIDE燒錄程式後就不能使用AT指令了? 那麼之後要怎樣才能繼續使用?

    回覆刪除
    回覆
    1. 網頁開頭就有說過會改變原有的韌體!
      要用 AT 指令,再重新燒錄就可以! 如果是跟賣場買的,雲端資料夾裡面有!

      刪除
  7. 你好, 請問你有在 ESP8266 上使用 Arduino IDE 開發時 , 將資料寫入 EEPROM 嗎?
    我測試相關CODE如下 在 NANO 上是正常的 , 但是在 ESP8266上 會出錯無法正常顯示資料, 但可以顯示讀取的資料長度, 想請問您是ESP8266的先天限制? 還是? 謝謝

    =========================

    #include
    #include "eeprom_anything.h"

    // 自行定義struct,放入你想讀取的資料
    struct dataType{
    char name[10];
    int age;
    char gender;
    float money;
    float bank;
    };

    void setup(){
    Serial.begin(9600);

    dataType d; // 宣告結構變數,放入資料
    strcpy(d.name, "Arduino");
    d.age = 9;
    d.gender = 'M';
    d.money = 9876.54;
    d.bank = 1234.56;
    Serial.print("name: ");
    Serial.println(d.name);
    Serial.print("age: ");
    Serial.println(d.age);
    Serial.print("gender: ");
    Serial.println(d.gender);
    Serial.print("money: ");
    Serial.println(d.money);
    Serial.print("bank: ");
    Serial.println(d.bank);

    // 寫入EEPROM,回傳值count代表總共寫入幾個byte
    int count = EEPROM_writeAnything(0, d);

    Serial.print(count);
    Serial.println(" bytes written.");
    Serial.println("---------------");



    }
    void loop(){
    // 讀取EEPROM,回傳值count代表總共寫入幾個byte

    dataType d;
    int count = EEPROM_readAnything(0, d);

    Serial.print("name: ");
    Serial.println(d.name);
    Serial.print("age: ");
    Serial.println(d.age);
    Serial.print("gender: ");
    Serial.println(d.gender);
    Serial.print("money: ");
    Serial.println(d.money);
    Serial.print("bank: ");
    Serial.println(d.bank);
    Serial.print(count);
    Serial.println(" bytes read.");
    }



    回覆刪除
    回覆
    1. 除非是使用 ESP8266 自帶的 EEPROM 函式庫,或是尤其沿生出來的函式庫,不然是不能用的 !
      使用的方法跟 Nano 板子的 EEPROM 相同,結構可使用 put 或是 get 來寫入與讀出,可以參考下面從網路節錄下來的說明
      -----------------------------------------------
      https://github.com/esp8266/Arduino/issues/1539
      -----------------------------------------------

      刪除
    2. 謝謝您的回覆,我稍後試試看

      刪除

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !