IOT – Comandos AT con ESP8266

Después de conocer un poco más acerca de la teoría de redes, documentadas en el post anterior, vamos a proceder a crear algunos programas para comenzar a utilizar nuestro módulo ESP8266.

Para ello debemos de conectar 5 pines del módulo a nuestra placa Arduino.

  • UTXD a el RX del Arduino (pin 10)
  • URXD a el TX del Arduino (pin 11)
  • VCC –> conectada al voltaje (3.3V)
  • GND –> conectada a tierra (GND)
  • CH_PD conectada al voltaje (5V). Si se prefiere a través de una resistencia de 2K2

 

 

Una vez conectados los pines, vamos a realizar una prueba para saber si nuestro módulo responde correctamente a nuestras peticiones. Ya que vamos a utilizar la librería SoftwareSerial, para evitar algunos lios.

 

Este primer programa nos va a permitir introducir comandos AT desde el monitor serie y podremos visualizar la información obtenida del mismo.


#include <SoftwareSerial.h>

long bps=9600;
SoftwareSerial mySerial(10, 11); // RX, TX
void setup(){
   // Open serial communications and wait for port to open:
   Serial.begin(bps);
   mySerial.begin(bps);

   Serial.println("Goodnight moon!");

   mySerial.println("AT");   //Response "OK"
}

void loop() {
   while (mySerial.available()){
      Serial.write(mySerial.read());
   }
   delay(100);

   while (Serial.available()){
       mySerial.write(Serial.read());
   }
   delay(100);
}

 

Una vez hecho esto, vamos a descargar la librería IOTZMS desde el repositorio oficial de Zaragoza Maker Space. Esta librería proporciona unas funciones adicionales para la creación de un obejto que puede conectar a nuestro ESP8266, una vez se ha realizado el paso anterior.


#include <SoftwareSerial.h>
#include "IOTZMS.h"

#define SSID "SSID"
#define PASSWORD "PASSWORD"
#define HOST "192.168.1.1"
SoftwareSerial RXTX(10,11);
IOTZMS wifi(RXTX,SSID,PASSWORD,HOST);

char* cmd = "$";
String getdata = "Apuntate a Zaragoza Maker Space";
void setup(void){
   Serial.begin(9600);
   wifi.init();

   wifi.set_webdir("/");
   wifi.set_webfile("index.php");
}

void loop(){
   while (RXTX.available()){
      Serial.write(RXTX.read());
   }
   delay(500);
   //Hay que seleccionar No ajuste de linea desde el monitor serial
   while (Serial.available()){
      String data = Serial.readString();
      if (data == cmd){
         Serial.println("SendPOST");
         wifi.simplePOST(getdata);
      }else{
         Serial.println("SendAT");
         RXTX.println(data);
      }
   }

   delay(500);
}

 

 

Anteriormente solo hemos utilizado un modo de comunicación simple en el que enviamos un parámetro. Pero ahora vamos a realizar una comunicación dinámica en la que nosotros elegiremos el número de parámetros que queremos introducir por medio de un array asociativo clave-> valor.

De esta manera podremos identificar desde el lado servidor los datos que entran a nuestra página.
IMPORTANTE: Se recomienda utilizar una Arduino Mega para la ejecución de los siguientes ejercicios.

REIMPORTANTE : Se pueden dejar espacios en blanco, pero puede haber problemas con las tildes y las eñes. Estamos en proceso de solucionarlo.

#include <SoftwareSerial.h>
#include "IOTZMS.h"

#define SSID        "SSID"
#define PASSWORD    "PASSWORD"
#define HOST        "192.168.1.1"
SoftwareSerial RXTX(10,11);
IOTZMS wifi(RXTX,SSID,PASSWORD,HOST);
char* cmd = "$";

void setup(void)
{
    Serial.begin(9600);
    wifi.init();
    
    //Establecer directorio y pagina del servidor
    wifi.set_webdir("/");
    wifi.set_webfile("index.php");
}

void loop(void)
{
   //Modo depuración desde el puerto serie
   while (RXTX.available()){
    Serial.write(RXTX.read());
  }
  delay(500);

  while (Serial.available()){
      String data = Serial.readString();

      //Hay que seleccionar No ajuste de linea desde el monitor Serial para introducir commando
      if (data == cmd){
         Serial.println("SendGET");

         //Solo soporta un parametro en la Arduino UNO
         wifi.sendhttpGET();
      }else{
         Serial.println("SendAT");
         RXTX.println(data);
      }
   }
      
  delay(500);
}


 

Antes utilizabamos la función de transmisión de datos a una página web mediante parámetros GET que son datos que van dentro de la misma URL; pero también podemos hacerlo mediante parámetros POST, que son datos que se transmiten dentro del protocolo HTTP y proporciona una capa más segura para la transmisión de datos.

 
#include <SoftwareSerial.h>
#include "IOTZMS.h"

#define SSID        "SSID"
#define PASSWORD    "PASSWORD"
#define HOST        "192.168.1.1"
SoftwareSerial RXTX(10,11);
IOTZMS wifi(RXTX,SSID,PASSWORD,HOST);
char* cmd = "$";

void setup(void)
{
    Serial.begin(9600);
    wifi.init();
    
    //Establecer Directorio y pagina del servidor
    wifi.set_webdir("/");
    wifi.set_webfile("index.php");
    Serial.println(wifi._web_dir);
    Serial.println(wifi._web_file);
}

void loop(void)
{
  while (RXTX.available()){
    Serial.write(RXTX.read());
  }
  delay(500);
  //Hay que seleccionar No ajuste de linea desde el monitor serial
  while (Serial.available()){
      String data = Serial.readString();
      if (data == cmd){
         Serial.println("SendPOST");
         wifi.sendhttpPOST();
      }else{
         Serial.println("SendAT");
         RXTX.println(data);
      }
   }
      
  delay(500);  
}

 

Para finalizar, se añaden algunas de las pautas por las que nuestro módulo aparentemente puede no funcionar.

  • Me aparecen mensajes raros no descodificables para un ser humano del planeta tierra.

    Si acabas de comprar este módulo ESP8266 es bastante posible que venga con un Firmware precargado y que puede dar problemas. Para ello, una de las mejores opciones es flashear este módulo, tal y como se explica en el siguiente post. Se requiere de una conexión especial del módulo, descargar un firmware válido para su funcionamiento y un modo de flashear a través del USB. En este caso se utiliza esptool.

  • Mi Arduino UNO no funciona, parece dar problemas cuando mando mucha información de golpe, se resetea sin ningúna razón o se cuelga.

    Este problema se debe a la capacidad de buffer y memoria que tiene una Arduino UNO. Si estamos conectando con una página que arroja muchísima información, es muy probable que la placa UNO no sea suficiente para conectar, recibir o transmitir todo su contenido. Por ello, es preferible en muchos casos utilizar una Arduino MEGA o una ArduinoBoardYUN.

  • ¿Por qué no utilizar el puerto serie que viene por defecto en lugar de la librería SoftwarSerial?

    La Arduino UNO utiliza los pines del puerto serie para programar la placa. Si conectamos dos cables en estos pines al comienzo, se interrumpe la comunicación de transmisión de datos a la hora de cargar y tendríamos que estar conectando y desconectando estos cables cada vez que cargamos un programa y puede resultar una pérdida de tiempo si estamos en modo de pruebas. Por ello, utilizamos otros pines que proporcionan comunicación con el módulo. Este hecho se explica en profundidad en el post que se comenta con anterioridad.

  • ¿Puedo programar mi módulo de forma independiente sin necesidad de utilizar una placa Arduino?

    La respuesta es SÍ.  Desde la página de Prometec se pueden seguir los pasos para instalar una extensión que permite programar el módulo ESP8266 en modo Stand-Alone.

  • ¿Tengo que utilizar siempre una Arduino para conectar mi módulo al ordenador?

    No tiene por qué. Se pueden comprar unos adaptadores Serial USB o FTDI con las salidas suficientes para comunicar tu ordenador con este módulo.

  • ¿Hay versiones del módulo ESP8266 mejores que otras?

    Sí, en concreto nosotros utilizamos el modelo que aparece en la figura de arriba. Cuantos más pines se proporcionen, mayores son las posibilidades de configuración o instalación dentro de un proyecto. Algunos módulos vienen sin una placa de conexión directa como el ESP12; y la misma dispone de GPIOS propios sin tener que depender de una placa Arduino completa. En caso de tener menos pines como el ESP8266-05 no tendríamos ni posibilidad de flashear el módulo.

Deja una respuesta

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

diez − ocho =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.