En este artículo, aprenderás cómo automatizar un portón utilizando un nodemcu, MQTT y un módulo de radio frecuencia (RF) de 433 MHz. Con esta configuración, podrás controlar la apertura y el cierre del portón desde tu teléfono móvil, así como utilizar un control remoto RF. Además, te mostraré cómo integrar el portón automatizado con Home Assistant para una experiencia de automatización completa a través de domotica.

Lista de materiales:

  • NodeMCU ESP8266
  • Módulo de relé x2
  • Módulo de radio frecuencia (RF) de 433 MHz
  • Botón físico
  • Resistencias de 10k ohm x2
  • Jumpers
  • Control remoto RF de 433 MHz (opcional)
  • Fuente de alimentación para NodeMCU y relés

1: Conexiones de hardware

  1. Conecta el NodeMCU a la fuente de alimentación y asegúrate de que está correctamente alimentado.
  2. Conecta los pines de salida del NodeMCU a los pines de control de los relés según tu configuración. Asegúrate de utilizar resistencias de 10k ohm en las líneas de control de los relés para evitar problemas de interferencia.
  3. Conecta el botón físico a un pin de entrada del NodeMCU y a tierra. Utiliza una resistencia de 10k ohm como pull-up en el pin de entrada para evitar fluctuaciones.
  4. Conecta el módulo de radio frecuencia (RF) de 433 MHz al NodeMCU según las especificaciones del módulo. Asegúrate de realizar las conexiones adecuadas para la transmisión y recepción de señales.
Conexiones de hardware

2: Configuración de software domotica

  1. Descarga e instala el IDE de Arduino desde el sitio web oficial.
  2. Abre el IDE de Arduino y selecciona “NodeMCU 1.0 (ESP-12E Module)” como la placa en “Herramientas > Placa”.
  3. Instala las siguientes bibliotecas desde el “Gestor de Bibliotecas” en el IDE de Arduino:
    • ESP8266WiFi
    • PubSubClient
    • RCSwitch
  4. Copia el siguiente código en el IDE de Arduino:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <RCSwitch.h>

// Configuración de red Wi-Fi
const char* ssid = "TU_SSID";
const char* password = "TU_CONTRASEÑA";

// Configuración de MQTT
const char* mqttBroker = "DIRECCION_DEL_BROKER";
const int mqttPort = 1883;
const char* mqttUser = "USUARIO_MQTT";
const char* mqttPassword = "CONTRASEÑA_MQTT";
const char* mqttTopicStatus = "porton/status";

// Pines GPIO utilizados para los relés y el botón físico
const int relayPinOpen = D1;  // Pin para el relé de apertura
const int relayPinClose = D2;  // Pin para el relé de cierre
const int buttonPin = D5;  // Pin para el botón físico

// Variables para el debounce del botón
const unsigned long debounceDelay = 50;  // Retardo de debounce en milisegundos
unsigned long lastButtonPress = 0;  // Tiempo del último botón presionado
bool buttonState = HIGH;  // Estado del botón

// Variables para almacenar los estados de apertura y cierre del portón
bool abierto = false;
bool cerrado = true;

// Crea una instancia del cliente WiFi
WiFiClient espClient;
// Crea una instancia del cliente MQTT
PubSubClient mqttClient(espClient);
// Crea una instancia del módulo de radio frecuencia (RF)
RCSwitch rfSwitch = RCSwitch();

void setup() {
  pinMode(relayPinOpen, OUTPUT);
  pinMode(relayPinClose, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);

  conectarWiFi();
  conectarMQTT();
  configurarRF();

  Serial.println("Iniciando...");
}

void loop() {
  verificarBoton();
  manejarMQTT();
}

void conectarWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Conectado a la red Wi-Fi. Dirección IP: ");
  Serial.println(WiFi.localIP());
}

void conectarMQTT() {
  mqttClient.setServer(mqttBroker, mqttPort);
  mqttClient.setCallback(mqttCallback);

  while (!mqttClient.connected()) {
    Serial.print("Conectando a MQTT broker...");
    if (mqttClient.connect("PortonClient", mqttUser, mqttPassword)) {
      Serial.println("Conectado");
      mqttClient.subscribe(mqttTopicStatus);
    } else {
      Serial.print("Falló, estado de conexión: ");
      Serial.print(mqttClient.state());
      Serial.println(" Intentando de nuevo en 5 segundos...");
      delay(5000);
    }
  }
}

void configurarRF() {
  rfSwitch.enableTransmit(D3);
  rfSwitch.setProtocol(1);
}

void verificarBoton() {
  if (millis() - lastButtonPress > debounceDelay) {
    bool currentState = digitalRead(buttonPin);
    if (currentState != buttonState) {
      buttonState = currentState;
      if (buttonState == LOW) {
        if (cerrado) {
          abrirPorton();
        } else if (abierto) {
          detenerPorton();
        } else {
          cerrarPorton();
        }
      }
    }
  }
}

void abrirPorton() {
  digitalWrite(relayPinOpen, HIGH);
  digitalWrite(relayPinClose, LOW);
  abierto = true;
  cerrado = false;
  mqttClient.publish(mqttTopicStatus, "Apertura");
  enviarSenalRF(0xABCD, 24, 10);
}

void cerrarPorton() {
  digitalWrite(relayPinOpen, LOW);
  digitalWrite(relayPinClose, HIGH);
  abierto = false;
  cerrado = true;
  mqttClient.publish(mqttTopicStatus, "Cierre");
}

void detenerPorton() {
  digitalWrite(relayPinOpen, LOW);
  digitalWrite(relayPinClose, LOW);
  abierto = false;
  cerrado = false;
  mqttClient.publish(mqttTopicStatus, "Detenido");
}

void manejarMQTT() {
  if (!mqttClient.connected()) {
    conectarMQTT();
  }
  mqttClient.loop();
}

void mqttCallback(char* topic, byte* payload, unsigned int length) {
  String receivedTopic = String(topic);

  if (receivedTopic == mqttTopicStatus) {
    String message = String((char*)payload);
    Serial.print("Mensaje recibido: ");
    Serial.println(message);
    // Realiza acciones adicionales según el mensaje recibido
  }
}

void enviarSenalRF(unsigned long code, unsigned int length, unsigned int repeat) {
  rfSwitch.send(code, length);
  rfSwitch.setRepeatTransmit(repeat);
  delay(10);
  rfSwitch.resetTransmit();
}
  1. Asegúrate de reemplazar los valores de configuración Wi-Fi, MQTT y otros según tus necesidades.
  2. Verifica y carga el código en el NodeMCU.

3: Prueba y verificación de domotica

  1. Asegúrate de que el NodeMCU esté correctamente conectado y alimentado.
  2. Abre el monitor serie en el IDE de Arduino para ver los mensajes de depuración y asegurarte de que el NodeMCU se conecte correctamente a la red Wi-Fi y al broker MQTT.
  3. Presiona el botón físico para controlar la apertura y el cierre del portón. Verifica que los relés se activen y desactiven según el estado actual del portón.
  4. Si deseas utilizar un control remoto RF, asegúrate de que el módulo de radio frecuencia esté correctamente configurado y prueba el control remoto para verificar que se envíen las señales adecuadas.

Integración con Home Assistant

  1. Abre el archivo de configuración de Home Assistant.
  2. Agrega la siguiente configuración en la sección mqtt para recibir las actualizaciones de estado del portón:
mqtt:
  broker: DIRECCION_DEL_BROKER
  port: mqttPort
  username: USUARIO_MQTT
  password: CONTRASEÑA_MQTT

binary_sensor:
  - platform: mqtt
    name: "Estado del Portón"
    state_topic: "porton/status"

  1. Guarda y reinicia Home Assistant.
  2. Verifica en la interfaz de Home Assistant que el estado del portón se muestre correctamente y que puedas controlarlo desde la interfaz.

¡Enhorabuena! Ahora has automatizado tu portón utilizando NodeMCU, MQTT y un control remoto RF. Puedes controlar el portón desde tu teléfono móvil o utilizando un control remoto RF. Además, has integrado el portón automatizado con Home Assistant para una experiencia de automatización completa.

Recuerda que este es solo un ejemplo básico y puedes ampliar y personalizar la funcionalidad según tus necesidades.

¡Espero que este artículo te haya resultado útil y te inspire en tus proyectos de domotica! Si tienes alguna pregunta o comentario, ¡no dudes en dejarlo a continuación!

No olvides visitar Domotica de un citófono antiguo: ESP-01S, MQTT y HASSIO

By juan

Un amante de la tecnología, cada día se aprende algo nuevo

4 thoughts on “Domotica a tu portón con NodeMCU, MQTT y control remoto RF”

Agregar un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos están marcados *