Programación Arduino: Control via web de un Relé con NodeMCU

Programación Arduino

En esta ocasión, explicaremos como podemos crear una página web para controlar un relé a través de NodeMCU

Partiremos de la base de que ya sabes programar, o bien, has leído la entrada Programación Arduino: Control de relé con un sensor PIR

Control via web de un relé con NodeMCU

Hoy os traemos un pequeño manual de como podemos programar nuestro NodeMCU para poder controlar un relé a través de una interfaz web que nosotros mismos podamos diseñar.

Hardware necesario

  • 1x NodeMCU
  • 3x cables DuPont
  • 1x Relé 1 Canal Para PIC AVR DSP ARM Arduino TE213

Librerías necesarias en Arduino IDE

  • Wifi: ESP8266WiFi.h
  • Servidor Web: ESP8266WebServer.h

Codificando el NodeMCU

Incluyendo las librerias

[sourcecode language=»cpp»]

// Incluimos las librerias que necesitamos
// Wifi
#include <ESP8266WiFi.h>
// Servidor Web
#include <ESP8266WebServer.h>

[/sourcecode]

Definiendo variables a utilizar

[sourcecode language=»cpp»]

// Nombre de la red wifi a la que nos conectamos
const char* ssid = «Nombre de mi wifi»;
// Contraseña de la red wifi a la que nos conectamos
const char* pwd = «Contraseña de mi wifi»;
// Pin donde se encuentra conectado el Rele
#define PIN_RELE D4 //2 //D0;
// deshabilitamos la inversión del relé
#define INVERT_LOGIC false
char* buffer;
boolean estado;

[/sourcecode]

Definiendo el puerto de escucha del servidor web

[sourcecode language=»cpp»]

// Especificamos el puerto por defecto en el que escuchará el servidor web
ESP8266WebServer server(80);

[/sourcecode]

Configuración general

Ahora definiremos la configuración general de nuestro proyecto, esto lo hacemos dentro de la función setup()

[sourcecode language=»cpp»]

void setup() {
//Definimos el Relé como OUTPUT
pinMode(PIN_RELE, OUTPUT);
//Conectamos el NodeMCU a nuestra red Wifi
WiFi.begin(ssid, pwd);
//seguirá intentando la conexión mientras no se conecte
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
Serial.begin(115200);
delay(150);
//Definimos las direcciones URL que manejaremos
defineHTMLfunctions();
//Mostramos la información de nuestra ip a través del monitor serie
Serial.println(«\nWiFi connected»);
Serial.print(«IP address: «);
Serial.println(WiFi.localIP());
Serial.println(«Domology.es :: NodeMCU Lolin + Rele + Servidor Web by Carlos Gonzalez ….»);
}

[/sourcecode]

Código recurrente

Si recordáis de la publicación anterior de programación arduino, este sistema tiene 2 funciones básicas, una de ellas es setup(), que la acabamos de definir, y la otra necesaria es la función loop() la cual se ejecuta de forma continua, así es como la definiremos en nuestro código:

[sourcecode language=»cpp»]

void loop() {
server.handleClient();
//Llamamos a la función que nos mostrará la página web
handleRoot();
delay(500);
}

[/sourcecode]

Funciones extra

En mi caso, en vez de poner todo el código de forma conjunta, prefiero separarlo por funciones, para facilitar la reutilización de código y ahorrar lineas en la programación, esto podría obviarse y poner el contenido de la función en lugar de la llamada a la misma en el código puesto anteriormente.

Las funciones que hemos llamado en el código anterior son: defineHTMLfunctions(), handleRoot(), changeRele() y dentro de ellas, llamamos a las funciones activarRele(), desactivarRele() y estadoRele(), aquí veréis como definimos cada una de ellas

defineHTMLfunctions

[sourcecode language=»cpp»]

void defineHTMLfunctions() {
//La raiz del navegador mostraremos la página principal con un botón para acitvar/desactivar el relé
server.on(«/»,handleRoot);
//En la dirección toggle cambiaremos el estado del relé
server.on(«/toggle»,changeRele);
//Iniciamos el servidor web
server.begin();
}

[/sourcecode]

handleRoot

[sourcecode language=»cpp»]

//Función para mostrar la página web
void handleRoot()
{
const char* htmlText = «»;
//Handler for the rooth path
estado = estadoRele();
if (estado == false) {
htmlText = »

 

«;
}
else {
htmlText = »

 

«;
}
server.send(200, «text/html», htmlText);
}

[/sourcecode]

changeRele

[sourcecode language=»cpp»]

//Función para cambiar el estado del relé
void changeRele()
{
estado = estadoRele();
if (estado == true) {
desactivarRele();
}
else {
activarRele();
}
}

[/sourcecode]

activarRele

[sourcecode language=»cpp»]

//Función para activar el relé
void activarRele()
{
Serial.print(«Activa Relé orden: «);
if (INVERT_LOGIC) {
//Invertimos la logica del relé
digitalWrite(PIN_RELE, LOW);
Serial.println(«LOW»);
}
else {
digitalWrite(PIN_RELE, HIGH);
Serial.println(«HIGH»);
}
handleRoot();
}

[/sourcecode]

desactivarRele

[sourcecode language=»cpp»]

//Función para desactivar el relé
void desactivarRele()
{
Serial.print(«Desactiva Relé orden: «);
if (INVERT_LOGIC) {
//Invertimos la logica del relé
digitalWrite(PIN_RELE, HIGH);
Serial.println(«HIGH»);
}
else {
digitalWrite(PIN_RELE, LOW);
Serial.println(«LOW»);
}
handleRoot();
}

[/sourcecode]

estadoRele

[sourcecode language=»cpp»]

//Devolvemos el estado del rele
boolean estadoRele() {
if (digitalRead(PIN_RELE) == LOW) {
if (INVERT_LOGIC) { return true; }
else { return false; }
}
else {
if (INVERT_LOGIC) { return false; }
else { return true; }
}
}

[/sourcecode]

Así es como nos quedaría:

Y cuando esté activado, en lugar de mostrar el texto «Activar» mostraría «Desactivar».

Deja un comentario

Síguenos

Siguenos en facebook