Arduino使用ESP8266通信的实践

  • 列表内容

一、 背景
nRF24L01的成本较低,但内部需通过SPI通信,略显复杂,同时RF过于专用,接入其他系统时需要转换,不方便。
ESP8266是乐鑫公司推出的廉价、但几乎全能的WIFI芯片,被各种智能硬件广泛使用,根据其datasheet,不但支持SPI,也可通过I2C、UART等方式进行通信,尤其是UART,直接支持AT指令,大大简化开发难度,相当便利。本文即采用AT模式。

ESP8266开发板,TB约12块左右,右侧为ESP8266,左侧为25Q80BVSIG,1M闪存。
Arduino使用ESP8266通信的实践_第1张图片

二、接线
1、ESP8266开发板引脚图
Arduino使用ESP8266通信的实践_第2张图片

  • TX:串口写
  • GND:接地
  • CH_PD:高电平为可用,低电平为关机
  • GPIO2:可悬空
  • RST:重置,可悬空
  • GPIO0:上拉为工作模式,下拉为下载模式,可悬空
  • VCC:3.3V(切不可接5V,烧片)
  • RX:串口读

2、接线示意

ESP8266 ArduinoMega ArduinoUuno
TX 19(RX1) 0(RX0)
GND GND GND
CH_PD 5(自由指定) 5(自由指定)
GPIO2 - -
RST - -
GPIO0 - -
VCC 3.3V 3.3V
RX 18(TX1) 1(TX1)

ESP8266的串口默认波特率为115200,mega也可直接接RX0/TX0,
为调试方便起见,本文中RX0/TX0留做调试窗口,用RX1/TX1和芯片交互。
如果是UNO,如果要看调试信息,只能增加一个软串口。

三、代码&运行
虽然可以直接通过串口直接读写AT指令,但指令较多,处理繁琐,
找到有如下的库对AT指令做了封装,使用十分便利,推荐。
Git地址为:
https://github.com/ekstrand/ESP8266wifi.git

具体AT指令及ESP8266相关文档,可见乐鑫官方站点:
http://espressif.com/zh-hans/support/download/documents

1) ESP8266库安装
下载上面的ESP8266的库后,将其复制到Arduino安装目录下的libraries目录下,启动ArduinoIDE后,从例子中选择ESP8266_tcp_cli。
该库默认支持3个客户端连接和1个监听连接,如要增大须修改其头文件中的如下两个宏:

define SERVER '4' 
define MAX_CONNECTIONS 3

2) 代码修改
该库设计很灵活,设置了3个串口,入串口,出串口和调试串口。
其中入串口和出串口用于AT命令发送和接收,和ESP8266的串口相连,调试串口可显示具体交互情况(AT指令信息等)原例子中采用的是UNO,因其只有一个硬串口,所以改为Mega适用,以查看调试信息。

3) 运行
加载运行后,如WIFI设置正常,则可接入WIFI并取得IP,如下:
Arduino使用ESP8266通信的实践_第3张图片

可看到调试串口输出的AT指令,已经连接到WIFI,并取得192.168.80.188的IP.
另外,2121端口被也监听成功。
可用telnet 模拟客户端,连接建立成功后,输入数据0~D,hello world。
输入的数据可从COM监视器中看到对应的AT指令。如下图:

Arduino使用ESP8266通信的实践_第4张图片

四、例子代码解析

从原有例子中删除了软串口相关的处理,如下

#include 

#define esp8266_reset_pin 5
#define SERVER_PORT "2121"
#define SSID "XXXX"
#define PASSWORD "yourpass"

// 初始化,串口1和ESP8266交互,串口0做调试输出, pin5做reset
ESP8266wifi wifi(Serial1, Serial1, esp8266_reset_pin, Serial);

void processCommand(WifiMessage msg);
uint8_t wifi_started = false;

// 自定义的应用层命令,可根据自身应用修改
const char RST[] PROGMEM = "RST";
const char IDN[] PROGMEM = "*IDN?";

void setup() {

  // 调试串口启动,波特率可随意指定
  Serial.begin(115200);

  // ESP8266默认波特率为115200(可用AT指令修改)
  Serial1.begin(115200);
  while (!Serial) // 等待串口初始化成功
    ;
  Serial1.println("Starting wifi"); // 命令
  Serial.println("Starting wifi");  // 调试log输出

  wifi.setTransportToTCP();       // TCP模式(默认设置)
  wifi.endSendWithNewline(false); // 发送数据自动以\r\n结尾(默认设置)

  wifi_started = wifi.begin();    // WIFI启动
  if (wifi_started) { // 如果WIFI初始化成功
    wifi.connectToAP(SSID, PASSWORD); // 指定用户名密码连接WIFI
    wifi.startLocalServer(SERVER_PORT); // 本机(Arduino)监听2121端口(做服务端)

  } else {
    // ESP8266 isn't working..
    Serial.println("ESP8266 isn't working..");
  }
}

void loop() {

  static WifiConnection *connections;

  // check connections if the ESP8266 is there
  if (wifi_started)
    wifi.checkConnections(&connections); // 检查/获取当前所有连接的状况

  // check for messages if there is a connection
  for (int i = 0; i < MAX_CONNECTIONS; i++) { // 默认最大为3
    if (connections[i].connected) {
      // See if there is a message
      WifiMessage msg = wifi.getIncomingMessage();

      if (msg.hasData) { // 如果有数据
        processCommand(msg);
      }
    }
  }
}

void processCommand(WifiMessage msg) { // 数据处理函数
  char espBuf[MSG_BUFFER_MAX];
  int set;
  char str[16];

  Serial.print(msg.message);

  // 以下为应用层面的处理
  sscanf(msg.message, "%15s %d", str, &set);
  Serial.print(str);
  Serial.println(set);

  if ( !strcmp_P(str, IDN) ) {
    wifi.send(msg.channel, "ESP8266wifi Example");
  }
  // Reset system by temp enable watchdog
  else if ( !strcmp_P(str, RST) ) {
    wifi.send(msg.channel, "SYSTEM RESET...");
    // soft reset by reseting PC
    asm volatile ("  jmp 0");
  }
  // Unknown command
  else {
    wifi.send(msg.channel, "ERR");
  }
}

五、参考URL
详细参考(英语):
https://github.com/ekstrand/ESP8266wifi
http://blog.csdn.net/john_yike/article/details/47058857

六、更多文章
ESP8266可以和Arduino配合使用,充当起为Arduino进行Wifi连接、网络处理的任务。
但其实esp8266本身对比arduino,功能、性能方面均是有过之而无不及,实有杀鸡用牛刀大材小用之感。
更多ESP8266的文章,请见如下:
https://blog.csdn.net/ydogg/article/category/6930257

你可能感兴趣的:(Arduino,ESP8266)