Programación Arduino: Control de relé con un sensor PIR

Programación Arduino

Control de relé con un sensor PIR y un NodeMCU

Hoy vamos a explicar como podemos hacer un programa en Arduino sobre un NodeMCU ayudandonos de un sensor PIR y de un relé, para poder encender una luz cuando se detecte movimiento.

Si bien es cierto que hay muchos sensores de movimientos para integrar con nuestras luces (por ejemplo las Philips Hue, Xiaomi, etc.), nada nos gusta más que ser nosotros los que hemos programado esa función.

En esta primera publicación, únicamente explicaremos como hacemos la programación, en próximas publicaciones, explicaremos como podemos controlarlo vía MQTT, para, por ejemplo, poder controlarlo vía Home Assistant, pero eso lo dejamos para más adelante.

Componentes necesarios

  • 1x NodeMCU Lolin (o similar)
  • 6x Cable DuPont Hembra-Hembra
  • 1x Sensor PIR HC-SR501
  • 1x Relé 1 Canal Para PIC AVR DSP ARM Arduino TE213

En mi caso lo había comprado todo hace tiempo en amazon, pero cualquiera que encontremos en amazon, gearbest, aliexpress, ebay, etc. nos debería valer perfectamente.

Una vez tengamos todo el hardware, es hora de instalar el software para programar el Lolin, en nuestro caso, usaremos el IDE de Arduino, el cual podemos descargarlo de este enlace, donde debemos seleccionar nuestro sistema operativo.

En esta primera versión, al no tener ningún servidor web, ni tampoco la opción de MQTT, no hará falta instalar ninguna librería extra, por lo que comenzamos a explicar el código a utilizar:

Ahora vamos a especificar el tipo de placa que estamos usando, para que, cuando subamos nuestro código al Lolin, este lo reconozca correctamente, para ello definiremos de esta forma las diferentes opciones:

Lo más importante, es en “Placa” seleccionar NodeMCU 1.0 (o, en caso de tener otra diferente, especificar la correcta), puesto que, de esta forma, cuando definamos los pines que queremos utilizar, la placa sepa exactamente cual es el que hemos especificado.

Una vez tenemos esa configuración hecha, vamos a ponernos con el código.

Programando con Arduino IDE

Definiendo las constantes necesarias

Lo primero, es definir los pines a utilizar, para ello crearemos 2 constantes, una para el relé y otra para el PIR:
[sourcecode language=”cpp”]// Pin donde se encuentra conectado el Rele
#define PIN_RELE D4
// Pin donde se encuentra conectado el sensor PIR
#define PIN_PIR D3
[/sourcecode]

En este caso, hemos decidido usar el pin llamado D4 en el NodeMCU para enviar los datos de activación/desactivación al relé, al igual que utilizaremos el D3 para obtener la información de cuando el PIR detecte movimiento.

Definiendo valores necesarios

Ahora, es el momento de definir una constante para definir si el relé funciona al revés de como debería, es decir, si decimos que se encienda, este se apague, y al contrario.

[sourcecode language=”cpp”]// Definimos si invertimos el funcionamiento del relé
#define INVERT_LOGIC false
[/sourcecode]

Por defecto, lo dejamos en false, en caso de que el relé funcione al revés, debéis cambiar false por true.

Ahora definiremos una nueva constante que nos dirá si tenemos activado o desactivado el control de la luz a través del sensor de movimiento

[sourcecode language=”cpp”]// Habilitamos/Deshabilitamos el sensor PIR para activar automáticamente el rele
#define PIR_ACTIVATED true[/sourcecode]

Ahora es cuando tenemos que definir parámetros del funcionamiento tras detectar movimiento.

[sourcecode language=”cpp”]// Definimos el tiempo a esperar para apagar el rele tras detectar movimiento
long TIEMPO_ENCENDIDO = 10000;
long tiempo_activado = 0;
boolean movimiento = false;
char* buffer;
[/sourcecode]

Configuración inicial

Tras esto, ya tenemos los pasos previos definidos, ahora, sólo nos queda la programación en si de lo que queremos que haga nuestro Lolin, Arduino tiene dos funciones principales, la primera de ellas, es la función setup(), aquí es donde definiremos como funcionará el relé y el sensor de movimiento, el contenido de esta función sería el siguiente:

[sourcecode language=”cpp”]void setup() {
pinMode(PIN_RELE, OUTPUT);
pinMode(PIN_PIR, INPUT_PULLUP);
Serial.println(“Domology.es :: NodeMCU Lolin + PIR + Rele by Carlos Gonzalez ….”);
}[/sourcecode]

Este código, se ejecutará una única vez cuando iniciamos el NodeMCU.

El relé lo definimos como OUTPUT, mientras que el PIR lo definimos como INPUT_PULLUP, lo que hace esto, es especificar que el sensor tiene una resistencia pull-up interna.

El texo que se encuentra dentro de Serial.println es un texto que podremos observar a través del Monitor Serieque tiene el IDE de Arduino, ideal para comprobar que todo está bien.

Codificando el código recurrente

Ahora nos queda introducir el funcionamiento dentro de la función loop(), lo que hace esta función, es ejecutarse continuamente, el código que usaremos es el siguiente:

[sourcecode language=”cpp”]void loop() {
if (PIR_ACTIVATED == true) {
// Para evitar tener una variable “tiempo_activado” demasiado larga, si el tiempo que lleva desde la última activación, es superior a 8 veces el tiempo máximo que estaría encendida la luz, restablecemos el valor al tiempo máximo
if (tiempo_activado > TIEMPO_ENCENDIDO * 8) {
tiempo_activado = TIEMPO_ENCENDIDO;
}
tiempo_activado = tiempo_activado + 500;

// Si detectamos movimiento
if (digitalRead(PIN_PIR) == 1) {
Serial.println(“Detectamos movimiento, valor sensor PIR: ” + String(digitalRead(PIN_PIR)));
tiempo_activado = 0;
movimiento = true;
Serial.println(“Activamos el rele y definimos que se ha producido un movimiento”);
activarRele();
}
// segun el tiempo pasado…
if (movimiento == true) {
if (tiempo_activado > TIEMPO_ENCENDIDO) {
Serial.println(“El tiempo del último movimiento supera al tiempo total definido: ” + String(tiempo_activado) + ” – ” + String(TIEMPO_ENCENDIDO));
tiempo_activado = 0;
Serial.println(“Desactivamos el rele además de definir que no se ha producido movimiento”);
desactivarRele();
movimiento = false;
}
}
}
delay(500);
}
[/sourcecode]

Funciones Extra

Dentro del funcionamiento, se hacen llamadas a dos funciones que debemos crear, activarRele() y desactivarRele(), estas funciones son las encargadas de dar la orden al relé para activar/desactivar según el caso, además, estas funciones, no devolverán ningún valor, simplemente cambiarán el estado del relé, por lo que tendrán que ser definidas al igual que lo han sido las funciones setup() y loop(), para ello, las declaramos como void, además, en ellos es donde tendremos en cuenta la constante que hemos definido al inicio, donde especificamos si tenemos que invertir el funcionamiento del relé o no, esto lo hacemos de la siguiente forma:

Activar Relé

[sourcecode language=”cpp”]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”);
}
}[/sourcecode]

Desactivar Relé

[sourcecode language=”cpp”]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”);
}
}[/sourcecode]

Últimos pasos

Con esto ya tenemos la programación hecha, con el NodeMCU conectado al Ordenador a través del puerto USB, nos debemos asegurar de que tenemos el puerto COM correctamente seleccionado, para ello, pulsamos en Herramientas -> Puerto -> y elegimos el que nos aparezca (COM3 o COM4 posiblemente), con el puerto seleccionado, pulsamos en el botón Subir y esperamos a que termine la compilación y el flasheo de nuestro código.

Con el NodeMCU con nuestro código, sólo tendremos que conectar los cables DuPort entre el PIR y el NodeMCU, y lo mismo con el relé, muy importante de poner el puerto de comunicación donde lo hemos definido en el código (D4 relé y D3 PIR si sigues al pie de la letra este manual).

A tener en cuenta que el PIR necesita alimentación de 5v continua, por lo que necesitaréis alguna fuente de alimentación externa para no tener problemas con el voltaje, para el relé, en mi caso con 3,3v funcionaba correctamente, pero es cuestión de ver el relé que tenemos, si necesita 5v o con menos nos vale.

Podéis bajar el código completo a través de este enlace comprimido con 7zip.

Un comentario sobre “Programación Arduino: Control de relé con un sensor PIR

Deja un comentario

Síguenos

Siguenos en facebook