ESP8266: AT + Arduino parser

Como ya comenté en el artículo anterior, mediante un Arduino que maneje el puerto serie y los comandos AT del ESP8266, se puede hacer un intérprete de texto que lleve a cabo una función dada por una solicitud GET.

En este caso si escribimos en la URL del navegador 192.168.1.177/LED1, cambiaremos el estado del LED 13, el que está integrado en la placa.

Es un ejemplo muy simple y poco práctico, ya que mediante comandos AT va un poco lento. Dejo el código a continuación.

 

#include <SoftwareSerial.h> //Librería para crear puerto serie por software
 
#define DEBUG true //Imprimir resultados por puerto serie
 
SoftwareSerial esp8266(2,3); // Arduino RX pin 2, TX pin 3
                             // Conectar el TX del ESP al pin 2, y el RX del ESP al pin 3
void setup()
{
  Serial.begin(9600);
  esp8266.begin(9600); // La velocidad podría ser distinta, prueba con 115200
  pinMode(13,OUTPUT);
 
  //Enviar los comandos AT
  sendData("AT+RST\r\n",2000,DEBUG); // reset
  sendData("AT+CWMODE=3\r\n",1000,DEBUG); // configura como AP+STA
  sendData("AT+CWJAP=\"SSID\",\"PASSWORD\"",5000,DEBUG); //Sustituir SSID y PASSWORD por nombre y contraseña del router
  sendData("AT+CIFSR\r\n",1000,DEBUG); // Ver cual es la dirección IP
  sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configurar para múltiples conexiones
  sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // Abrir servidor en el puerto 80
}
 
void loop()
{
  if(esp8266.available()) // Mira si el esp está mandando un mensaje al arduino
  {
    if(esp8266.find("/LED1")) toggleLED(); //Si en este mensaje ves LED1, cambia el estado del LED
  }
}

//Esta función sirve para enviar comandos AT
String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
    esp8266.print(command); // Enviar el comando
    long int time = millis();
    while( (time+timeout) > millis()) //Función para tiempo máximo de respuesta
    {
      while(esp8266.available())
      {
        // Leer la respuesta del ESP
        char c = esp8266.read();
        response+=c;
      }  
    }
    if(debug) //Si se selecciona debug imprime la respuesta al monitor serie
    {
      Serial.print(response);
    }
    
    return response;
}

void toggleLED(){ //Esta función cambia el estado del LED 13
  if(digitalRead(13)== HIGH) { digitalWrite(13,LOW);}
  else { digitalWrite(13,HIGH); }
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *