2017/2/21

ESP8266 ESP-01s測試(04)TCP client連Thinkspeak上傳溫度與濕度

ESP8266 ESP-01s測試(04)TCP client連Thinkspeak上傳溫度與濕度

試過ESP-01s當TCP Server後在試當成Client端時折騰了很多時日,因為設定好TCP Client後連接區網內的server(用TCP Test Tool當本機server)沒問題,但連到Internet就不行,如連ThinkSpeak的"184.106.153.149" 80埠時都出現error連不上,原以為是ESP-01被我玩壞了,再網購了每個79元的兩個模組,再試還是怪怪的,花了很久的時間在想這個問題,最後才找到真正的原因,最早買的那個模組也再經測試,並沒有壞。問題出在我把ESP-01設成固定IP,模組預設是自動由DHCP取得IP,因當server時我希望有個固定IP可用手機連線,下

AT+CIPSTA_DEF=”192.168.1.180”
用AT+CIPSTA_CUR? 可查看到到固定IP,當server時就連此IP。這是導致上述當client連不上外網的主因。要取消固定IP當然可用
AT+RESTORE
讓模組恢復初始狀,但這樣原先設好的Baud rate、wifi連線等都會被清除。查看了AT指令說明文件,找到可用
AT+CWDHCP=1,1
恢復自動取得IP,參數第一個1是指要設定station若是0則表示要設定softAP,參數第二個1表示要設成DHCP enable,若0表示DHCP disable,當設成固IP時station的DHCP功能自動變成disable。下此指令後會回應GOT IP,所以若當server要設成固定IP時,要當成Client記得要下此指令取消固定IP,這樣才能連上外網。
先把ESP-01連上wifi網路並自動取得IP。要設成TCP Client先決定是要單一連線或多重連線,一般單一連線就可,所以先下:
AT+CIPMUX?
看看,如果不是0則再下
AT+CIPMUX=0
之後先用TCP Test TOOL軟體測試看看可否連上Server並傳送字元,啟動該軟體,可見右上角有IP及Port的資訊,按下Bind後便會在本機啟動TCP server,如下圖例子是192.168.1.178 /12345,

之後在realterm下
AT+CIPSTART=”TCP”,” 192.168.1.178 “,12345
便可連上server,會見回應Connect OK字樣,同時TCP Test TOOL也會顯示連線狀況,之後假設我們要傳4個字到server,則下
AT+CIPSEND=4
則會回應OK並帶出”>”符號等待輸入,再送出4 個字如1234,便會見TCP Test TOOL回應如下圖:

這表示server已經收到我們傳送的訊息。之後可切斷連線,下
AT+CIPCLOSE
可見TCP軟體上的連線訊息不見了,這樣表示ESP-01連到local的server沒有問題。接著試連外網,因Thinkspeak的 IP是184.106.153.149,且port是80,所以下
AT+CIPSTART=”TCP”,”184.106.153.149“,80
會見回應Connect OK字樣,再下如AT+CIPSEND=4看看,也會見回應OK,再下1234送出字元會見回應很多訊息表示格式不對,最後並關閉連線,這樣表示TCP client連到 Thinkspeak沒有問題了。

這個實驗要用 DHT11感測溫度與濕度並把結果傳到Thinkspeak,所以先要測試讓DHT11讀出溫濕度,參考網上的資料並加入library到arduino IDE,但編繹時都出錯,可能是 IDE版本的問題,最後到官網
https://learn.adafruit.com/dht/downloads
下載兩個lib檔並加到IDE才可正常編繹,參考別人的程式碼稍加修改可在realterm看到溫度與濕度的顯示,這樣就可進入下一步驟把數據上傳。其實DHT11內部有個CPU算是有智慧的裝置,不用lib只要幾秒鐘詢問一次便可把數據讀出,程式不會很難,但用lib程式可以減化。
接下來就是到Thinkspeak 申請一個帳號,設定channel成兩個欄位field1指定為溫度field2指定為濕度,並紀錄下API key,這樣便可把數據上傳,這部份網上資料很多就不多敘述。設定好後可在網頁的網址列貼上(AAAA字串改成實際的Key)
http://api.thingspeak.com/update?key=AAAAAAAAAAAAAAAAAAA&field1=25.5&field2=75.2
貼上後網頁會回應數字1,表示上傳成功。接下來就是整合程式碼,把數據上傳。程式的重點在於每隔一段時間啟動TCP client連線到Thinkspeak,再申請要上傳的數據量,然後利用HTTP的GET method依命令格式含讀到的數據上傳,之後關閉連線。我的程式碼如下:
#include <dht.h>
#define DHTPIN 2
#define DHTTYPE DHT11
#include <softwareserial.h>
SoftwareSerial ESP8266(10, 11); // RX | TX
String IP = "184.106.153.149"; // IP of Thingspeak
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor
void setup() {
   Serial.begin(9600);
   ESP8266.begin(9600);
   Serial.println("DHT11 test!");
   dht.begin();
}
void loop() {
   delay(2000);
   float h = dht.readHumidity();
   float t = dht.readTemperature();
   if (isnan(h) || isnan(t) ) {
     Serial.println("Failed to read from DHT sensor!");
     return;
   }
   String HH = String(h);
   String TT = String(t);
   Serial.println(HH);
   Serial.println(TT);
   updateTemp(TT,HH);
}
void updateTemp(String TT, String HH)  {
   String TCPcmd="AT+CIPSTART="TCP","";
   TCPcmd += IP;
   TCPcmd +="",80rnrn";
   ESP8266.print(TCPcmd);
   delay(2000);
   if (ESP8266.find((char*) "Error")) {
      Serial.println("Connection Failed");
      return;
   }
   String GETcmd="GET /update?key=AAGPTEI575IUAAAA&field1=";
   GETcmd += TT;
   GETcmd += "&field2=";
   GETcmd += HH;
   GETcmd +="rnrn";
   ESP8266.print("AT+CIPSEND=");
   ESP8266.println(GETcmd.length());
   delay(200);
   if (ESP8266.find('>'))
       ESP8266.println(GETcmd);
   ESP8266.print("AT+CIPCLOSE");
}
上傳過程中可用手接觸DHT11使溫濕度產生變化,這樣才能看到有變化的數據,感覺Thinkspeak最快是每15秒接受一次數據,所以上列程式碼中的delay可以設久一點,如每分鐘上傳一次。這樣便完成一個簡單的ESP-01的IoT應用。

沒有留言:

張貼留言