ESP8266系列模組被製成多種型式的控制板,以及Arduino相容擴展板。本文將以一款ESP8266 Wi-Fi網路擴展板,說明用AT指令連接並上傳資料到ThingSpeak雲端平台的方法。同樣的接線和程式,也適用在其他ESP8266模組加Arduino UNO的組合。
認識ESP8266 序列埠(串口)WiFi擴展板
下圖是一款採用ESP8266(ESP-12E模組)的Arduino Wi-Fi無線區域網路擴展板,商品標題是「ESP8266串口WiFi擴展板」:
這個板子上面有3.3V直流穩壓電路,ESP8266模組的I/O腳也都有引出,透過運作模式切換開關,可設置讓ESP8266獨立運作,或者與Arduino的UART序列埠相連:
這塊板子沒有內建USB序列轉TTL晶片,所以燒錄韌體時,需要外接USB轉TTL傳輸線(也可經由Arduino UNO板上的USB序列晶片燒錄):
燒錄ESP8266韌體的軟體工具和步驟,請參閱上一篇貼文的「使用Flash下載工具燒錄ESP8266韌體」一節。燒錄完畢後,請關閉開關(切下)3和4。
使用1N4148二極體串接ESP8266和Arduino UNO
跟上一篇文章介紹的「UNO+WiFi R3板」一樣,透過開關即可讓擴展板的ESP8266與Arduino相連。可是,它們都是連接到UART埠,而Arduino的UART埠通常被保留用來跟電腦的USB通訊。所以筆者將擴展板設置成「各自獨立運作」模式,ESP8266模組的序列通訊腳,則與Arduino的數位2和3相連。
Arduino UNO透過SoftwareSerial程式庫,將數位2和3腳模擬成UART序列埠。由於Arduino的數位輸出高電位是5V,為了避免損壞ESP8266,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:
設置完畢後,序列埠監控視窗的傳輸率選單也要改成19200:
連接Wi-Fi路由器的AT指令
連接Wi-Fi路由器並存入快閃記憶體的AT指令是AT+CWJAP_DEF,設定網路連線之前,請先執行AT+CWMODE_DEF指令,把ESP8266的網路模式設定成「無線接入點+無線終端」:
輸入Wi-Fi連線指令後,它將回應WIFI CONNECTED和WIFI GOT IP訊息,代表連線成功。
使用AT指令連接並傳遞資料到ThingSpeak雲端平台
參考安信可官方的AT指令文件,以及「ESP8266使用AT指令開發示範」文件的「HTTP通訊示範」說明,讓ESP8266扮演HTTP前端,連接ThingSpeak網站的AT指令流程如下:
向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訊息。
關於1N4148 解說圖,右邊那個圖有錯,箭頭畫反了
欸…我看了N遍…不解哪裡畫反了?
thanks,
jeffrey
應該是沒畫錯哦~~~
圖沒有錯,我所說的話反了是跟下面說明的文字:
在ESP8266模組通電的情況下,若採三用電錶測量它的RX腳和接地的電壓,將能測得約3.3V。也就是說,RX接腳內部有個上拉電阻。只要像上圖一樣串接二極體,Arduino就能順利地傳達高、低電位訊號給ESP8266。(最後一句話)
左圖說明了”Arduino就能順利地傳達高電位訊號給ESP8266″
右圖應該要說明”Arduino就能順利地傳達低電位訊號給ESP8266″
這樣比較有邏輯,但是右圖的箭頭卻是在說明 ESP8266 傳給 Arduino
我們這樣定義「輸出」和「輸入」好了:
數位輸出:主動切換接腳的高、低電位。
數位輸入:被動地接收高、低電位。
以下圖的控制LED為例,當連接LED的接腳「主動切換成低電位」,才能讓外部電流流過LED,進入微控器到接地,因而點亮LED。
倒回去之前的「輸出」定義,它就是在「輸出0」的情況,替外部電路打通迴路,不然電流要往哪裡跑?若是這樣說:上圖的LED點亮,是因為控制器「輸入0」…這邏輯更不通吧?
thanks,
jeffrey
不好意思,請問板主 加設我要把ESP8266內部程式上傳到MYSQL的DATA _ BASE 這塊板子能燒入上去嗎?
我猜想你指的是:透過ESP8266上傳資料到MySQL資料庫。
存取MySQL資料庫的程式要放在電腦(網站)伺服器,假設你用PHP語言開發。
ESP8266程式負責把資料傳遞給PHP網站程式,由PHP寫入資料庫。
ESP8266的內部儲存空間無法存放資料庫系統。
thanks,
jeffrey
好的,我大概知道了!! 謝謝您!! 我在試試看!!
老師您好,我查閱了一篇文章能我解答這塊板子的電晶體似乎是有問題的 以下為參考網址
https://www.instructables.com/id/ESP8266-ESP-12E-UART-Wireless-WIFI-Shield-TTL-Conv/#discuss
請問老師 當您使用的時候電晶體是J1Y 還是J3Y呢? 因為我後面燒入的部分把ESP8266擴充版與ARDUINO 接合無法正常把AT指令送出 是不是跟這個電晶體有關呢 因為前面燒入過程我都PASS 還請老師幫我解達
感謝告知!我的板子上的電晶體原本焊接的就是J1Y,沒有改過。
thanks,
jeffrey
老師請問 假設我使用的是這板子上的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
NodeMCU板內建的Lua韌體,我只有在第一次購買時稍微玩一下,後來就都改成Arduino或MicroPython韌體了。只要它能回應AT命令或Lua指令,就代表燒錄成功。
thanks,
jeffrey
趙老師:
你的某一篇帖子是有兩張圖,是關於IO口漏極開路,推拉輸出的,我現在找不到這個帖子了,我在您的著作中也沒找到,一直沒有印象了,您知道是哪篇貼文或是書中哪頁嗎?
關於開集極、開汲極或漏極開路的說明,位於:
超圖解Arduino互動設計入門(第三版):I2C介面單元,第11-13頁。
超圖解互聯網IoT實作入門:Espruino單元,第7-12頁。
超圖解Pyhon物聯網實作入門:I2C介面單元,第11-4頁。
thanks,
jeffrey