2017/2/12

ESP8266 ESP-01s測試(03)當TCP server 接聽訊息

ESP8266 ESP-01s測試(03)當TCP server 接聽訊息

AT command 的設定有些會寫入到韌體有些則斷電後消失,要讓ESP8266工作在我們想要的設定環境可寫到韌體的我們可直接下AT command進行設定,不會寫到韌體的則必需在程式中設定。ESP826支援TCP/UDP transport layer協定,同時也可設定成transparent mode讓兩個裝置直接傳送息。這次要把ESP-01s設定成連上自己的區網的router,透過WiFi 網路DHCP取得IP,並演TCP server的角色,接聽使用者WiFi網路送來的訊息,並把此訊息轉給arduino uno使其可依此訊息開啟或關閉一個LED,類似的方法可應用到如遙控車或家電控制等場合。

假設Baud rate 已設成9600,接下來的實驗是把ESP-01s設成TCP server 接受client傳入訊息。ESP8266有三種站台模式
1. STA (Station) 是指當成一般的站台,連接wifi網路。
2. softAP (Soft Access Point)軟體熱點,是指當成基地台。
3. softAP+ STA,是指以上兩者的功能都有,能夠當成無線基地台,且能夠連上存在的wifi網路。

要當TCP server設成1 或3的模式都可以,設我們要設成3,則我們可進行如下操作:首先先詢問目前的站台模式,
AT+CWMODE? 
系統會回應(晶片預設成2) 
+CWMODE:2 

OK 
接著下
AT+CWMODE_DEF=3 
系統會回應
OK
若再下AT+CWMODE?查詢就會得到+CWMODE:3的回應。
接著我們想連自家的wifi網路,可先看看有那些wifi網路,可下
AT+CWLAP
回應會如:
+CWLAP:(4,"********",-53,"e8:94:f6:74:71:be",1,15,0) 
+CWLAP:(4,"********",-75,"e8:94:f6:a0:16:46",1,26,0) 
+CWLAP:(4,"*********",-87,"1c:49:7b:3b:15:4a",5,-7,0) 
星號是接收到wifi訊號的ssid,接著是要連到某一路ssid,則可下
AT+CWJAP_DEF=,
其中ssid是wifi網路的通道id,而pwd是該通道的登入密碼,假設id是”abc”而密碼是”12345678”,則下
AT+CWJAP_DEF=”abc”, “12345678”
若連線成功會回應:
WIFI CONNECTED 
WIFI GOT IP 

OK 
如果沒有成功就要查查密碼是否正確或是裝置是否有問題。
之前測試過把ESP-01s當server接受client送訊息控制arduino上的LED一切正常。但這時邊寫邊試突然下AT時竟然晶片都不反應OK,RST幾次都一樣,想說是不是晶片燒壞了或韌體出問題,只好重新燒韌體,韌體檔是ESP8266_DIO_8Mbit_V1.5.4.1_20161202.bin,燒錄完成後用AT+GMR看版本是和買來時內建的版本一樣,再試命令,很好有反應OK了,但是設定好server後由TCP Client一直都連不上,想說是不是這個新版韌體有題,unstable,只好試著找較舊的版本來試,找到firmware1.0.1.bin這個韌體,燒錄好後再測試,嘿!一切正常了。用AT+GMR看這個版本如下:
AT+GMR 
AT version:0.23.0.0(Apr 24 2015 21:11:01) 
SDK version:1.0.1 
compile time:May 9 2015 16:00:00 

OK
所以我現在是用著個版本。以下進入主題。
要寫AT命令列的程式要先知道那些指令斷電後還有效(有寫入韌體),那些斷電後無效。有寫入韌體的就不用在寫程式裡,事先用AT 命令列設定好就可以,沒寫入韌體的設定就必需寫在程式,每次送電都要再執行。這次測試的目標是「把ESP-01s當TCP server,接受client送訊息來控制arduino板上的一顆LED」。首先如上述把站台模式設成1 or 3,再連上自己的wifi網路。
因我希望server能有個固定IP,測試較方便,所以下
AT+CIPSTA_DEF="192.168.1.180"
如回OK就設好了。可用AT+CIPSTA_CUR? 查看是否成功。這個指令也會寫入韌體,所以重送電後晶片就會連上網路取得固定IP。
接著設server,這些設定都不會寫入韌體,所以要寫在程式裡。
因多重連線的預設是0表示只能單一連線,但要TCP server一定要設成多重連線所以下:
AT+CIPMUX? 查看,回應若是0則要改成1,所以再下
AT+CIPMUX=1,回應OK後再下
AT+CIPSERVER=[,]
其中mode=0表示關閉, 表示建立,port為選項,預設是333。如下:
AT+CIPSERVER=1,12345 表示建立server port為12345。此時若找來連線軟體就可連上server,稍後再說明連線軟體。server建立後就等client 端連線。當收到訊息後回應格式如下:
+IPD, , [, , ]:
遠端的 IP, 由 "AT+CIPDINFO=1" 命令致能,若沒致能則不顯示。
遠端的port, 由"AT+CIPDINFO=1"命令致能,若沒致能則不顯示。
連線的id
資料Byte的長度
data received收到的資料。
如IPD,0,1:1 表示收到連線id 0送來一個byte資料為1。這在判斷如何以收到的訊息執行控制動作很重要。最簡單的程式寫法是收到0關閉LED,收到1接通LED。但TCP server運作時如果一定的時間內沒有連線進來會自動關閉伺服器,所以我們可控制伺服器動關閉的時間,下
AT+CIPSTO=
以上設定就在arduino 的 setup() {} 裡設定。而loop() {}部份執行接收訊息判斷及執行特定動作。要判斷接收訊息可把變數設成如String receivedDate;,再用.readString()取出字串,如receivedDate = ESP8266.readString();,此接著用.endsWith()函數取出字串的最後部份進行判斷,如if(receivedDate.endsWith("1") ,判斷後就可採取需要的動作。我的程式碼如下:
#include <softwareserial.h>
#include 
SoftwareSerial ESP8266(10, 11); // RX,TX
int ledPin = 8;
String receivedDate;
void setup() {
   Serial.begin(9600);
   ESP8266.begin(9600);
   ESP8266.write("ATrn");
   delay(1000);
   ESP8266.write("AT+CIPMUX=1\r\n");
   delay(1000);
   ESP8266.write("AT+CIPSERVER=1,12345\r\n");
   delay(1000);
   ESP8266.write("AT+CIPSTO=0\r\n");
   pinMode(ledPin,OUTPUT);
}
void loop()
{
    // Keep reading from ESP8266 and send to Arduino Serial Monitor
   if (ESP8266.available()) {
      receivedDate = ESP8266.readString();
      if(receivedDate.endsWith("1")) 
         digitalWrite(ledPin,HIGH);
      if(receivedDate.endsWith("0"))
         digitalWrite(ledPin,LOW); 
      Serial.println(receivedDate);
      delay(50);
    }
    // Keep reading from Arduino Serial Monitor and send to ESP8266
   if (Serial.available())  {
      ESP8266.write(Serial.read());
    }
}
燒好就可進行LED的控制。LED是接在 pin 8,注意arduino的輸出接至LED,再接個1k電阻再接地比較好。還有arduino的輸出是5v,而ESP8266的操作電壓3.3,為求保險可在Software serial port的輸出pin 11接上個1k電阻再接到ESP-01s的接收端。

要測試時電腦先連接到ESP-01s連接的相同wifi通道,再找電腦端的TCP server軟體,我是找到TCP Test Tool,安裝完後畫面如下:

電腦版TCP server 測試軟體 TCP Test Tool 3.0
輸入好我們設定的server的IP及port後按連線,realterm就會回應,因我們程式設定送1表示開啟而送0表示關閉LED,分別按1及0就可控制LED了。




在android手機也可搜一下tcp server,找個免費的來試試。我是找到TCP Telnet Terminal,APP中有幾個按鈕可設定,如圖。

手機版TCP server 測試軟體TCP Telnet Terminal 

這樣這可以用手或電腦控制arduino 上的LED,依此法可延伸至控制自走車的前、後、左、右等控制。

沒有留言:

張貼留言