NodeMCU en español
NodeMCU - Juan Antonio Villalpando
-- Tutorial de NodeMCU en español --
Volver al índice del tutorial NodeMCU
____________________________
62D2.- NodeMCU server web. Pulsador. Reinicio.
- En este ejemplo me voy a basar en el tutorial anterior, el de dos pulsadores y un LED
192.168.1.5/dato=1 ----> Enciende el LED
192.168.1.5/dato=2 ----> Apaga el LED
192.168.1.5/dato=3 ----> Consulta el estado de los pulsadores y el LED
1.- Esta vez no utilizaremos App Inventor, sino que lo haremos directamente desde una página web.
2.- Además en vez de poner IP dinámica voy a poner IP estática http://192.168.1.9
- Y otra cosa más:
3.- Lo que quiero es pulsar 5 veces el pulsador pulsa15, y al pulsar la quinta vez el NodeMcu se reinicie.
-----------------------------------------------------------------------------------
- Esta conexión es como las del tutorial anterior, he añadido el LED4.
___________________________________________________
1.- Envía los datos 1, 2 y 3. Al pulsar 5 veces el pulsa15, se reinicia NodeMcu.
NodeMCU_wifi_web_server_AppInventor_Pulsadores.ino |
// Juan A. Villalpando.
// KIO4.COM
// Recibe y envía información
#include <ESP8266WiFi.h>
const char* ssid = "Tu_nombre_de_red_wifi";
const char* password = "La_clave_de_tu_red_wifi";
IPAddress ip(192, 168, 1, 9); // IP estática
IPAddress gateway(192, 168, 1, 1); // Puerta de enlace
IPAddress subnet(255, 255, 255, 0);// Red
WiFiServer server(80);
int LED5 = 5; // Es el terminal D1 del NodeMCU
int LED4 = 4; // Es el terminal D2 del NodeMCU
#define pulsa13 13 // Es el D7 del NodeMCU. Aquí irá un pulsador.
#define pulsa15 15 // Es el D8 del NodeMCU. Aquí irá un pulsador.
int valor13;
int valor15;
String diodo; // LED5
String pulsador13;
String pulsador15;
String todos;
int k = 0;
void setup() {
pinMode(LED5, OUTPUT); // Insertamos el LED en el D1 del NodeMCU.
pinMode(LED4, OUTPUT); // Insertamos el LED en el D2 del NodeMCU.
pinMode(pulsa13, INPUT); // Pulsador en D7 del NodeMCU
pinMode(pulsa15, INPUT); // Pulsador en D8 del NodeMCU
Serial.begin(115200);
delay(10);
// Conecta a la red wifi.
Serial.println();
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.config(ip, gateway, subnet); // Configura IP estática
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Conectado con WiFi.");
// Inicio del Servidor web.
server.begin();
Serial.println("Servidor web iniciado.");
// Esta es la IP
Serial.print("Esta es la IP para conectar: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
////////////////////// COMPRUEBA SI HA PERDIDO LA CONEXION
if(k >= 5){
digitalWrite(LED4, HIGH);
ESP.reset();
ESP.reset(); // He puesto doble.
// server.close(); // Cierra el Servidor Web.
// server.stop(); // Para el Servidor Web.
}
/////////////////////////////////////////////////////////////
// Consulta si se ha conectado algún cliente.
WiFiClient client = server.available();
if (!client) {
return;
}
// Espera hasta que el cliente envíe datos.
Serial.println("Nuevo cliente.");
while(!client.available()){
delay(1);
}
/////////////////////////////////////////////////////
// Lee la información enviada por el cliente.
String req = client.readStringUntil('\r');
Serial.println(req);
client.flush();
// Consulta la petición del cliente.
if (req.indexOf("/dato=1") != -1)
{
digitalWrite(LED5, HIGH);
diodo = "LED encendido.";
}
else if (req.indexOf("/dato=2") != -1)
{
digitalWrite(LED5, LOW);
diodo = "LED apagado.";
}
else if (req.indexOf("/dato=3") != -1)
{
valor13 = digitalRead(pulsa13); // Lee el valor del pulsa13 y se lo asigna a valor13. (Puede ser alto o bajo)
if (valor13 == HIGH) { pulsador13 = "alto"; }
else { pulsador13 = "bajo"; }
valor15 = digitalRead(pulsa15); // Lee el valor del pulsa15 y se lo asigna a valor15. (Puede ser alto o bajo)
if (valor15 == HIGH) {
pulsador15 = "alto";
k = k + 1;}
else {
pulsador15 = "bajo";
}
} else {
Serial.println("Error.");
client.stop();
return;
}
todos = diodo + "," + pulsador15 + " k = " + k + " Status = " + WiFi.status();
Serial.println(todos);
delay(10);
//////////////////////////////////////////////
// Página WEB. ////////////////////////////
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // Comillas importantes.
client.println(todos);
Serial.println("Cliente desconectado.");
}
|
- Una vez que el cliente ha entrado se lee la información de llegada que ha traido la IP, hasta fin de línea: \r
- Si pone "/dato=1" realiza una acción.
- Si pone "/dato=2" realiza otra acción.
- Si pone "/dato=3" realiza otra acción.
- El código devuelve todos mediante: client.println(todos);
____________________
- Funcionamiento.
- Vamos a un navegador web y escribimos
http://192.168.1.9/dato=1 ------> se encenderá el LED5
http://192.168.1.9/dato=2 ------> apagará el LED5
http://192.168.1.9/dato=3 ------> se obtendrá el estado del LED5 y los pulsadores.
- Cada vez que se escriba una de esas direcciones se obtendrá el estado del LED5 y los pulsadores.
__________________________
- Reinicio del NodeMcu.
- Pulsamos y mantenemos pulsado el pulsador15.
- En el navegador escribimos http://192.168.1.9/dato=3
- Observamos el Monitor Serie.
- Refresca la página http://192.168.1.9/dato=3 mientras mantenemos pulsado el pulsador25
- Observa que cada vez que refresca la página mientras mantiene pulsado el pulsador15, se incrementa el valor de k
- Cuando k => 5, se reincia el NodeMcu.
- El reinicio total del NodeMcu se realiza mediante:
ESP.reset();
- También se podría haber puesto: ESP.restart();
ESP.reset() puede dejar algunos registros sin borrar, por ejemplo podemos tener un LED activado y no se apaga.
ESP.restart() es un reinicio total que borra todos los registros.
- He puesto el LED4 para comprobar si al hacer un reinicio mediante reset y restart, se apaga ese LED, parece que no.
- rst cause:1 – normal boot after power-on
- rst cause:2 – reboot by reset button/pin
- rst cause:4 – reboot caused by watchdog timer
___________________________
- Parada del Servidor web.
// server.close(); // Cierra el Servidor Web.
// server.stop(); // Para el Servidor Web.
___________________________
- Lectura del estado del Servidor web.
Serial.print(WiFi.status());
_____________________________
- Códigos del Servidor web.
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/include/wl_definitions.h
typedef enum {
WL_NO_SHIELD = 255, // for compatibility with WiFi Shield library
WL_IDLE_STATUS = 0,
WL_NO_SSID_AVAIL = 1,
WL_SCAN_COMPLETED = 2,
WL_CONNECTED = 3,
WL_CONNECT_FAILED = 4,
WL_CONNECTION_LOST = 5,
WL_DISCONNECTED = 6
} wl_status_t;
___________________________
- Consulta del estado del Servidor web.
WiFi.status() != WL_CONNECTED
___________________________
- Conexión del Servidor web.
server.begin();
___________________________
- Propuesta.
- La propuesta sería que comprobara si el Servidor web está conectado y en caso de que no lo esté, se conecte. O bien se reinicie el NodeMcu con ESP.reset();
- Parece fácil, pero no lo es, ya que siempre se obtiene el: WL_CONNECTED = 3
________________________________
|