燒錄與執行ESP8266 AT指令韌體/固件(二):連結與上傳資料到ThingSpeak網站

ESP8266系列模組被製成多種型式的控制板,以及Arduino相容擴展板。本文將以一款ESP8266 Wi-Fi網路擴展板,說明用AT指令連接並上傳資料到ThingSpeak雲端平台的方法。同樣的接線和程式,也適用在其他ESP8266模組加Arduino UNO的組合。

認識ESP8266 序列埠(串口)WiFi擴展板

下圖是一款採用ESP8266(ESP-12E模組)的Arduino Wi-Fi無線區域網路擴展板,商品標題是「ESP8266串口WiFi擴展板」:

ESP8266 序列埠(串口)WiFi擴展板

這個板子上面有3.3V直流穩壓電路,ESP8266模組的I/O腳也都有引出,透過運作模式切換開關,可設置讓ESP8266獨立運作,或者與Arduino的UART序列埠相連:

運作模式切換開關

這塊板子沒有內建USB序列轉TTL晶片,所以燒錄韌體時,需要外接USB轉TTL傳輸線(也可經由Arduino UNO板上的USB序列晶片燒錄):

外接USB轉TTL傳輸線燒錄ESP8266韌體

燒錄ESP8266韌體的軟體工具和步驟,請參閱上一篇貼文的「使用Flash下載工具燒錄ESP8266韌體」一節。燒錄完畢後,請關閉開關(切下)3和4。

使用1N4148二極體串接ESP8266和Arduino UNO

跟上一篇文章介紹的「UNO+WiFi R3板」一樣,透過開關即可讓擴展板的ESP8266與Arduino相連。可是,它們都是連接到UART埠,而Arduino的UART埠通常被保留用來跟電腦的USB通訊。所以筆者將擴展板設置成「各自獨立運作」模式,ESP8266模組的序列通訊腳,則與Arduino的數位2和3相連。

使用1N4148二極體串接ESP8266和Arduino UNO

Arduino UNO透過SoftwareSerial程式庫,將數位2和3腳模擬成UART序列埠。由於Arduino的數位輸出高電位是5V,為了避免損壞ESP8266,Arduino的TX和ESP8266的RX之間用一個1N4148二極體串連:

Arduino的TX和ESP8266的RX之間用一個1N4148二極體串連

在ESP8266模組通電的情況下,若採三用電錶測量它的RX腳和接地的電壓,將能測得約3.3V。也就是說,RX接腳內部有個上拉電阻。只要像上圖一樣串接二極體,Arduino就能順利地傳達高、低電位訊號給ESP8266。

上一篇文章的「UNO+WiFi R3板」和其他ESP8266控制板(如:NodeMCU和WEMOS D1 mini),也能使用相同的方式串接Arduino UNO。

修改AT指令韌體的UART傳輸速率(鮑率)

安信可1.5.4.1版AT韌體的預設UART鮑率是115200bps,此速率也是SoftwareSerial(軟體序列埠)的上限,為了避免傳輸過程發生資料錯誤,建議調降此速率。修改UART傳輸率並保存在快閃記憶體的指令是AT+UART_DEF,筆者將此速率設置成19200:

AT+UART_DEF指令

設置完畢後,序列埠監控視窗傳輸率選單也要改成19200:

調整傳輸速率

連接Wi-Fi路由器的AT指令

連接Wi-Fi路由器並存入快閃記憶體的AT指令是AT+CWJAP_DEF,設定網路連線之前,請先執行AT+CWMODE_DEF指令,把ESP8266的網路模式設定成「無線接入點+無線終端」:

連接Wi-Fi路由器的AT指令

輸入Wi-Fi連線指令後,它將回應WIFI CONNECTED和WIFI GOT IP訊息,代表連線成功。

使用AT指令連接並傳遞資料到ThingSpeak雲端平台

參考安信可官方的AT指令文件,以及「ESP8266使用AT指令開發示範」文件的「HTTP通訊示範」說明,讓ESP8266扮演HTTP前端,連接ThingSpeak網站的AT指令流程如下:

使用AT指令連接並傳遞資料到ThingSpeak雲端平台

向ESP8266發送AT指令之後,若執行無誤,它都會回覆OK。官方技術文件有提到,每次執行AT+CIPSEND指令傳送訊息完畢,發送”+++”退出透傳時,請至少間隔1秒再發送下一個AT指令

關於ThingSpeak雲端平台的介紹,請參閱「MQTT教學(八):使用MQTTlens上傳資料到ThingSpeak的MQTT伺服器」。

從Arduino發出AT指令指揮ESP8266傳遞資料到ThingSpeak

綜合上文說明,Arduino每隔20秒,發出AT指令指揮ESP8266傳遞資料到ThingSpeak平台的程式如下,筆者假設每次都發送溫度21、相對濕度34%的值,你可以自行加上DHT11或其他感測器並傳送真實數據。

如果你使用的控制板是上一篇提到的UNO+WiFi R3板,請先把板子上的「運作模式切換開關」調整到「序列介面接ATMEGA328」模式,再上傳程式碼:

#include <SoftwareSerial.h>

SoftwareSerial ESP (3, 2);  // RX, TX

const int IDLE_TIME = 20000;    // 發送數據間隔時間:20秒
String HOST = "api.thingspeak.com";
String Write_Key = "你的Write API key";
unsigned long lastTimeMillis = 0;

// 傳送溫濕度資料到ThingSpeak
void sendData(int temp, int humid) {
  String httpMsg = "GET /update?api_key=" + Write_Key + "&field1=" + temp + "&field2=" + humid + " HTTP/1.1\r\n";
  httpMsg += "Host: " + HOST + "\r\n";
  httpMsg += "User-Agent: ESP8266\r\n\r\n";

  ESP.println("AT+CIPSTART=\"TCP\",\"" + HOST + "\",80");
  delay(500);  // 等待OK回應
  ESP.println("AT+CIPMODE=1");  // 透傳
  delay(500);
  ESP.println("AT+CIPSEND");    // 啟動發送
  delay(1000);
  ESP.println(httpMsg);  // 發送HTTP訊息
  ESP.print("+++");  // 退出透傳
}

void setup() {
  Serial.begin(19200);
  ESP.begin(19200);
  Serial.println("ESP8266 Ready!");
}

void loop() {
  if (millis() - lastTimeMillis > IDLE_TIME) {
    lastTimeMillis = millis();

    sendData(21, 34);   // 傳送溫濕度
  }

  // 接收、顯示ThingSpeak的回應
  while (ESP.available()) {
    char c = ESP.read();
    Serial.print(c);
  }
}

上傳程式碼之後,開啟序列埠監控視窗,每過20秒,將能看到ThingSpeak傳回的HTTP訊息。

序列埠監控視窗

Posts created 470

14 thoughts on “燒錄與執行ESP8266 AT指令韌體/固件(二):連結與上傳資料到ThingSpeak網站

    1. 圖沒有錯,我所說的話反了是跟下面說明的文字:

      在ESP8266模組通電的情況下,若採三用電錶測量它的RX腳和接地的電壓,將能測得約3.3V。也就是說,RX接腳內部有個上拉電阻。只要像上圖一樣串接二極體,Arduino就能順利地傳達高、低電位訊號給ESP8266。(最後一句話)

      左圖說明了”Arduino就能順利地傳達高電位訊號給ESP8266″
      右圖應該要說明”Arduino就能順利地傳達低電位訊號給ESP8266″

      這樣比較有邏輯,但是右圖的箭頭卻是在說明 ESP8266 傳給 Arduino

    2. 我們這樣定義「輸出」和「輸入」好了:

      數位輸出:主動切換接腳的高、低電位
      數位輸入:被動地接收高、低電位

      以下圖的控制LED為例,當連接LED的接腳「主動切換成低電位」,才能讓外部電流流過LED,進入微控器到接地,因而點亮LED。

      LED電路

      倒回去之前的「輸出」定義,它就是在「輸出0」的情況,替外部電路打通迴路,不然電流要往哪裡跑?若是這樣說:上圖的LED點亮,是因為控制器「輸入0」…這邏輯更不通吧?

      thanks,
      jeffrey

  1. 不好意思,請問板主 加設我要把ESP8266內部程式上傳到MYSQL的DATA _ BASE 這塊板子能燒入上去嗎?

    1. 我猜想你指的是:透過ESP8266上傳資料到MySQL資料庫。
      存取MySQL資料庫的程式要放在電腦(網站)伺服器,假設你用PHP語言開發。
      ESP8266程式負責把資料傳遞給PHP網站程式,由PHP寫入資料庫。

      ESP8266的內部儲存空間無法存放資料庫系統。

      thanks,
      jeffrey

  2. 老師您好,我查閱了一篇文章能我解答這塊板子的電晶體似乎是有問題的 以下為參考網址
    https://www.instructables.com/id/ESP8266-ESP-12E-UART-Wireless-WIFI-Shield-TTL-Conv/#discuss
    請問老師 當您使用的時候電晶體是J1Y 還是J3Y呢? 因為我後面燒入的部分把ESP8266擴充版與ARDUINO 接合無法正常把AT指令送出 是不是跟這個電晶體有關呢 因為前面燒入過程我都PASS 還請老師幫我解達

    1. 感謝告知!我的板子上的電晶體原本焊接的就是J1Y,沒有改過。

      thanks,
      jeffrey

  3. 老師請問 假設我使用的是這板子上的esp8266 12-e 那我照前篇用ESPFlashDownloadTool燒入完(還原承原廠的AT Command)不用再次使用ESPlorer內 115200的 at 、rst工能執行驗證? 可以直接用 ESPlorer 開起自己寫完的lua程式調整傳輸為9600? 以下是我找的參考資料還請老師幫我解答我這樣理解是否正確!! tks!
    以下為網址: http://twincati.blogspot.com/2017/02/esp8266-2-at-nodemcu.html

    1. NodeMCU板內建的Lua韌體,我只有在第一次購買時稍微玩一下,後來就都改成Arduino或MicroPython韌體了。只要它能回應AT命令或Lua指令,就代表燒錄成功。

      thanks,
      jeffrey

  4. 趙老師:
    你的某一篇帖子是有兩張圖,是關於IO口漏極開路,推拉輸出的,我現在找不到這個帖子了,我在您的著作中也沒找到,一直沒有印象了,您知道是哪篇貼文或是書中哪頁嗎?

    1. 關於開集極、開汲極或漏極開路的說明,位於:

      超圖解Arduino互動設計入門(第三版):I2C介面單元,第11-13頁。
      超圖解互聯網IoT實作入門:Espruino單元,第7-12頁。
      超圖解Pyhon物聯網實作入門:I2C介面單元,第11-4頁。

      thanks,
      jeffrey

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top