Arduino+ESP8266透傳方式實現POST訪問

摘要:對ESP8266以透傳方式訪問網絡的過程當中遇到的大大小小的坑,以及解決辦法進行了記錄和說明,並以Arduino做爲主控板進行POST方式訪問OneNET平臺。html

硬件:api

  1. Alientek的ATK-ESP8266模塊,帶UART-WiFi,官方固件帶AT指令,波特率默認115200(8位數據位,1位中止位,無校驗)
  2. Arduino UNO
  3. PC機
  4. USB轉TTL模塊
  5. 杜邦線若干

軟件:網絡

  1.     串口軟件:xcomV2.0或USR-TCP232-Test,前者能保存多條AT命令但無網絡功能,後者只能發送單條AT命令但有網絡功能
  2.     ArduinoIDEv1.8.0

1、使用USB轉TTL模塊鏈接ATK-ESP8266和PC機進行調試(非必須)工具

    這個步驟可使用串口工具下發AT指令對ESP8266進行手工配置,或進行調試以驗證模塊功能是否正常。oop

ATK-ESP8266模塊是這樣的,有6個引腳,使用其中的4個:VCC(3.3V~5V),GND,TXD,RXDpost

 

鏈接方式以下表,注意:其餘廠家的ESP8266模塊可能接USB-TTL的3.3V才能正常,不然會出現亂碼或其餘異常錯誤,這個供電問題值得注意。ui

USB-TTL ESP8266
5V VCC
GND GND
RX TX

TXspa

RX

而後將USB-TTL插入PC機USB,部分PC機(主要指win10如下)須要安裝CH340驅動才能識別該串口工具。3d

接下來打開串口工具,這裏是xcom,以下圖。調試

注意幾點:

  1. 串口選擇,需對應到正確的串口;
  2. 波特率默認115200,其餘如圖紅框所示;
  3. 勾選發送新行;
  4. 發送指令時,不須要敲回車換行,點擊發送就行(前提是知足3);
  5. 因PC機經過串口與ESP8266通訊,ESP8266鏈接AP,因此PC機是否聯網無所謂(ESP8266做爲AP,PC機去鏈接這個AP的模式除外) ;
  6. 若發送最簡單的AT指令,都得不到應答(正確的應答是OK,異常如亂碼或無響應等),可能緣由主要有
    1. RX,TX接錯,如ESP8266的RX接了USB-TTL的RX
    2. 不是純英文字符AT,或者沒有按照上圖紅框幾個關鍵點設置串口工具
    3. 波特率錯誤,覈實下ESP8266模塊的默認波特率(這裏所購ATK-ESP8266模塊的默認波特率是115200)
    4. 電壓問題,該問題比較隱蔽不易發現,因不一樣廠商生產緣由,即便都是以ESP8266做爲核心部件,最終暴露出來的電源引腳電壓要求都存在差別。還有,你用的USB-TTL模塊也多是個坑爹貨,若質量不過關,電壓不穩的話也沒法獲得正確應答。怎麼排查呢?其實這是我碰到的一個大坑,我只能說下我怎麼發現的。我用的ATK-ESP8266模塊同時支持3.3v和5v供電,我發現僅在5v時能被PC機發現串口鏈接,3.3v時根本發現不了。後來找了正點原子的技術支持,說他們家的模塊在3.3v供電下也能鏈接串口,我立刻明白是個人USB-TTL問題。
    5. 固件問題,若是是的話,就恭喜你中獎了,要麼放棄該模塊,要麼老老實實按照教程重刷。但重刷能解決問題的關鍵是確認是固件問題,不然刷了也白刷。至於如何確認,仍是須要點經驗和專業工具的,搞不定的話想辦法找人求助吧。

2、Arduino+ESP8266透傳(無USB-TTL)

使用Arduino的軟串口方式鏈接ESP8266。關於軟串口,下面連接裏這位哥們寫的很清楚。

軟件模擬串口通訊——SoftwareSerial庫的使用

https://www.arduino.cn/thread-47262-1-1.html

 

鏈接方式以下,相似USB-TTL鏈接方式,需一樣注意其餘廠家的ESP8266模塊可能接3.3V才能正常,不然會出現亂碼或其餘異常錯誤。

Arduino UNO ESP8266
5V VCC
GND GND
RX TX

TX

RX

 

 

C代碼以下,用ArduinoIDE下載到主控板,這段代碼表示主控板以透傳方式與ESP8266交互,配置需經過串口工具手動下發AT指令給ESP8266模塊。故需在下載完代碼後,不要打開Arduino的串口監控,而是使用串口工具下發命令至主控板。注意:這裏Arduino硬件串口波特率爲9600,軟串口Arduino-ESP8266爲115200(板子默認的值)。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("hardware serial!");

  mySerial.begin(115200);
  mySerial.println("software serial!");
}

void loop() {
  // put your main code here, to run repeatedly:
 if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

程序下載完成後,打開串口工具xcom,軟件設置同前一節,但波特率爲9600(也能夠是其餘值,與下載程序保持一致)。

只要xcom對於下發的AT指令返回了OK,就說明一切正常。其餘指令或者剛上電時會有亂碼出現,這個問題不用管,因ESP8266固件初始波特率爲74880,與串口工具設置的不一致形成。

若出現亂碼或不響應,繼續回頭參考前一節總結的幾點緣由。

接下來就可使用AT指令對ESP8266進行配置了,經常使用指令舉例以下,完整的自行查找資料吧,很好找。

AT

AT+RST,重啓

AT+GMR,查看版本號

AT+CWMODE=3,設置爲AP+STA模式

AT+CWJAP="wifi名稱","密碼",鏈接WiFi

AT+CIFSR,查看獲取的IP

 

3、Arduino+ESP8266透傳模式POST數據到OneNET

    關於OneNET部分的操做,不是本文重點,這裏不進行說明。

    POST部分的關鍵代碼以下,其中your_device_id和your_api_key須要換成本身的,type=3必不可少,表示datapoint的數據格式。

void post(){
  mySerial.println("AT+CIPSEND");
  delay(3000);
  echo();

  mySerial.println("POST /devices/your_device_id/datapoints?type=3   HTTP/1.1");
  mySerial.println("Host: api.heclouds.com");
  mySerial.println("api-key: your_api_key");
  mySerial.println("Content-Length: 20");
  mySerial.println("");
  mySerial.println("{\"http\":15}");   //value of datapoints
  delay(3000);
  echo();
    
  mySerial.println("+++");
  delay(3000);
  echo();
  
  Serial.println("over");
}

 

程序下載後,經過串口工具能夠觀察到HTTP 200 OK,即代表POST成功。過程可能會出現個別400 ERROR,估計是模塊某些命令未執行完成形成。出現HTTP 200 OK,便可去OneNET觀察數據流了,以下圖所示數據已成功上雲。

 

    至此,完成了ESP8266的數據上報,其餘網絡應用就能夠觸類旁通了。文中部分未詳細說明的,還有不少大咖寫的比較清楚,請各位自行參考。

相關文章
相關標籤/搜索