esp8266与arduino的实例教程分析



esp8266与arduino的实例教程分析

 一、 背景

nRF24L01的成本较低,但内部需通过SPI通信,略显复杂,同时RF过于专用,接入其他系统时需要转换,不方便。

ESP8266是乐鑫公司推出的廉价、但几乎全能的WIFI芯片,被各种智能硬件广泛使用,根据其datasheet,不但支持SPI,也可通过I2C、UART等方式进行通信,尤其是UART,直接支持AT指令,大大简化开发难度,相当便利。本文即采用AT模式。

ESP8266开发板,TB约12块左右,右侧为ESP8266,左侧为25Q80BVSIG,1M闪存。

esp8266与arduino的实例教程分析

  二、接线

  1、ESP8266开发板引脚图

esp8266与arduino的实例教程分析

TX:串口写

GND:接地

CH_PD:高电平为可用,低电平为关机

GPIO2:可悬空

RST:重置,可悬空

GPIO0:上拉为工作模式,下拉为下载模式,可悬空

VCC:3.3V(切不可接5V,烧片)

RX:串口读

  2、接线示意

esp8266与arduino的实例教程分析

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个监听连接,如要增大须修改其头文件中的如下两个宏:

1 define SERVER ‘4’

2 define MAX_CONNECTIONS 312

2) 代码修改

该库设计很灵活,设置了3个串口,入串口,出串口和调试串口。

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

3) 运行

加载运行后,如WIFI设置正常,则可接入WIFI并取得IP,如下:

esp8266与arduino的实例教程分析

可看到调试串口输出的AT指令,已经连接到WIFI,并取得192.168.80.188的IP.

另外,2121端口被也监听成功。

可用telnet 模拟客户端,连接建立成功后,输入数据0~D,hello world。

输入的数据可从COM监视器中看到对应的AT指令。如下图:

esp8266与arduino的实例教程分析

  四、例子代码解析

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

#include 《ESP8266wifi.h》

#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”);

}

}