別再用很難接線的 ESP-01 了!以正規 NodeMCU/D1 mini(ESP8266)替任何無 WiFi 的開發板打造物聯網應用──燒錄 AT firmware 並傳送 AT 指令

外接 ESP-01 模組的方式(包含外部電源,但不含除錯用的 USB-TTL 模組)
  1. 接線和供電只要 1 至 2 條 USB 線和 3 條杜邦線;
  2. 如果 ESP8266 的 USB 線接在電腦上的話,還可順便監看 ESP8266 AT 韌體的回應。
Photo by Sabri Tuzcu on Unsplash

購買 ESP8266 開發板

首先,你需要一塊 NodeMCU 或 D1 mini,或者其他 ESP8266 開發板。不管造型怎樣,功能都是一樣的。

比較大的是 V3,較小的是 V2。

安裝 USB 驅動程式

取決你的 ESP8266 使用哪種 USB 晶片,你得在 Windows 上安裝 CP2102 或 CH340 的驅動程式,這樣電腦才能跟板子溝通:

  1. CH340http://www.wch.cn/download/ch341ser_exe.html
Photo by Shelbey Miller on Unsplash

下載 AT 韌體及燒錄

你買來的開發板上可能已經裝有某個版本的 AT 韌體,但現在我們要把最新版的燒錄上去。這個辦法適用於已經燒錄過其他程式語言(如 C++ 或 MicroPython)的 ESP8266。筆者目前測試過 NodeMCU V2 和 WeMos D1 mini 都是可行的。

  1. 安可信的 Flash Download Tools:https://www.espressif.com/en/support/download/other-tools。本篇以 v3.8.5 為例。同樣解壓後丟到電腦內。

設定燒錄選項與檔案

在燒錄畫面中,你得做如下的設定:

  1. \bin\at\1024+1024\user1.2048.new.5.bin0x01000
  2. \bin\esp_init_data_default_v08.bin0x1FC000
  3. \bin\blank.bin0x7E000
  4. \bin\blank.bin0x1FB000
  5. \bin\blank.bin0x1FE000
  1. SPI MODE -> QIO
  2. FLASH SIZE -> 16Mbit(但 16Mbit-C1 似乎也可以)
  3. COM -> 板子所在的 COM port
  4. BAUD -> 115200(有時接上板子會跳到 1152000,記得改掉)
Photo by Chinh Le Duc on Unsplash

測試 AT 韌體回應

燒錄完成後,我們可以用終端機軟體來測試 AT 韌體是否正常運作。

這張圖中連的是 D1 mini,可見它使用 CH340 USB 晶片
至少「發送」和「本地回顧」這兩個要調
AATTOK
ATE0
AT+GMR
AT version:1.7.4.0(May 11 2020 19:13:04)
SDK version:3.0.4(9532ceb)
compile time:May 27 2020 10:12:22
Bin version(Wroom 02):1.7.4
OK
Photo by Markus Winkler on Unsplash
AT+CWMODE=1
AT+CWLAP
+CWLAP:(3,"FLAG-N007-B",-67,"d8:b0:4c:f2:21:64",1,-24,0,3,3,7,0)
+CWLAP:(3,"FLAG-N007-60",-73,"d8:b0:4c:f2:22:50",1,-74,0,3,3,7,0)
+CWLAP:(0,"FLAG-N007-99",-56,"d8:b0:4c:f2:22:80",1,-14,0,0,0,7,0)
+CWLAP:(0,"FLAG-XXXX",-80,"be:dd:c2:82:43:8f",1,-7,0,0,0,3,0)
+CWLAP:(4,"MicroPython-4e73b8",-82,"52:02:91:4e:73:b8",1,-9,0,5,3,3,0)
+CWLAP:(4,"MicroPython-6c81c2",-86,"be:dd:c2:6c:81:c2",1,8,0,5,3,3,0)
+CWLAP:(4,"AAM-B",-85,"e4:6f:13:2f:73:74",1,-29,0,5,3,7,1)
+CWLAP:(4,"MicroPython-205064",-84,"2e:f4:32:20:50:64",5,-7,0,5,3,3,0)
+CWLAP:(3,"flaginfo",-79,"cc:5d:4e:45:07:10",1,-37,0,4,4,7,0)
+CWLAP:(3,"FLAG",-41,"e8:26:89:bb:2a:64",6,5,0,4,4,7,0)
+CWLAP:(4,"CHT_I040GW1",-68,"1c:49:7b:9b:61:50",7,-26,0,5,3,7,0)
+CWLAP:(0,"CSD_Employee",-91,"24:de:c6:86:1b:90",1,0,0,0,0,7,0)
+CWLAP:(0,"CSD_Guest",-91,"24:de:c6:86:1b:91",1,0,0,0,0,7,0)
+CWLAP:(3,"TN-ASUS-AP01",-93,"54:a0:50:e1:f7:84",9,-32,0,4,4,7,1)
+CWLAP:(3,"",-66,"00:0e:8e:b9:70:56",10,-39,0,4,4,3,0)
+CWLAP:(4,"oh4648",-76,"c8:5b:a0:3f:7b:57",11,-16,0,4,4,7,0)
+CWLAP:(0,"BUFFALO-E0E204-1",-73,"10:6f:3f:e0:e2:04",11,-32,0,0,0,7,1)
+CWLAP:(3,"FLAG-N007-test",-75,"d8:b0:4c:e0:74:ac",11,5,0,4,4,7,0)
+CWLAP:(0,"FlagPub",-73,"10:6f:3f:e0:e2:06",11,-32,0,0,0,7,0)
+CWLAP:(3,"DSL-7740C",-82,"ac:f1:df:01:1f:7f",11,1,0,4,4,7,0)
+CWLAP:(0,"Tainan-user",-83,"1c:3a:60:24:81:d8",11,-6,0,0,0,7,0)
+CWLAP:(3,"Tainan-guest",-85,"1c:3a:60:64:81:d8",11,-6,0,4,4,7,0)
AT+RESTORE
Photo by Annie Spratt on Unsplash

讓開發板以序列埠對 ESP8266 傳送 AT 訊息

只要你懂 AT 指令,你可以直接在終端機軟體內控制 ESP8266 連上網路、發送 HTTP 請求等。可想而知,若把這個過程寫在程式中、由開發板透過序列埠傳給 ESP8266,就能做到相同的結果了。對於 micro:bit 這類天生缺乏網路功能的板子來說,這無疑是一大福音。

以 Uno 簡單測試序列埠 AT 訊息交換

在本篇,我們先用 Arduino Uno 做個示範,畢竟 Uno 可以在硬體序列埠外建立軟體序列埠,我們能藉此「透過」Uno 傳 AT 指令給 ESP8266,並看到後者傳回的回應。

  1. Tx → 12
  2. Rx → 11
這裡的圖用的是 NodeMCU V3,沒為什麼,只因 fritzing 裡這板子的圖最好看。
#include <SoftwareSerial.h>SoftwareSerial softSerial(11, 12); // 軟體序列埠 (Rx, Tx)void setup() {

Serial.begin(115200);
softSerial.begin(115200);

}
void loop() {

if (Serial.available()) { // 將序列埠輸入的字串傳給軟體序列埠
softSerial.write(Serial.read());
}

if (softSerial.available()) { // 將軟體序列埠輸入的字串傳給序列埠
Serial.write(softSerial.read());
}

}
Photo by Jim Sung on Unsplash

使用 ESP8266 上傳資料到 ThingSpeak 物聯網網站

第二個範例是將 BBC micro:bit 接上 ESP8266,這其實也是筆者過去以 ESP-01 做過的應用。為了簡化起見,在此我們完全忽略 ESP8266 的 AT 回應,畢竟傳送資料到 ThinkSpeak,只需要用 HTTP GET 送出一個網址就行了。

如果把 ESP8266 和 micro:bit 的 3.3V 電源接在一起,那麼 micro:bit 燒好程式後,用一條 USB 線直接從 ESP8266 供電就能兩個一起運作了 。據了解 CH340G 在 3.3V 可供 50 mA 的電,這對 micro:bit 來說是夠的。(許多 ESP8266 的 5V 腳位則是直接從 USB 吃電,但要注意 micro:bit 的運作電壓不能超過 3.6V。)
  1. AT+CWMODE=1(設為 STA 或 station 模式)
  2. AT+RST(重置)
  3. AT+CWJAP=”wifi名稱”,”wifi密碼”(連上 WiFi)
  4. AT+CIPSTART=”TCP”,”server路徑”,80(連上伺服器)
  5. AT+CIPSEND=要傳送的字串長度(含換行字元)
    (然後緊接著傳送該字串,也就是 HTTP GET 請求)
SSID    = 'xxxxx'   # WiFi 名稱
PWD = 'ooooo' # WiFi 密碼
API_KEY = '你的API_KEY' # ThinkSpeak api key
URL = 'api.thingspeak.com' # 伺服器位址
REQUEST = '/update?api_key={}&field1={}' # 在伺服器要 GET 的網址

# 匯入所需模組
from microbit import uart, sleep, pin15, pin16, display
# 重新指定 UART 腳位為 P15, P16
uart.init(baudrate=115200, tx=pin15, rx=pin16)

# 用來傳 AT 指令的 function (包含傳送後的等待時間)
def sendAT(cmd, delay=100):
uart.write(str(cmd) + '\r\n')
sleep(delay)
sendAT('AT+RESTORE', 1000) # 恢復預設設定
sendAT('AT+CWMODE=1') # 設為 station 模式
sendAT('AT+RST', 1000) # 重置
# 連到 WiFi (建議等久一點)
sendAT('AT+CWJAP=\"{}\",\"{}\"'.format(SSID, PWD), 12000)

while True:

# 連到伺服器
sendAT('AT+CIPSTART=\"TCP\",\"{}\",80'.format(URL), 1000)

# 產生要送出的 GET 字串 (包含亮度感測值)
sendStr = 'GET ' + REQUEST.format(API_KEY, display.read_light_level())

# 先指定要傳送的字數 (含 \r\n)
sendAT('AT+CIPSEND={}'.format(len(sendStr) + 2))

# 傳送 GET 字串
sendAT(sendStr, 0)

# 等待下次傳送
sleep(9000)
AT+CWJAP="xxxxx","ooooo"
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIPSTART="TCP","api.thingspeak.com",80
CONNECT
OK
AT+CIPSEND=48
OK
>
Recv 48 bytes
SEND OK+IPD,2:11CLOSED
Photo by Franki Chamaki on Unsplash

結語

本篇簡介了如何在正規 ESP8266 開發板上燒錄最新的 AT firmware,並用它當成其他開發板的 WiFi 晶片。儘管這樣做比不上直接使用 ESP8266 做 IoT 開發,但這樣能給某些無 WiFi 能力的板子朝網路延伸的機會。此外,這樣在供電與接線上,也比使用較舊的 ESP-01 模組容易許多。

Photo by Benjamin Davies on Unsplash

Former translator, after-hours Maker, sunny-day analog film shooter. Currently a junior tech-book editor based in Taiwan. https://krantasblog.blogspot.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store