Conecta tu Arduino a Internet con el módulo WiFi ESP8266

En esta entrada os vamos a introducir la familia de placas de desarrollo que utilizan el chip microcontrolador ESP8266.

Para no entrar detalles técnicos nos es suficiente con saber que el chip ESP8266 cumple la misma función que los chips que llevan las placas Arduino. Nos permiten leer sus entradas y activar sus salidas siguiendo las instrucciones que le hayamos programado.

La particularidad del ESP8266 es que además de esto (que ya hacen nuestros conocidos Arduinos) dispone de las funcionalidades básicas para conectarse a una red WiFi o crear la suya propia. La comunidad maker nos lo ha puesto fácil y lo podemos programar con nuestro IDE de Arduino.

En tiendas on-line podemos encontrar placas ESP8266 de varios fabricantes con formatos y funcionalidades distintas, por precios que rondan los 2-3 euros.

Para la práctica de hoy hemos elegido el modelo NodeMCU V2 de Amica.

Del NodeMCU existen además la versión V1 (antigua) y la V3. Las versiones V2 y V3 son muy similares. La V3 es un poco mayor de tamaño que la V2.

El NodeMCU dispone de:

  • 13 pines digitales numerados del D0 al D12
  • 1 pin analógico numerado A0
  • 3 pines de 3,3V
  • 1 pin de 5V (la versión V3 tiene 2 pines)
  • 4 pines de tierra GND (la versión V3 tiene 5 pines)
  • LEDs integrados
    • 2 LEDs en versión V2 asociados a los pines D4  y D0.
    • 1 LED en versión V3 asociado al pin D4.
  • Puerto USB de programación.

Los pines D9 a D12 tienen algunas funciones especiales, por lo es preferible no usarlos. Los pines digitales que podemos usar realmente son del D0 al D8.

Una particularidad del ESP8266 es que trabaja a 3,3V en lugar de a 5V. Por lo tanto, tendremos que utilizar sensores que funcionen a esta tensión.

Imagen NodeMCU V2 y situación de los pines

 

Preparar el IDE de Arduino.

Para poder programar el NodeMCU con el IDE de Arduino, es necesario añadir la placa al IDE.  Las instrucciones detalladas y la documentación se encuentran en:

https://github.com/esp8266/Arduino

Básicamente lo que hay que hacer es:

  1. Iniciar Arduino y abrir la ventana Preferencias.
  2. Introducir: http://arduino.esp8266.com/stable/package_esp8266com_index.json en el campo “Gestor de URLs Adicionales de Targetas”. Es posible añadir múltiples URLs, separándolas por comas.
  3. Abrir Gestor de Tarjetas desde Herramientas > Menú de Tarjetas e instalar las tarjetas esp8266.
  4. Una vez instaladas seleccionar vuestra tarjeta ESP8266 desde Herramientas > menú de Tarjetas

El ejemplo que veremos hoy nos va a permitir encender y apagar el LED integrado en la placa (que está en el pin D4) desde cualquier dispositivo con conectividad WiFi, a través de un navegador.

Vamos a necesitar:

  • NodeMCU
  • Cable microUSB (para alimentar y programar el ModeMCU)
  • IDE de Arduino
  • Móvil, tableta, ordenador… con conectividad wifi.

Para el ejemplo no es necesario hacer ningún montaje.

El programa lo que hace es:

  • Crea una red WiFi de nombre: OPENLANUZA y contraseña: 123456789
  • Cuando recibe una petición, actualiza el estado del led y lanza una página web en formato HTML.

Si conectamos con un dispositivo a la red OPENLANUZA y escribimos en el  navegador la dirección IP 192.168.1.1, aparecerá una página web que nos indica el estado del LED (APAGADO o ENCENDIDO) y muestra varias opciones desde las que podemos encender y apagar el LED asociado a D4. Tenemos hipervínculos, cajas de comprobación y varios tipos de botones.

A continuación os compartimos el código fuente utilizado en el proyecto:

// OPEN LANUZA Ver 6.1
//
// CREA UNA RED OPENLANUZA
// CONTRASEÑA 123456789

#include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi

const char ssid[] = "OPENLANUZA"; //Definimos la SSID de nuestro servidor WiFi -nombre de red-
const char password[] = "123456789"; //Definimos la contraseña de nuestro servidor
WiFiServer server(80); //Definimos el puerto de comunicaciones

int PinLED = D4; //Definimos el led en GPIO2 (D4 si usanos la notación de la placa NodeMCU)
int estado = HIGH; //Definimos la variable que va a recoger el estado del LED

void setup() {
Serial.begin(115200);

pinMode(PinLED, OUTPUT); //Inicializamos D$ como salida
digitalWrite(PinLED, HIGH); //Dejamos inicialmente el led apagado

server.begin(); //inicializamos el servidor
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password); //Red con clave, en el canal 1 y visible
//WiFi.softAP(ssid, password,3,1); //Red con clave, en el canal 3 y visible
//WiFi.softAP(ssid); //Red abierta

Serial.println();

Serial.print("Direccion IP Access Point - por defecto: "); //Imprime monitor serie la dirección IP
Serial.println(WiFi.softAPIP());
Serial.print("Direccion MAC Access Point: "); //Imprime por monitor serie la dirección MAC
Serial.println(WiFi.softAPmacAddress());

IPAddress local_ip(192, 168, 1, 1); //Asigna la dirección IP
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
WiFi.softAPConfig(local_ip, gateway, subnet);
Serial.println();
Serial.print("Access Point - Nueva direccion IP: ");
Serial.println(WiFi.softAPIP());
}

void loop()
{
// Comprueba si el cliente ha conectado
WiFiClient client = server.available();
if (!client) {
return;
}

// Espera hasta que el cliente envía alguna petición
Serial.println("nuevo cliente");
while(!client.available()){
delay(1);
}

// Imprime el número de clientes conectados
Serial.printf("Clientes conectados al Access Point: %dn", WiFi.softAPgetStationNum());

// Lee la petición
String peticion = client.readStringUntil('\r');
Serial.println(peticion);
client.flush();

// Comprueba la petición
if (peticion.indexOf('/LED=ON') != -1) {
estado = LOW;
}
if (peticion.indexOf('/LED=OFF') != -1){
estado = HIGH;
}
if (peticion.indexOf('/SERV=0') != -1){
estado = LOW;
}
if (peticion.indexOf('/SERV=180') != -1){
estado = HIGH;
}
Serial.println(estado);
//Enciende o apaga el LED en función de la petición
digitalWrite(PinLED, estado);

// Envía la página HTML de respuesta al cliente
client.println("HTTP/1.1 200 OK");
client.println(""); //No olvidar esta línea de separación
client.println("<!DOCTYPE HTML>");
client.println("<meta charset='UTF-8'>");
client.println("<html><body style=\"zoom: 200%;\">");

//Imprime el estado del led
client.print("<h2>El LED est&aacute; ahora: ");
if(estado == LOW) {
client.print("ENCENDIDO</h2>");
} else {
client.print("APAGADO</h2>");
}

//Se crean enlaces para modificar el estado del LED
client.println("Presiona <a href='/LED=ON'>AQU&Iacute;</a> para encender el LED<br>");
client.println("Presiona <a href='/LED=OFF'>AQU&Iacute;</a> para apagar el LED<br><br>");

//Se crean cajas de comprobación (checkbox) para modificar el estado del LED
client.println("<input type='checkbox' onClick=location.href='/LED=ON'> ENCENDER </input><br>");
client.println("<input type='checkbox' onClick=location.href='/LED=OFF'> APAGAR </input><br><br>");

//Se crean botones para modificar el estado del LED
client.println("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>");
client.println("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>");

//Se crean botones con estilos para modificar el estado del LED
client.println("<button type='button' onClick=location.href='/LED=ON' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> ENCENDER </h2> </button>");
client.println("<button type='button' onClick=location.href='/LED=OFF' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> APAGAR </h2> </button><br><br>");

//Se crea un único botón para modificar el estado del LED
if(estado == HIGH) {
client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button><br><br>");
} else {
client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>");
}

client.println("</body></html>");
client.print("\r\n\r\n");
delay(1);
Serial.println("Petición finalizada"); // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición.

//Desconexión de los clientes
//WiFi.softAPdisconnect();
}

Aquí podéis ver el resultado en el navegador de un móvil:

 

Si os animais podeis modificar el aspecto y funcionalidad de los botones. Añadir algún led adicional a vuestro montaje,…..

A continuación os dejamos unos cuantos enlaces que a nosotros nos han sido útiles:

Y para finalizar, os dejamos con Enrique y Manuel, padre e hijo, los cuales forman parten del grupo avanzado de Robótica en Familia, en el cual están realizando un proyecto de riego hidropónico, utilizando este módulo WiFi para exportar los datos de todos los sensores.

Deja un comentario

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