2015年7月29日 星期三

★ ESP8266 WiFi 模組 AT command 測試

這是我今年四月以 $180 向露天賣家 XLAN 買的超小型 WiFi 模組 (現已降價為 $145), 採用上海樂鑫科技的 ESP8266 晶片, 板子型式是 ESP-01, 這是 Arduino 最經濟的 WiFi 方案, 因為目前買一塊內建 WiFi 的 Arduino Yun 至少都要 2200 元以上. 此款板子有拉出 ESP8260 的兩個 GPIO 埠, 對於只需要兩個輸出入埠以內的應用而言, 可以改燒錄 NodeMCU 韌體, 直接將 ESP-01 卡當作 MCU+WiFi 用, 採用 Lua 作為程式語言, 在簡單應用可取代 Arduino.

關於 ESP8266 與 NodeMCU 簡介參考 :

# ESP8266 WiFi 模組
# NodeMCU 物聯網開發平台
# 5美元的WiFi微控器ESP8266已可與Arduino相容

ESP8266 晶片實作 LWIP 的精簡型 TCP/IP 協定堆疊, 成本低效能高, 具有極佳競爭力. 如果是採用 TI 的 CC3000 構建的 WiFi 模組, 大約要 700 元以上 (CC3000 晶片就要 500 元左右) :

# 露天 : CC3000 WiFi IC 晶片 W10 $540
# 露天 : CC3000 Wifi Module for arduino (BB-CC3K) $695
# CC3000 WiFi Shield for Arduino R3 帶SD卡座 支持 MEGA2560 $950

而採用 W5100 的 WiFi 模組則比 CC3000 便宜些 :

# <微控科技> W5100 WIZnet 網路晶片 Arduino 8051 AVR ARM PIC 均可用 $185
# 2013最新版 Arduino Ethernet W5100 網路擴展板 板載mini SD 支持Mega328 $225
# 【方塊奇品】新款Arduino Ethernet Shield W5100 R3 附參考資料 網路擴展板 板載TF  $380
# W5100乙太網模塊 網絡模塊紅板 W5100乙太網模塊 電子積木 網絡 W42 (小板) $400

但是論價格, 論體積, CC3000 與 W5100 兩個都不是 ESP8266 的對手, 目前較便宜的 ESP-01 板子如下 :

# esp8266 esp-01 (含稅) $90
ESP8266 ESP-01 串口 WIFI 無線模組 WIFI $145
# blkbox.me嚴選 ESP8266 大陸製ESP-01 Wifi 無線模組 arduino可用 $150
#《iCshop2》ESP8266 ESP-01 串口WIFI 無線模組 (陶瓷天線) $165
# blkbox.me原裝㊣品 虎紋風格 ESP8266 Wifi模組 板載8Mb FLASH (BB-E01) $185

ESP8266 可規劃作為 AP, STA, 或者是 AP+STA 雙模.

AP 模式 : Access Point 模式, 即無線基地台模式, 接受其他 WiFi 終端連入
STA 模式 : Station 模式, 即無線網卡模式, 可連接到 AP, 不接受連入
SSID : Service Set IDentifier, 無線區域網路的名稱, 可由 AP 廣播出來
LWIP 協定 : 精簡化後的 TCP/IP 協定堆疊, 適用於嵌入式系統

# ESP8266 晶片的規格書 (中文)
# ESP8266 晶片的規格書 (英文)

以下我參考克里斯與 Proteus 的文章, 利用 PL2303HX 下載線連接電腦的 USB 與 ESP8266 板, 使用 RealTerm 軟體以 AT 指令與 ESP8266 通訊 :

【技術教學】打造Wifi遙控車(之一):使用 ESP8266進行 Wifi無線通訊
【技術教學】打造Wifi遙控車(之二):整合 ESP8266 與 Arduino
# 如何燒錄 ESP8266 無線模組的韌體
# ESP8266 control from a PC via USB-serial

克里斯使用 CP2102 USB-UART(TTL) 轉換板來將電腦的 USB 訊號轉成 ESP8206 的 UART 串列訊號, 而我用的是 PL2303HX 下載線, 參考前作 :

安裝 PL2303HX USB 轉 TTL 驅動程式
關於 PL2303HX 在 win8 無法驅動的問題

此 PL2303HX 下載線電路板被包覆在 USB 塑膠殼內, 拆開來可看到裡面有 3.3V 電源接線孔, 若需要輸出 3.3V 電源需自行焊線拉出去, 但根據克里斯經驗, 因為 EXP8266 會消耗 200~300mA 左右的電流, 而一般下載線即使有 3.3V 電源輸出, 但無法輸出這麼多電流, 所以無法推動 ESP8266.

我查了 PL2303HX 規格, 在 9.2.1 節提到其最大操作電流是 25mA, 也是不夠的, 所以其 3.3V 輸出不能用 (故不須接出來了), 必須使用麵包板電源模組的 3.3V 電源, 如下圖右上角處, 把跳線帽移到 3.3V 處, 旁邊的接點就是輸出 3.3V 了 :


注意, 雖然 PL2303HX 吃電腦 USB 的 5V 電源, 其信號輸出卻是 3.3V 準位 (實際測量是 3.8V), 所以其 TX/RX 可以直接與 ESP8266 的 UXRD/UXTD 相接.




PL2303HX 有四條線, 其中紅色的 +5V 不能用 (因 ESP8266 工作電壓 1.7~3.6V) :

PL2303HX       
+5V(紅線)  - 不可接 (會讓 ESP8266 燒毀)
GND(黑線)-  接 ESP8266 與 3.3V 電源板的 GND (三個 GND 共接)
TXD(綠線) -  接 ESP8266 的 URXD
RXD(白線)-  接 ESP8266 的 UXTD

ESP8266 的接腳圖如下所示, 針腳位於背面, 接線時比較有用 :

正面

背面

連線圖如下, 可見 PL2303HX 與 ESP8266 的 GND 都接到電源模組的 GND (都是黑線), ESP8266 的 CH_PD (黃線) 與 VCC (紅線) 都接到電源模組的 3.3V, 然後 PL2303HX 的 RX (白線) 接 EXP8266 的 UXTD, TX(綠線) 接 ESP8266 的 URXD.


接好後把 PL2303HX 插入電腦 USB 槽, 按下電源模組按鈕送電, 這時 ESP8266 板子晶振旁的藍色 LED 會閃一下 (有資料傳送時藍燈閃, 參考 ESP8266), 邊邊的紅色 LED 也會亮起來 (表示有電源) :


 

打開控制台/裝置管理員/連接埠, 可看到 Prolific USB-to-Serial Comm Port (COM4) 已正常被驅動, 如果出現黃色驚嘆號的三角形, 表示驅動程式有問題, 請參考下文先安裝 : 



連接埠沒問題的話, 啟動 Realterm 通訊軟體, 免安裝版可由此下載 :

# https://dl.dropboxusercontent.com/u/68794214/Realterm.zip
 
打開 port 頁籤, 設定鮑率 Baud 為 9600, 指定埠號 port 為 4 (因 PL2303HX 為 COM4), 資料格式為 Parity=None, Data Bits 為 8, Stop Bits 為 1 Bit, 這樣應該就可以跟 0.9.2 版韌體順利連線了, 這時上面會出現 ready :


如果是較舊的韌體, 可能預設 Baud rate 不是 9600, 而是115200 或 57600, 要試一下才行. 注意, 每次修改後必須按 "Change" 才會生效, 如果出現 ready 了, 但伴隨有亂碼, 請切到 Display 頁籤, 勾選  Display As 與 ANSI, 這樣以後下 AT 命令就不會有亂碼了 :


接下來就可以切到 Send 頁籤向 ESP8266 傳送 AT 指令了, 首先須在 EOL 框中勾選 LF 與 CR, 因 Windows 系統以 LFCR 當作跳行符號, 然後就可以輸入 AT, 按 Send ASCII 鈕, 連線順利的話 ESP8266 就會回傳 OK : 


各種 AT 指令參考 :

# ESP8266 AT Command Set (PDF)
# ESP8266 Reference (PDF)
espressif/esp8266_at
atproto/commands.md

例如 :
  1. AT+GMR : 取得韌體版本 :
    AT+GMR                                                                         
    0018000902-AI03                                                               
                                                                                   
    OK 
    可見目前版本是 0902.
  2. AT+RST : 重新起始 ESP8266
    AT+RST                                                                         
                                                                                   
    OK                                                                             
    7!aS?'??!G?R??                                                           
    [Vendor:www.ai-thinker.com Version:0.9.2.4]                                    
                                                                                   
    ready  
  3. AT+CIOBAUD?  : 查詢鮑率 (位元速率)
    +CIOBAUD:9600

    OK
  4. AT+CIFSR : 查詢 IP 位址

    AT+CIFSR                                                                       
    192.168.4.1                                                                    
                                                                                   
    OK

    注意, 作為 STA 時,  若尚未用 CWJAP 連線基地台, 則預設 IP 為 0.0.0.0, 連線後才會被指派一個 192.168.X.X 的 STA 區域 IP. 如果 ESP8266 是在 AP/BOTH 模式, 則下 CIFSR 會看到兩個 IP, 一個是 STA IP, 另為一個是基地台 SoftAP IP. 
  5. AT+CWMODE? : 查詢目前工作模式
    AT+CWMODE?                                                                     
    +CWMODE:2                                                                      
                                                                                   
    OK     
    可見目前是模式 2 (AP 基地台模式), 1=STA 網卡模式, 3=BOTH (AP+STA).
    注意, 下完 CWMODE 最好再用 CWRST 重啟, 以確認設定有完成.  
  6. AT+CWMODE=1 : 修改工作模式為 1 (STA) 網卡模式
    AT+CWMODE=1                                                                    
                                                                                   
    OK                                                                             
    AT+CWMODE?                                                                     
    +CWMODE:1                                                                      
                                                                                   
    OK   
    要修改為雙重模式就在等號後面指定為 3 即可. 注意, STA 與 AP 模式有各自的 IP, 在 STA 模式下未連線前 IP 為預設之 0.0.0.0, 連線後基地台會配發一個 192.168.X.X 的 IP; 改為 AP 或 BOTH 模式後, ESP8266 會自行配發 192.168.4.1 的 AP IP, 故 BOTH 模式下會有兩個 IP.

    AT+CWMODE=3

    OK
    AT+CIFSR
    192.168.4.1     (這是 ESP8266 當 AP 的 IP)
    192.168.2.105 (這是 ESP8266 當 STA 的 IP)
  7. AT+CWLAP : 列出附近偵測得到的基地台
    注意, 此指令只能在 STA (=1) 與 BOTH (=3) 模式下才會回應, 在 AP 模式下會出現 ERROR.
    AT+CWLAP                                                                       
    +CWLAP:(2,"edimax.setup",-71,"74:da:38:15:16:00",1)                            
    +CWLAP:(3,"bryan",-90,"78:54:2e:26:66:28",1)                                   
    +CWLAP:(3,"TP-LINK_33C1",-86,"c4:e9:84:66:33:c1",4)                            
    +CWLAP:(4,"ching",-84,"54:b8:0a:84:f4:70",5)                                   
    +CWLAP:(4,"HOME",-70,"04:8d:38:52:ea:f7",6)                                    
    +CWLAP:(4,"alex",-85,"fc:75:16:01:26:0c",6)                                    
    +CWLAP:(4,"andy",-85,"fc:75:16:02:61:60",6)                                    
    +CWLAP:(1,"JANE-WIRELESS",-94,"00:24:01:ad:a0:65",6)                           
    +CWLAP:(4,"RFTQAD",-93,"c8:d3:a3:5f:d8:fd",9)                                  
    +CWLAP:(3,"TP-LINK_601A04",-73,"e8:de:27:60:1a:04",10)                         
    +CWLAP:(4,"EDIMAX-tony",-44,"90:1f:02:2d:5a:9f",11)  我的基地台                    
    +CWLAP:(3,"CHT5668",-89,"d8:fe:e3:5c:c0:fb",11)                                
    +CWLAP:(3,"MOTOROLA-5N6F",-89,"f8:35:dd:74:d2:b6",11)                          
    +CWLAP:(3,"45-9",-91,"d8:fe:e3:e6:90:87",11)                                   
    +CWLAP:(3,"family",-89,"6c:19:8f:b7:9a:79",1)                                  
                                                                                   
    OK
    回應訊息的格式為 : +CWLAP:(ecn,ssid,rssi,mac,mode)
    第一個參數是加密方式 ecn :
    0 OPEN (不加密)
    1 WEP
    2 WPA_PSK
    3 WPA2_PSK
    4 WPA_WPA2_PSK
    第二個參數是服務設定識別碼 SSID (即基地台代號), 第三個是接收的射頻信號強度 (dBm), 均為負值, 越負信號越弱, 最大值是 0. 第四參數是實體位址 MAC, 第五參數據 "More AT Command Information Found" 說是連接模式, 0 為手動 (manual), 1 為自動 (auto). 但上面測試卻有 0, 1 以外的值. 據 "ESP8266 WiFi module" 這篇則說是 channel, 似乎較合理, 因為 CWJAP 指令也無法設定手動或自動啊!
  8. AT+CWJAP="SSID","PWD" : 連線指定之基地台 (Join AP)
    AT+CWJAP="EDIMAX-tony","123456789111"                                         
                                                                                   
    OK 
    連線成功後再下 AT+CIFSR 查詢新指派的 IP, 還沒下 CWJAP 連線前為 0.0.0.0  :                                                                           
    AT+CIFSR                                                                       
    192.168.2.105  
    這時可在相同網域的電腦 ping 此 IP, 檢查連線是否可傳送資料 :

    C:\Users\petertw89>ping 192.168.2.105
    Ping 192.168.2.105 (使用 32 位元組的資料):
    回覆自 192.168.2.105: 位元組=32 時間=110ms TTL=255
    回覆自 192.168.2.105: 位元組=32 時間=18ms TTL=255
    回覆自 192.168.2.105: 位元組=32 時間=35ms TTL=255
    回覆自 192.168.2.105: 位元組=32 時間=55ms TTL=255

    192.168.2.105 的 Ping 統計資料:
        封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
    大約的來回時間 (毫秒):
        最小值 = 18ms,最大值 = 110ms,平均 = 54ms   
  9. AT+CWJAP? : 查詢目前連線到哪一個基地台
    AT+CWJAP?
    +CWJAP:"EDIMAX-tony"

    OK
  10. AT+CWQAP : 離開目前連線的基地台
    AT+CWQAP

    OK
    這時再下 AT+CWJAP? 查詢連線之基地台時就會回應 ERROR :
    AT+CWJAP?

    ERROR
    這時下 CWFSR 原來指配的 IP 192.168.2.105 會消失, 回到預設 0.0.0.0
    AT+CIFSR
    0.0.0.0

    OK
  11. AT+CIPSTART : 建立 TCP/UDP 連線
    AT+CIPSTART="TCP","www.google.com",80

    OK
    Linked
    這樣就與遠端主機建立 TCP 連線了.
    AT+CIPSTART="UDP","192.43.244.18",123

    OK
    這樣就與遠端主機建立 UDP 連線了.
  12. AT+CIPSTATUS : 查詢目前 IP 連線狀態
    AT+CIPSTATUS
    STATUS:3
    +CIPSTATUS:0,"TCP","74.125.203.101",80,0

    OK

    回應訊息格式 : +CIPSTATUS:id,type,addr,port,tetype
    id 為連線通道編號, 最後面的 tetype 為 ESP8266 角色, 0 為 client, 1 為 server.
    表示目前與 IP 74.125.203.101 的 80 port 已建立了 TCP 連線 (2 表示已取得 IP 尚未連線, 3 表示 Connected, 4 表示 disconnected). 回應中的 0 為 id. 
  13. AT+CIPCLOSE : 關閉 IP 連線
    AT+CIPCLOSE

    OK
    Unlink
  14. AT+CWSAP? : 查詢 SoftAP 的設定
    此指令只有當 ESP8266 工作於 AP/BOTH 模式時才有用, 在 STA 模式下此指令會得到 ERROR 回應.

    AT+CWMODE=3   先改為 BOTH 模式

    OK
    AT+CWSAP?
    AT+CWSAP:"ESP_9CBD07","",6,0    預設 ssid, pwd, ch, ecn

    OK

    回應顯示預設未設密碼, 最後一個參數為加密方式, 預設 0=未加密, 見 CWLAP 指令. 而 ssid 是 ESP8266 作為 AP 的網路識別, 後面是其 MAC 號碼. ecn 是加密方式.
  15. AT+CWSAP="ssid","pwd",ch,ecn : 更改 AP 的設定 (只在 AP/BOTH 模式有效)

    AT+CWSAP="MYESP","1234567890",6,4

    OK
  16. AT+CWLIF : 查詢有哪些 Client 連線至此 AP (只在 AP/BOTH 模式有效)
    AT+CWLIF
    192.168.4.100,74:e1:b6:0e:f5:67

    OK
  17. AT+CIPMUX? : 詢問目前 TCP/UDP 連線模式
    這是設定 ESP8266 與同一 WiFi 網路中其他裝置的連線模式, 預設為單一連線, 如果要讓 ESP8266 當伺服器用, 必須設為 1=多重連線.

    AT+CIPMUX?
    +CIPMUX:0       (多重連線關閉, 即單一連線模式)

    OK
  18. AT+CIPMUX=1 : 設定 TCP/UDP 連線模式為多重連線
    如果要讓 ESP8266 當伺服器, 讓網域中的客戶端進行 TCP/UDP 連線, 必須開啟多重連線.

    AT+CIPMUX=1

    OK
    如果要取消 ESP8266 的伺服功能, 恢復單一連線功能, 須將 CIPMUX 設為 0 :
    AT+CIPMUX=1

    OK
  19. AT+CIPSERVER=mode[,port] : 設定是否開啟 ESP8266 為伺服器
    用 CIPMUX=1 開啟多重連線後, 就可以用 CIPSERVER 設定 ESP8266 的伺服器功能. mode=1 為開啟伺服器, 必須指定 port; mode=0 為關閉伺服器, 不須指定 port. 在單一連線下開啟伺服器, 會得到 ERROR 回應.

    AT+CIPSERVER=1,8087

    OK

    這樣 ESP8266 伺服器就會傾聽 8087 埠, 這時就可在同網域的電腦連線 ESP8266 伺服器了. 我下載克里斯寫的 Connector-Test.air 安裝後選擇當 Client, 連線 ESP8266 的 STA IP, 連線成功且能雙向傳遞訊息. 用書上的 Java Client 網路程式來測試也 OK.

    重複開啟伺服器會回應 no change :

    AT+CIPSERVER=1,8081
    no change

    關閉伺服器後必須重啟 ESP8266 (AT+RST), 其回應為 :

    AT+CIPSERVER=0
    we must restart
  20. AT+CIPSTO? : 查詢伺服器逾時計時器設定值 (秒)

    AT+CIPSTO?
    +CIPSTO:180

    OK

    預設是 180 秒
  21. AT+CIPSTO=timeout : 設定伺服器逾時計時器 (0~7200 秒)

    AT+CIPSTO=200

    OK

    其實不管設定為多少秒, 它都回應 OK, 但實際最多只能計時到 7200 秒.
設定用的 AT 指令 (例如改變工作模式或連線某個 AP) 完成後會寫入 Flash 記憶體, 即使關機也不會消失, 重開機就會回魂了. 所以設定連線哪個 AP 就會一直鎖定該 AP, 無法像筆電那樣會記錄曾經連線過的 AP 資料, 自動找信好強的連線.

ESP8266 的板子工作時摸起來溫溫的, 我拿了體溫計放在板子上測量約 39 度. 另外也接了電壓電流表測量總耗電量, 顯示 0.02A (20mA) 左右 :


以上就是今晚的測試, 終於搞定了!

2015-07-29 補充 :

賣家 blackboxstudio 表示中國製 ESP-01 板不支援 GSLP 休眠指令, 試過 AT+GSLP=10000 (休眠 10 秒) 果真無法執行. 根據 "Low Power ESP8266 – Sleeping at 78 micro Amps" 這篇得知是因為 ESP-01 板的 XPD_DCDC (8) 腳沒有接到 reset 之故.

2015-11-16 補充 :

今天找到這個網頁, 介紹 AT 指令蠻詳細的, 特別是把 ESP8266 作為伺服器的部分 :

# WiFi Module ESP8266 – 2. TCP CLIENT /Server mode

2016-05-19 補充 :

注意唷! 上面這些 AT 指令必須恰恰好, 亦即, 不可以在後面傳送多餘空格, 例如 AT+CIPSTO? 總共 10 個字元, 如果在 ? 後面多按了一個空格字元就會發生錯誤.

其他參考資料 :

# 无线网卡AP模式和station模式 
# SSID, BSSID, ESSID 
# lwIP――TCP/IP協議棧的一種實現(1)
# lwIP――TCP/IP協議棧的一種實現(2)
# lwIP――TCP/IP協議棧的一種實現(3)
# New! Arduino Pro Mini 相容 16MHz 8MHz 任選 (BB-NPMx) $145
# 小型抽水機 水泵 抽水馬達 USB arduino 可用 水冷 水循環 過濾 $145
# 超大FLASH 4M的容量 ESP8266 UART WIFI 模組 ESP-12 $180
# IOT ESP8266 串口WIFI模塊 ESP-12 (附送底板+開發資料+諮詢) $180
# ESP8266 ESP-12 ESP-07 最小系統 最小測試版 5V直用 $200
# SP-12 ESP8266串口WIFI 工業級 穩定版 測試板全套 !全IO引出
App HTML5 開發板 WF8266R ESP8266 物聯網 IoT 智慧家電 WIFI Arduino $250
# Arduino教學-使用ESP8266 wifi模組+DHT 溫溼度感測器上傳thingspeak
如何用arduino来测试ESP8266 WIFI模块(wifi普及预热中)
# A Simple IoT Project with the ESP8266 WiFi module
# 5$ Arduino WiFi Module!? ESP8266 mini Tutorial/Review
# Cheap and Easy WiFi (IoT) Tutorial Part 1 - ESP8266 Setup/Intro
ESP8266 的「IoT 創意致富」課程規劃
# NodeMCU 物聯網開發平台
BitBastelei #132 - WLAN-Thermometer mit ESP8266 & DHT22
# ESP8266: testing deep sleep & interrupts !?
# Low Power ESP8266 – Sleeping at 78 micro Amps
# 無線基地台 SSID 中文化的設定方法
# Esp8266 firmware update

75 則留言 :

低調學長 提到...

小狐狸晚安:

我參考以下的文章:
http://code.unumobile.com/wf8266r/tutorials/esp8266/00_FM

燒新最新 at command V0.20

但我卻無法改變 baudrate
我發現下列的網站似乎已經將
AT+CIOBAUD=115200
這改變baudrate 的命令拿掉
想再跟您確認一下,使用 V0.20 的 at commadn 是否無法再修改 baudrate

https://github.com/espressif/ESP8266_AT/wiki/AT_Description

小狐狸事務所 提到...

您好, 我沒有用過 AT 版本 0.20 的韌體, 但用過 0.21 版的, 不同韌體所支援的指令有些差異, 例如我目前使用的 AT v0.18 SDK 0.9.2 的韌體可以用 AT+CIOBAUD? 查詢速率; 但不能使用 AT+UART=9600,8,1,0,0 來更改速率. 而 AT v0.21 SDK 0.9.5 的版本卻相反, AT+CIOBAUD? 不行, AT+UART 則可. 您可以嘗試用 AT V0.21 的 AT+UART 試試看. 參考 :

http://wiki.aprbrother.com/wiki/Firmware_For_ESP8266
http://www.xess.com/blog/esp8266-reflash/
https://drive.google.com/file/d/0B3dUKfqzZnlwdUJUc2hkZDUyVjA/view?usp=sharing

註 : 韌體裡面有兩個版本訊息, 一個是 AT 版本, 一個是 SDK 版本. 我幾乎都使用 AT v0.18 SDK 0.9.2 的韌體, 因為此版較穩定.

低調學長 提到...

回饋一下
新版的命令還在實作中
可以使用 AT+IPR=9600 設定
但有些還沒實作完成,如
AT+IPR?

小狐狸事務所 提到...

感謝您, 我找時間試試看.

小玩意 提到...

好精闢的文章~
ESP8266 算是WIFI 一個便宜的解決方案。
研究研究~


匿名 提到...

您好
因為學校專題,我有關於esp8266的問題想問你可以嗎?
可以跟你要聯絡方式嗎?
謝謝

cyut 提到...

您好我是上面那位

shsps60510 提到...

你好!
我們是使用這塊板子
http://www.playrobot.com/wifi-enthnet/1134-esp8266-arduino-uno-r3-web-severwifi.html
然後輸入AT時會跑AT出來!而不是OK!
感謝!

小狐狸事務所 提到...

謝謝您, 讓我又多見識了一塊新板子. ESP8266 的回應取決於內部所燒錄的韌體, 我個人使用 0018000902 這個版本的韌體, 覺得期回應簡單且穩定, 參考這篇 :

http://yhhuang1966.blogspot.tw/2015/08/esp8266.html

提到...

你好~我知道可以用 app inventor 2 來控制 ESP8266 , 如何連線控制多個 ESP8266 可行嗎? 就是 可以單獨控制也可以一次作 群控 這樣,謝謝!

小狐狸事務所 提到...

感謝留言, 群控是一個不錯的點子, 例如一個按鍵同時控制多處灑水器等. App Inventor 2 我很久前就想學習了, 但後來看到 Blynk 這軟體就暫時打住了. 我還沒試過用 Blynk 做群控, 您可以先去了解看看, 參考 :

http://yhhuang1966.blogspot.tw/2016/08/blynk.html

我最近有空會試試看, 結果如何我會記錄下來. 歡迎多交流!

Unknown 提到...

我買了一顆 esp-01
因為懶 我沒有更新韌體 (結果是可以正常使用)
參考很多文章多說要另行供電給 8266
但是我參考其中其他文章的方式,嘗試用 2顆3號電池串聯供電給8266,卻是不行的 。
反而我直接用 arduino供電給 8266 ,可以正常使用,

可以連上家裡 wi-fi AP 可以取得ip 可以連到外部網站。

感謝您的文章,受益良多。

小狐狸事務所 提到...

ESP8266 啟動時吃電較大, 乾電池可能力有未逮. 感謝留言.

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...

作者您好
請問可以關閉伺服器逾時的功能嗎?
預設是180s
雖然可以把伺服器逾時時間變長
但我想直接關掉,永遠不要逾時,請問有這樣的指令嗎?
另外謝謝您的文章,受益良多

小狐狸事務所 提到...

Sorry, 我沒用過這樣的功能. 不過根據 stackoverflow, 似乎可以用 ini_set('max_execution_time', 0) 或 set_time_limit(0) 來關閉逾時功能, 您可以試試看. 參考 :

http://stackoverflow.com/questions/15776400/make-script-execution-to-unlimited

輕鬆一下, 你呢? 提到...

Hello 前輩您好

我用 RealTime 2.0.0.70 版對 ESP8266 下 AT 指令都成功, 唯讀 BaudRate 查詢及修改指令都報 Error, 這讓我買回的 BaudRate 115200 無法改成 9600, 應用 SoftwareSerial 在Blynk 就此路不通, 請問您有什麼 good idea 嗎.....

AT+GMR
AT version:1.2.0.0(Jul 1 2016 20:04:45)
SDK version:1.5.4.1(39cb9a32)
Ai-Thinker Technology Co. Ltd.
Dec 2 2016 14:21:16
OK
prlrl
Ai-Thinker Technology Co. Ltd.

ready
WIFI CONNECTED
WIFI GOT IP
AT+CIOBAUD?

ERROR

小狐狸事務所 提到...

特定版本的韌體才可以改 BAUD RATE 喔!

Unknown 提到...

作者您好,想請教一個問題,當我用sscom32e在做AT+CIPSTART這部份時,會顯示出這樣的情形
AT+CIPSTART=3,"TCP","192.168.1.109",8080

ERROR
3,CLOSED
在網路上查詢了很久,不知道id這邊是從哪裡來的呢?
我有設置好了這部分,上面ip也成功取得也可以發送wifi了
AT+CIPMUX=1


OK
謝謝。

小狐狸事務所 提到...

這個 id 是連線通道編號, 應該是 TCP/IP 協定堆疊給出的. TCP WEB 伺服器須開啟多重連線 (AT+CIPMUX=1) 否則會 ERROR. 參考 :

http://yhhuang1966.blogspot.tw/2015/11/esp8266-at.html

Unknown 提到...

謝謝作者,但我早已設定好為多重連線(AT+CIPMUX=1) 還是出現上面的情形,請問有解決方法嗎?

小狐狸事務所 提到...

我以前測試時偶而也會出現這樣的問題, 有時候似乎是 TCP 拆線不良, 照理每次連線結束後都有 close, 但下一次連線卻往 channel 2, 3, ...5 前進, 顯然 channel 1 還被占著不放. 原因必須深入了解 AT Firmware 以及其實作之 TCP/IP 棧才能追蹤, 我並無此功夫深究. 其實用 AT 操作 ESP8266 挺彆扭, 現在 Arduino IDE 直接支援 ESP8266, 可直用. 或者可用 MicroPython.

Unknown 提到...

您好
我想請問
我現在在做兩個esp8266的傳輸
我一開始是使用TCP的傳輸方式
但是TCP有MTU.MSS的限制,導致接收端單筆最多只能收到1460Bytes,超過會被拆開
例如:
發送端:
AT+CIPSTART=4,"TCP","192.168.4.2",8088
4,CONNECT

OK
AT+CIPSEND=4,1982

OK
>
Recv 1982 bytes

接收端:
4,CONNECT

OK

+IPD,0,1460=XXXXXX...XXXXX
+IPD,0,522=XXXX..XX

後來我改成UDP的方式
一樣先連結
發送端:
AT+CIPSTART=4,"UDP","192.168.4.2",8088
4,CONNECT

OK
AT+CIPSEND=4,1982

OK
>
Recv 1982 bytes

但是發送端收不到任何東西,確定有連結到,但沒辦法收到從發送端的任何資料
我把單筆資料調小也沒辦法
請問我使用UDP的方式有哪裡錯了呢?
TCP跟UDP的發送的AT指令應該是一樣的吧
還是需要多設定什麼嗎?

還是有什麼方法可以解決MTU.MSS的問題
像是把MSS的寬度變大,我在AT指令集完全沒看到任何相關的

還有AT+CIPSEND這個指令可以有辦法傳送超過2048Bytes的方法嗎?
因為我看AT指令集,這個指令最多只能傳2048Bytes
還是我其他的方法可以傳超過2048Bytes的方法嗎?

謝謝樓主
我的問題有點多

小狐狸事務所 提到...

顏兄您好, 我的應用都是傳送小資料, 沒傳送過這麼大的資料量, 您測試的比我還深入. UDP 的 AT 指令與 TCP 並無不同, 不過如您所知 UDP 是非連接性協定, 用來傳遞的資料是不可靠的, 我對 UDP 的測試也僅止於 NTP 應用而已, 抱歉無法給您完整答覆. 由於使用 AT 相當麻煩, 需接觸底層細節, 所以現在我幾乎沒再用 AT 韌體了, 改用 MicroPython 來操作 ESP8266, 細節就交給 MicroPython 韌體處理, 我只要專注應用層就好. 等我測到這部分時倒要看看是否有此問題. 請問您用兩個 ESP8266 通訊是獨立運作還是搭配 Arduino 呢?

Unknown 提到...

目前我ESP8266是在FPGA環境下運作,兩個算是獨立運作
Python目前也有在研究,但還沒應用在ESP8266上

Unknown 提到...

請問一個小問題
我ESP8266Reset後(AT+RST)
但是回傳的東西有時候會有Ready 有時候不會回傳Ready
因為我程式需要判斷有收到Ready才完成reset
但是有時候會收不到Ready,請問是什麼問題呢?

小狐狸事務所 提到...

以前我也有觀察到此現象, 原因不清楚, 因為沒有需要讀取 ready 所以就不深究了. 是否可改為偵測 'OK'?

Unknown 提到...

可以改成偵測"OK",但是我偵測"ready"的目的是為了準確判斷esp8266已經確實reset完成,如果只判斷到"OK"可能還沒reset完成

Unknown 提到...

作者您好
我現在下AT+CIPSEND的指令
在某個特定情況會出現"busy s....."
但有時候是"busy p....."
請問這兩個差在哪呢?

小狐狸事務所 提到...

是的, 以前測試時有時候會出現這兩個 busy, 我都直接重開機也沒去探究原因. 根據下面這篇, 'busy p ...' 表示 AT 指令正在執行; 'busy s ...' 表示指令正在傳送中, 停留很久顯示有問題 :

http://bbs.espressif.com/viewtopic.php?t=116

匿名 提到...

您好
如果我想要讓ESP8266間隔一定時間掃一次WIFI
該如何改寫程式

小狐狸事務所 提到...

那就在 loop() 迴圈裡定時下 AT+CWLAP 指令即可.

匿名 提到...

您好,我是之前上面那位,我之前試過在loop與setup
都試過加while迴圈跑esp8266.println("AT+CWLAP")
可是仍然沒有成功
請問是不是原本loop這兩個判斷是也要跟著修改??
if (esp8266.available()) {//若軟體序列埠 Rx 收到資料 (來自 ESP8266)
Serial.write(esp8266.read());//讀取後寫入硬體序列埠 Tx (PC)
}
if (Serial.available()) {//若硬體序列埠 Rx 收到資料 (來自 PC)
esp8266.write(Serial.read());//讀取後寫入軟體序列埠 Tx (ESP8266)

Unknown 提到...

您好,我是上面那位
我將程式改寫成下面這樣
但是掃出來的wifi與mac address都是只有一個
而且部分內容都是亂碼
但是如果更改delay時間 輸出又會變得很慢
想請教一下這邊該如何更改

void loop() {
if (esp8266.available()) { //若軟體串列埠 RX 有收到來自 ESP8266 的回應字元
unsigned long start = millis();
while (millis() - start < 500) {
at();
}
while (esp8266.available()) {
Serial.write(esp8266.read()); //在串列埠監控視窗顯示 ESP8266 的回應字元
}
}

}

void at()
{
esp8266.println("AT+CWLAP");delay(500);
}

小狐狸事務所 提到...

您好, delay 0.5 秒應該是不夠的, 因為掃描附近的基地台需要時間, 手動下指令就可發現 AT+CWLAP 回應時間至少要花約 5 秒以上, 基地台越多輸出時間越久, 所以放大 delay 應該是唯一的方法. 可能是 BUFFER 有限的關係, 附近基地台多時, 後面的輸出似乎也會漏掉. 亂碼的原因有兩個 : 串列埠誤碼, wifi 空中訊號誤碼.

Unknown 提到...

打擾了 我後來改成2250跑出最下面的情形
而且只能顯示2個wifi
如果將delay改成2250以上,它就會只跑一行就斷掉
請問老師這樣還有方法解決嗎?

void loop() {
if (esp8266.available()) { //若軟體串列埠 RX 有收到來自 ESP8266 的回應字元
unsigned long start = millis();
while (millis() - start < 2250) {
at();
}
while (esp8266.available()) {
Serial.write(esp8266.read());//在串列埠監控視窗顯示 ESP8266 的回應字元
}
}

}

void at()
{
esp8266.println("AT+CWLAP");delay(2250);
}



AT+CWLAP

+CWLAP:(4,"IPhone",-84,"e8:de:27:7ON-49C0",-83,"ac:20:2e:62:49:c8",1X⸮⸮j⸮⸮⸮H(ը⸮P⸮
+CWLAP:(4,"IPhone",-84,"e8:de:27:7d:c0:48",1,1N-49C0",-75,"ac:20:2e:62:49:c8",11l⸮5jz⸮(ji (⸮
+CWLAP:(4,"IPhone",-84,"e8:de:27:7d:c0:48",1,11,N-49C0",-74,"ac:20:2e:62:49:c8",11l⸮5jz⸮(ji (⸮
+CWLAP:(4,"IPhone",-83,"e8:de:27:7d:c0:48",1,11,N-49C0",-74,"ac:20:2e:62:49:c8",11l⸮5jz⸮4⸮⸮ (⸮
+CWLAP:(4,"IPhone",-84,"e8:de:27:7d:c0:48",1,11,ON-49C0",-73,"ac:20:2e:62:49:c8",1X⸮⸮jj⸮⸮H(ը⸮AP

+CWLAP:(4,"IPhone",-86,"e8:de:27:7d:c0:48",1,N-49C0",-82,"ac:20:2e:62:49:c8",11l⸮5jz⸮(ji (⸮
+CWLAP:(4,"IPhone",-83,"e8:de:27:7d:c0:48",1,11,N-49C0",-82,"ac:20:2e:62:49:c8",1

小狐狸事務所 提到...

請問為何要掃描 AP 呢? 我以前測試此指令時就發現 AT 指令其實不是很穩, 延遲較大, 所以最後都沒再用 AT 做通訊, 改為直接使用 ESP8266, 放棄 ARDUINO+ESP8266 組合.

Unknown 提到...

因為我們學校專題想製作一個定位器
當目標於室外時以gps模組掃經緯度傳回
若是抵達室內掃不到訊號
則使用esp8266模組掃描mac address
後透過api轉換經緯度
這是我們目前的想法

小狐狸事務所 提到...

了解, 最近有空我用 MicroPython 試試看. 用 AT 不是很穩, 有時抓到很多, 有時又很少, 我也沒空去研究原因, 不行就找別的方法, 時間較寶貴.

小狐狸事務所 提到...

Dear Jia Wei Cai :
我用 MicroPython on ESP8266 去掃描 AP, 發現 MAC 也是不完整, 詳見 :
http://yhhuang1966.blogspot.tw/2017/12/micropython-on-esp8266-ap.html

Unknown 提到...

謝謝老師的幫忙與測試
最近我們學校在忙期末考
要等到下個月中才會繼續作業

Unknown 提到...

老師好久不見~
想了解一下,假設我們使用esp8266當作開發版取代Arduino板
但是仍然使用Arduino IDE開發程式,
這樣直接持續掃描AP有可能會穩定嗎?

小狐狸事務所 提到...

要實驗才知道, 過年有空來試試

Unknown 提到...

謝謝老師的回應~
先前用arduino與esp8266做連線時是需要softwareserial,
而使用esp8266開發板時就不用特別虛擬吧?
有上網搜尋一些文章,比較沒看到使用Arduino IDE來寫
所以有點疑惑該如何改寫

小狐狸事務所 提到...

參考這篇 :
http://yhhuang1966.blogspot.tw/2017/09/arduino-ide-esp8266.html

Unknown 提到...

這篇之前我有看過
也按照上面的教程讓LED藉由ESP8266來控制閃爍
請問是不是用ESP當開發板以後,內部的AT指令就無法使用?
還是要用其他方法?

小狐狸事務所 提到...

當然, 用 Arduino IDE 寫的程式上傳 ESP 後就把 AT 韌體蓋掉了. 你的 C 程式是新的韌體.

Unknown 提到...

老師新年快樂~
我了解了,那麼請問不使用at指令的情況下該如何掃描ap?
之前有試過WiFi.scan的方式,但是單純只有掃描到ap名稱,而沒有mac

小狐狸事務所 提到...

找時間來試試看!

bluesky77856 提到...

老師您好我在MODE=3情況下使用AT+CIFSR指令查詢IP時,只有一組IP 另一組為MAC請問是哪裡出錯了呢?
我需要第二個IP進行網頁遠端遙控。煩請老師解答了。

小狐狸事務所 提到...

mode 3 應該有兩個 ip 喔! 用 AT+CWSAP? 確認真的在 mode 3 嗎?

小狐狸事務所 提到...

另外要用 AT+CWJAP="SSID","PWD" 連線無線基地台.

Unknown 提到...

老師您好,我想請問一下,我現在用APP inventor2來傳送網址資料(用url編碼),例:http://ip位置:port阜號/?X=R,給arduino+esp8266-01s,可是在序列阜監控視窗出現亂碼,輸出阜也沒有訊號,覺得是字串的轉換有問題,想請教一下錯在哪裡
//主迴圈
void loop()
{
if(ESP8266.available())
{
Serial.println("Something received");
if(ESP8266.find("+IPD,"))
{
String action;
Serial.println("+IPD, found");
connectionId = ESP8266.read()-'0';
Serial.println("connectionId: " + String(connectionId));
ESP8266.find("X=");
char s = connectionId;
if(s=='F')
{
action = "X=F";
forward(Rspeed,Lspeed);
}
else if(s=='B')
{
action = "X=B";
back(Rspeed,Lspeed);
}
else if(s=='R')
{
action = "X=R";
right(Rspeed,Lspeed);
}
else if(s=='L')
{
action = "X=L";
left(Rspeed,Lspeed);
}
else if(s=='S')
{
action = "X=S";
pause(Rspeed,Lspeed);
}
else
{
action = "X=?";
pause(Rspeed,Lspeed);
}
Serial.println(action);
httpResponse(connectionId, action);
}
}
}
//建立WIFI連線函式
boolean connectWiFi(int timeout)
{
do
{
ESP8266.println("AT+CWMODE=1");
Serial.println("AT+CWMODE=1");
delay(1000);
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASSWORD;
cmd+="\"";
ESP8266.println(cmd);
Serial.println("wait OK...");
delay(2000);
if(ESP8266.find("OK"))
{
Serial.println("Join AP Success");
sendESP8266Cmd("AT+CIFSR",3000);
sendESP8266Cmd("AT+CIPMUX=1",1000);
sendESP8266Cmd("AT+CIPSERVER=1,80",1000);
Serial.println("Server setup finish");
return true;
}
}while((timeout--)>0);
return false;
}
//回應用戶端函式
void httpResponse(int id, String content)
{
String response;
response = "HTTP/1.1 200 OK\r\n";
response += "Content-Type: text/html\r\n";
response += "Connection: close\r\n";
response += "Refresh: 8\r\n";
response += "\r\n";
response += content;
String cmd = "AT+CIPSEND=";
cmd += id;
cmd += ",";
cmd += response.length();
sendESP8266Cmd(cmd,200);
sendESP8266Data(response,200);
cmd = "AT+CIPCLOSE=";
cmd += connectionId;
sendESP8266Cmd(cmd,200);
}
//ESP8266傳送命令函式
void sendESP8266Cmd(String cmd, int waitTime)
{
ESP8266.println(cmd);
delay(waitTime);
while (ESP8266.available() > 0)
{
char a = ESP8266.read();
Serial.write(a);
}
Serial.println();
}
//ESP8266傳送數據函式
void sendESP8266Data(String data, int waitTime)
{
ESP8266.print(data);
delay(waitTime);
while (ESP8266.available() > 0)
{
char a = ESP8266.read();
Serial.write(a);
}
Serial.println();
}

小狐狸事務所 提到...

改用 ASCII 編碼試試看.

Unknown 提到...

你好,為什麼我的esp8266會一直重復循環scan start 一直自動掃描附近網路,打AT都沒有回應

匿名 提到...

老師您好, 請問esp8266 esp-07 用AT COMMAND 燒入 (破口燒入)有甚麼方式能得知ESP-07的實體位置?

小狐狸事務所 提到...

Sorry, 我手上沒有 esp-07. 實體位置是指 IP 嗎?

匿名 提到...

是的,老師

匿名 提到...

應該說是MAC ADDRESS 的位置要如何得知? 請老師解惑 3Q

小狐狸事務所 提到...

到所連線的無線基地台或路由器的管理頁面即可查到. 手機當分享器最容易查, 在 設定/連接/行動基地台與網路分享/行動基地台/ 點已連接裝置即可.

匿名 提到...

老師我從路由器端 無法看到他的實體ip 只能得知他的連線ip位置 請問老師我該如何得知 我是用lua語言撰寫

Unknown 提到...

老師你好,想向您請教一下為何我購買的esp-01s(baudrate=115200)會一直重復循環scan start並印出附近的無線網路名稱? 這是功能正常的表現嗎? 如果是的話,為何我傳送AT指令卻都沒有回應,只是繼續自動scan呢?

小狐狸事務所 提到...

Hi, 是一開機還沒燒錄程式就這副德性嗎? 坦白說, 我買過兩塊 ESP-01S 都不能用, 燒錄韌體都 OK, 就是沒反應, 最後放棄, 改買 D1 mini 板子來用, 價格差不了多少, 還有 reset 鍵, 也方便插在麵包板上.

Unknown 提到...

hi,是的一開始就是這樣,但跟您不一樣的是,程式燒錄都不成功,錯誤代碼都是這幾個:
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed
但用終端機測試卻都還是會scan
這樣的情況請問是應該要換一塊新的嗎?還是要換型號? 用esp-01?
回小狐狸事務所--2019/4/20

小狐狸事務所 提到...

ESP-01S 似乎有點怪, 之前花了點時間爬 STACKOVERFLOW 等論壇文章, 試過所提供的辦法皆無效, 想想時間較寶貴就乖乖回來用 ESP-01. 原先以為 ESP-01S 比較新應該更好用, 但前後買兩片都是這樣就死心了.

Unknown 提到...

感謝回答
那請問有曾經回去請廠商檢修過嗎? 知道是因為什麼問題導致的嗎?
那是不是說換成esp-01就會沒有這個問題了呢?
回小狐狸事務所--2019/4/21

小狐狸事務所 提到...

因為是網購, 也沒有去追問題, 我手上十幾片 ESP-01 都沒問題

Unknown 提到...

了解 非常感謝幫忙
這問題真的困擾我非常久

Unknown 提到...

你好 我換過esp-01之後 AT指令是OK了 但是compile過了之後 上傳程式碼時 卻又遇到error:
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed
而且上網查似乎沒有人提出確定的解決辦法
求幫助

小狐狸事務所 提到...

Hi, 燒錄上傳前要先拔掉電源將 GPIO0 接地才燒得進去, 上傳成功後拔電源與 GPIO0 接電線.

Unknown 提到...

有呢 我都有這樣做優

Shen. 提到...

我改 baudrate 用這個耶
AT+UART=9600,8,1,0,0

小狐狸事務所 提到...

每一個 ESP8266 韌體的預設 BAUDRATE 可能不一樣喔

andy-liu 提到...

目前使用大陸買的esp8266燒寫Blynk的範例程式成功控制多個esp8266串上繼電器,這樣能控制多個裝在天花板的led燈,但需要先至blynk申請一組控制碼,然後再將ssid及密碼填入後燒寫,
這樣外出常需要帶筆電出去燒寫,我在露天買過一組esp8266模組,他事先將esp8266設成ap模式讓手機用wifi連入,然後由手機內填入blynk的密碼及ssid,password,覺得這樣真是太聰明了,現在人手一支手機就可以設定模組了,可是遍循網路及範例愚人還是無法解決這個課題,不知老師有何想法?

小狐狸事務所 提到...

您可以參考我之前做的測試中的程式碼 :

https://yhhuang1966.blogspot.com/2016/07/arduino-nano-esp8266.html

其中的 setWifi() 可能就是您在找的功能. 可以想辦法與 Blynk 程式碼做結合.