esp8266与arduino的实例教程分析

通信设计应用

58人已加入

描述

  一、 背景

  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、接线示意

esp826

  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,如下:

  esp826

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

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

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

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

  esp826

  四、例子代码解析

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

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

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分