servidor wep encendiedno y apagando un led
objetivo
El objetivo de esta práctica es conectar el NodeMCU con un punto de acceso de una red WiFi. Es lo que se conoce como conexión en modo Station (STA). Esta es una de las tres formas de conexión WiFi de que dispone el procesador ESP8266 instalado en el NodeMCU. Las otras dos formas son:
Conexión en modo Access Point (AP), donde el el NodeMCU crea una red WiFi de área local (Wireless Local Area Network – WLAN ).
Una suma de los dos modos de conexión Access Point + Station (AP+STA).
Esta conexión la utilizaremos para poder controlar el encendido y apagado de un LED a través otros dispositivos clientes que se conecten al mismo punto de acceso, como PC’s, Smart Phones, Tablets, etc. y aprovechando que el punto de acceso estará conectado a Internet (un router WiFi), mejoraremos la estética página Web, que sirve para el control del LED, incluyendo imágenes de la red nos permitirán conocer su estado (encendido/apagado) de una manera visual.
conceptos básicos.
En el modo Station el NodeMCU se conecta con un punto de acceso (Access Point – AP), como con un router, otro NodeMCU, etc., del que tenga su SSID (Service Set Identifier), es decir “nombre de red” y, en su caso, clave de acceso. De esta manera el NodeMCU queda integrado en la red WiFi como servidor/cliente, pudiendo interactuar con el resto de los dispositivos que la forman.
estableciendo conexion.
La conexión del módulo al punto de acceso se realiza con la función begin.
De forma predeterminada el ESP8266 del NodeMCU se intentará volver a conectar a la red WiFi a la que estaba conectado si se produce la desconexión –no es necesario programarlo-.
Esta es la estructura más habitual de la función, para conectarse a un punto de acceso específico:
WiFi.begin(ssid, password);
1
WiFi.begin(ssid, password);
Los parámetros tienen es el siguiente significado:
ssid : es el nombre de red, SSID (Service Set Identifier) del punto de acceso.
password : es el la clave del del punto de acceso.
Para conectar el módulo al último punto de acceso utilizado, la función sería como sigue (el ssid y el password quedan almacenados en la memoria flash):
WiFi.begin();
1
WiFi.begin();
La función con todos sus parámetros es:
WiFi.begin(ssid, password, channel, bssid, connect);
1
WiFi.begin(ssid, password, channel, bssid, connect);
Los parámetros que faltan por definir tienen es el siguiente significado:
channel : establece el canal WiFi específico del punto de acceso con el que se comunicarse. Este parámetro es opcional.
bssid : es la dirección MAC del punto de acceso. Este parámetro es opcional.
connect : es un parámetro booleano, que si se establece en false hace que el ESP8266 almacene en la memoria flash los nuevos parámetros de conexión, pero que no se conecte. Si se establece en true, intenta conectarse.
gestión de la conexión.
Proporciona métodos para gestionar la conexión, como por ejemplo, reconectar, desconectar o verificar el estado de la conexión.
WiFi.reconnect()
Reconecta el módulo a un punto de acceso.
Si no ha estado conectado antes no realiza ninguna función.
Ejemplo:
Wifi.reconnect()Arduino
Wifi.reconnect();
while (Wifi.status != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Wifi.reconnect();
while (Wifi.status != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
información de la conexión.
Obtiene información sobre la conexión como la MAC o la dirección IP.
WiFi.macAddress()
Es la función que utilizamos para conocer la dirección MAC de la conexión con el punto de acceso.
Ejemplo 1 -MAC generada mediante una cadena (string)-:
if (WiFi.status() == WL_CONNECTED)
{
Serial.printf("Dirección MAC -Server-: %s\n", WiFi.macAddress().c_str());
}
if (WiFi.status() == WL_CONNECTED)
{
Serial.printf("Dirección MAC -Server-: %s\n", WiFi.macAddress().c_str());
}
Ejemplo 2 -MAC generada por un puntero de 6 elementos- :
WiFi.macAddress()Arduino
if (WiFi.status() == WL_CONNECTED)
{
uint8_t macAddr[6];
WiFi.macAddress(macAddr);
Serial.printf("Dirección MAC -Server-: %02x:%02x:%02x:%02x:%02x:%02x\n",
macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
}
if (WiFi.status() == WL_CONNECTED)
{
uint8_t macAddr[6];
WiFi.macAddress(macAddr);
Serial.printf("Dirección MAC -Server-: %02x:%02x:%02x:%02x:%02x:%02x\n",
macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
}
circuito electrónico.
El LED estará conectado en el puerto GPIO02 (D4).
Este LED, como comprobaremos, está relacionado en lógica inversa con el LED que tiene el ESP8266 del NodeMCU junto a la antena. Esto significa que cuando un LED se enciende, el otro se apaga.
SKETCH.
En el sketch se hace un repaso de gran parte de las funciones de la librería ESP8266WiFi.h que permiten crear en modo Station. Se han añadido comentarios para facilitar su seguimiento.
También en el sketch está insertado el código HTML de la página Web que visualizaremos con el navegador (Mozzilla, Google Chrome, Internet Explorer, etc.), al realizar la conexión con el NodeMCU.
Para poder comprenderlo mejor resulta conveniente verlo a parte.
Este es el código HTML que se ejecuta cuando el LED está encendido:
Un navegador visualizará la página Web así , en función del estado del LED:del LED:
Como se puede observar, se han insertado fotografías para visualizar el estado del LED y para mejorar el aspecto del botón de encendido/apagado. Estás fotografías están ubicadas en las siguientes direcciones:
http://nodemakers.es/Practicas_html/LED_encendido.png
http://nodemakers.es/Practicas_html/LED_apagado.png
http://nodemakers.es/Practicas_html/encender_300x88.png
http://nodemakers.es/Practicas_html/apagar_300x88.png
Se puede probar a modificaras utilizando otras fotografías de Internet.
El botón de encendido y apagado, para lograr la comunicación con el punto de acceso une la IP local del NodeMCU con la cadena “/LED=ON” o “/LED=OFF” en función de lo que hayamos pulsado. Quedaría algo así, en función de la IP local del NodeMCU:
http://192.168.1.133/LED=ON o http://192.1.133.1/LED=ON
De esta manera el NodeMCU, recibe la petición “/LED=ON” o “/LED=OFF” y la analiza utilizando la función peticion.indexOf(), para determinar las acciones a realizar.
El sketch a subir al NodeMCU será el siguiente:
odeMCU Server - Conexión en modo Station con un punto de acceso (router) por Dani No www.esploradores.es
Crea una conexión del NodeMCU en modo Station con un punto de acceso que permite
encender y apagar un LED conectado a la salida D4 (GPIO02) del módulo NodeMCU.
Este código de ejemplo es de público dominio.
*/
#include <ESP8266WiFi> //Incluye la librería ESP8266WiFi
const char* ssid = "JAZZTEL_GnP"; //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos.
const char* password = "sdaebssyeqq"; //Indicamos la contraseña de de red WiFi
WiFiServer server(80); //Definimos el puerto de comunicaciones
int PinLED = 2; // GPIO2 //Definimos el pin de salida - GPIO2 / D4
int estado = LOW; //Definimos la variable que va a recoger el estado del LED
void setup() {
Serial.begin(115200);
pinMode(PinLED, OUTPUT); //Inicializamos el GPIO2 como salida
digitalWrite(PinLED, LOW); //Dejamos inicialmente el GPIO2 apagado
WiFi.begin(ssid, password); //Inicializamos la conexión del NodeMCU con la red WiFi
Serial.printf("\n\nConectando a la red: %s\n", WiFi.SSID().c_str());
while (WiFi.status() != WL_CONNECTED) { // Verifica el estado de la conexión del NodeMCU cada 0,5s hasta que conecta
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectada"); // Indica que el NodeMCU conectado con la red WiFi
server.begin(); // Inicia el NodeMCU en modo Station
Serial.println("Servidor inicializado");
Serial.printf("IP local del NodeMCU: %s\n", WiFi.localIP().toString().c_str());
Serial.printf("DNS #1, #2 IP: %s, %s\n", WiFi.dnsIP().toString().c_str(), WiFi.dnsIP(1).toString().c_str());
Serial.printf("Submascara de red -subnetMask-: %s\n", WiFi.subnetMask().toString().c_str());
Serial.printf("Direccion MAC en modo Server -macAddress-: %s\n", WiFi.macAddress().c_str());
Serial.printf("IP privada del punto de acceso -dnsIP-: %s\n", WiFi.gatewayIP().toString().c_str());
Serial.printf("Nombre del NodeMCU como cliente -hostname-: %s\n", WiFi.hostname().c_str());
Serial.printf("Connection status: %d\n0=WL_IDLE_STATUS, 1=WL_NO_SSID_AVAIL, 3=WL_CONNECTED, 4=WL_CONNECTED-FAILED y 6=WL_DISCONNECTED\n", WiFi.status());
Serial.printf("Nombre de red -SSID-: %s\n", WiFi.SSID().c_str());
Serial.printf("Clave de red -Password-: %s\n", WiFi.psk().c_str());
Serial.printf("Direccion MAC del punto de acceso -BSSID-: %s\n", WiFi.BSSIDstr().c_str());
Serial.printf("Intensidad de la conexion con el punto de acceso -RSSI-: %d dB\n", WiFi.RSSI());
Serial.printf("\n\nUtiliza esta URL para conectar: http://%s/\n", WiFi.localIP().toString().c_str());
}
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);
}
// 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 = HIGH;
}
if (peticion.indexOf('/LED=OFF') != -1){
estado = LOW;
}
//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("");
client.println("");
client.println("");
client.print(<h1 align=center>El LED está ahora: ");
if(estado == HIGH) {
client.print("ENCENDIDO</h1>");
client.print("<img src='http://nodemakers.es/Practicas_html/LED_encendido.png' alt='Bombilla encendida' style='display:block; margin:auto' width='15%'>");
client.print("<input type='image' src='http://nodemakers.es/Practicas_html/apagar_300x88.png' style='display:block; margin:auto' width='25%' onClick=location.href='/LED=OFF'>");
} else {
client.print("APAGADO</h1>");
client.print("<img src='http://nodemakers.es/Practicas_html/LED_apagado.png' alt='Bombilla apagada' style='display:block; margin:auto' width='15%'>");
client.print("<input type='image' src='http://nodemakers.es/Practicas_html/encender_300x88.png' style='display:block; margin:auto' width='25%' onClick=location.href='/LED=ON'>");
}
client.println("</html>");
delay(1);
Serial.println("Peticion finalizada"); // Se finaliza la petición al cliente. Se inicializa la espera de una nueva petición.
Serial.println("");
}
|
Comentarios
Publicar un comentario