Arduino+ESP8266透传方式实现POST访问

℡╲_俬逩灬. 提交于 2019-11-30 14:25:11

摘要:对ESP8266以透传方式访问网络的过程中遇到的大大小小的坑,以及解决办法进行了记录和说明,并以Arduino作为主控板进行POST方式访问OneNET平台。

硬件:

  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

一、使用USB转TTL模块连接ATK-ESP8266和PC机进行调试(非必须)

    这个步骤可以使用串口工具下发AT指令对ESP8266进行手工配置,或进行调试以验证模块功能是否正常。

ATK-ESP8266模块是这样的,有6个引脚,使用其中的4个:VCC(3.3V~5V),GND,TXD,RXD

 

连接方式如下表,注意:其他厂家的ESP8266模块可能接USB-TTL的3.3V才能正常,否则会出现乱码或其他异常错误,这个供电问题值得注意。

USB-TTL ESP8266
5V VCC
GND GND
RX TX

TX

RX

然后将USB-TTL插入PC机USB,部分PC机(主要指win10以下)需要安装CH340驱动才能识别该串口工具。

接下来打开串口工具,这里是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. 固件问题,如果是的话,就恭喜你中奖了,要么放弃该模块,要么老老实实按照教程重刷。但重刷能解决问题的关键是确认是固件问题,否则刷了也白刷。至于如何确认,还是需要点经验和专业工具的,搞不定的话想办法找人求助吧。

二、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

 

三、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的数据上报,其他网络应用就可以举一反三了。文中部分未详细说明的,还有很多大咖写的比较清楚,请各位自行参考。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!