一、 背景
nRF24L01的成本较低,但内部需通过SPI通信,略显复杂,同时RF过于专用,接入其他系统时需要转换,不方便。
ESP8266是乐鑫公司推出的廉价、但几乎全能的WIFI芯片,被各种智能硬件广泛使用,根据其datasheet,不但支持SPI,也可通过I2C、UART等方式进行通信,尤其是UART,直接支持AT指令,大大简化开发难度,相当便利。本文即采用AT模式。
ESP8266开发板,TB约12块左右,右侧为ESP8266,左侧为25Q80BVSIG,1M闪存。
二、接线
1、ESP8266开发板引脚图
TX:串口写
GND:接地
CH_PD:高电平为可用,低电平为关机
GPIO2:可悬空
RST:重置,可悬空
GPIO0:上拉为工作模式,下拉为下载模式,可悬空
VCC:3.3V(切不可接5V,烧片)
RX:串口读
2、接线示意
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,如下:
可看到调试串口输出的AT指令,已经连接到WIFI,并取得192.168.80.188的IP.
另外,2121端口被也监听成功。
可用telnet 模拟客户端,连接建立成功后,输入数据0~D,hello world。
输入的数据可从COM监视器中看到对应的AT指令。如下图:
四、例子代码解析
从原有例子中删除了软串口相关的处理,如下
#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); // 发送数据自动以 结尾(默认设置)
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”);
}
}
评论
查看更多