sábado, 30 de enero de 2016

ESP8266 WiFi con el IDE de Arduino

Una vez que hemos configurado nuestro IDE de arduino para trabajar con el módulo ESP8266, vamos a realizar diferentes ejemplos.

Conexión a una red Wifi

En primer lugar vamos a configurar el módulo como un cliente WiFi. Para ello, lo primero que tenemos que hacer es declarar la librería ESP8266WiFi:

#include <ESP8266WiFi.h>

A continuación definimos el SSID y el Password de nuestra red WiFi:

const char* ssid ="SSID";
const char* password = "PASSWORD";

Nota: sustituir SSID y PASSWORD por el ssid y el password de vuestra red wifi.

En Setup():

En primer lugar programamos nuestro puerto serie para analizar el estado de la conexión y recibir información del módulo:

Serial.begin(115200);

Nota: no olvidar configurar la consola serie a 115200 baudios.

Establecemos el módulo como cliente WiFi y nos desconectamos de cualquier red WiFi a la que estuviéramos conectado previamente:

WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
WiFi.disconnect(); //Se desconecta de cualquier WiFi conectado
delay(100);

Para conectarnos a nuestra WiFi utilizamos WiFi.begin(ssid, password):

Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);

A continuación esperamos que se produzca la conexión con la red Wifi:

while (WiFi.status() != WL_CONNECTED) {   // wait for WiFi
delay(500);
    Serial.print(".");
}

WiFi.status() es una función que nos devuelve un entero y que nos muestra el estado de la conexión. Los valores que se pueden obtener son:
  • 0 : WL_IDLE_STATUS cuando el Wi-Fi está en proceso de cambiar de estado
  • 1 : WL_NO_SSID_AVAIL en caso de que el SSID configurado no pueda ser alcanzado
  • 3 : WL_CONNECTED después de establecer una conexión satisfactoriamente
  • 4 : WL_CONNECT_FAILED si la contraseña es incorrecta
  • 6 : WL_DISCONNECTED si el módulo no está configurado en el modo de estación
Una vez conectados, mostramos la dirección IP que el router nos ha asignado por DHCP:

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
delay(1000);

Una vez ejecutado el programa, la consola nos muestra el siguiente resultado:

Connecting to SSID
......
WiFi connected
IP address:
192.168.1.43

El código completo será el siguiente:
 
#include <ESP8266WiFi.h>
const char* ssid ="SSID";
const char* password = "PASSWORD";

void setup() {
 Serial.begin(115200);
 WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
 WiFi.disconnect(); //Se desconecta de cualquier WiFi
 delay(100);
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {   // wait for WiFi
    delay(500);
    Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
 delay(1000);
}

void loop() {
}

Búsqueda de redes WiFi


En el siguiente ejemplo vamos a realizar una búsqueda de las redes Wifi que nuestro módulo es capaz de detectar.

La primera parte del código es igual al ejemplo anterior (configuración del puerto serie, desconexión de cualquier red que estemos conectado).

Para obtener el número de redes wifi detectadas utilizamos la función WiFi.scanNetworks() que devuelve el número de redes encontradas:

Serial.println("Comienza la busqueda de redes WiFi");
int n = WiFi.scanNetworks();
Serial.println("Busqueda realizada");

Luego, podemos mostrar por el puerto serie el SSID y el nivel de señal de cada una de estas redes:

if (n == 0)
    Serial.print("Redes no encontradas");
else {
for (int i = 0; i < n; i++) {
     Serial.print(i+1);
     Serial.print(": ");
     Serial.print(WiFi.SSID(i)); //SSID de la red
     Serial.print(" (");
     Serial.print(WiFi.RSSI(i)); //Nivel de señal
     Serial.println(")");
     //Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
     delay(10);
    }
 }

El código completo es el siguiente:

#include <ESP8266WiFi.h>

void setup() {
 Serial.begin(115200);
 WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
 WiFi.disconnect();
 delay(100);
 Serial.println("setup completado");
 Serial.println("Comienza la busqueda de redes WiFi");
 int n = WiFi.scanNetworks();
 Serial.println("Busqueda realizada");
 if (n == 0)
    Serial.print("Redes no encontradas");
 else {
    for (int i = 0; i < n; i++) {
     //Muestra los datos de las redes encontradas
     Serial.print(i+1);
     Serial.print(": ");
     Serial.print(WiFi.SSID(i));
     Serial.print(" (");
     Serial.print(WiFi.RSSI(i));
     Serial.println(")");
     delay(10);
    }
 }
}

void loop() {
}

Servidor WEB

Para este ejemplo conectamos un led con su resistencia al pin D1 de nuestro NodeMCU que corresponde al GPIO5 del ESP8266.

La idea es que, al realizar una petición http con cierto formato el led se encienda o se apague.
Gran parte del código es el mismo que en el primer ejemplo (conexión a una red Wifi). En este ejemplo, definiremos primeramente tanto el pin donde conectaremos el led así como el servidor web indicando el puerto por el que escuchará las peticiones:

const int led = 5; //GPIO5 - D1
WiFiServer server(80); //Crea una instancia de Servidor WEB y especifica el puerto que escucha

En setup() inicializamos el puerto serie y a continuación establecemos el estado del led:

pinMode(led,OUTPUT);
digitalWrite(led,LOW);

Después conectamos el módulo a nuestra red WiFi e inicializamos el servidor WEB indicando la dirección IP del módulo por el puerto serie:

server.begin();
Serial.print("Servidor WEB activo: ");
Serial.println(WiFi.localIP());

En loop(), lo primero que hacemos es comprobar si hay algún cliente web conectado a nuestro servidor:

WiFiClient client = server.available();
if (!client) {
return;
}

Una vez se haya conectado, esperamos a recibir datos:

Serial.println("cliente conectado");
while(!client.available()) {
    delay(1);
}

Almacena la petición en una variable tipo String y lo muestra por el puerto serie:

String req =client.readStringUntil('\r');
Serial.println(req);
client.flush();

Busca si se ha recibido los comandos de encendido (/on) o apagado (/off) y establece el valor de una variable según la petición recibida:

int val;
if (req.indexOf("/off") != -1)
    val = 0;
else if (req.indexOf("/on") != -1)
    val = 1;
else {
    Serial.print("Petición inválida");
    client.stop();
    return;
}

Por último, enciende/apaga el led y envía la respuesta al cliente web:

digitalWrite(led,val);
client.flush();
//prepara la respuesta a la petición
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nLed ";
s += (val)?"encendido":"apagado";
s += "</html>\n";
//envía la respuesta
client.print(s);
delay(1);
Serial.println("cliente desconectado");

Si queremos encender el led tenemos que escribir la siguiente url en nuestro navegador web:
http://direccionIP/on

Para apagarlo:
http://direccionIP/off

El código completo es el siguiente:

#include <ESP8266WiFi.h>
const char* ssid ="WLAN_E17C";
const char* password = "ced0ccb58c84e525e35f";
const int led = 5; //GPIO5 - D1
WiFiServer server(80); //Crea una instancia de Servidor WEB y especifica el puerto que escucha
void setup() {
 //inicializa el puerto serie
 Serial.begin(115200);
 delay(10);
 //inicializa el led
 pinMode(led,OUTPUT);
 digitalWrite(led,LOW);
 //Inicializa el módulo wifi
 WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
 WiFi.disconnect(); //Se desconecta de cualquier WiFi conectado previamente
 Serial.println();
 //conecta con la red wifi
 Serial.print("Connecting to ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {   // Espera por una conexión WiFi
    delay(500);
    Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 IPAddress sensor_ip = WiFi.localIP();
 digitalWrite(led,HIGH);
 //inicializa el servidor web
 server.begin();
 Serial.print("Servidor WEB activo: ");
 Serial.println(WiFi.localIP());
}
void loop() {
 //comprueba si un cliente está conectado
 WiFiClient client = server.available();
 if (!client) {
    return;
 }
 //espera hasta que el cliente envía algún dato
 Serial.println("cliente conectado");
 while(!client.available()) {
    delay(1);
 }
 //lee la primera línea de la petición
 String req =client.readStringUntil('\r');
 Serial.println(req);
 client.flush();
 //busca en las peticiones los comandos de encendido y apagado
 int val;
 if (req.indexOf("/off") != -1)
    val = 0;
 else if (req.indexOf("/on") != -1)
    val = 1;
 else {
    Serial.print("Petición inválida");
    client.stop();
    return;
 }
 digitalWrite(led,val);
 client.flush();
 //prepara la respuesta a la petición
 String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nLed ";
 s += (val)?"encendido":"apagado";
 s += "</html>\n";
 //envía la respuesta
 client.print(s);
 delay(1);
 Serial.println("cliente desconectado");
}

Fuentes:
https://www.arduino.cc/en/Reference/WiFi
https://github.com/sandeepmistry/esp8266-Arduino/tree/master/esp8266com/esp8266/libraries/ESP8266WiFi/examples

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.