tutoriales.com

Automatiza tu Hogar: Control de Luces Inteligentes con Raspberry Pi y Python

Este tutorial te guiará paso a paso en la creación de un sistema de control de luces inteligentes con una Raspberry Pi. Aprenderás a conectar relés, escribir scripts en Python para controlar dispositivos AC y diseñar una interfaz web básica para gestionar tus luces desde cualquier lugar de tu hogar.

Intermedio25 min de lectura14 views7 de marzo de 2026

Automatiza tu Hogar: Control de Luces Inteligentes con Raspberry Pi y Python

¿Alguna vez soñaste con encender y apagar las luces de tu casa desde tu teléfono, o programarlas para que se activen automáticamente? Con una Raspberry Pi y un poco de conocimiento en electrónica y programación, puedes convertir ese sueño en realidad. Este tutorial te enseñará cómo construir tu propio sistema de control de luces inteligentes, ¡sin necesidad de gastar una fortuna en dispositivos comerciales!

🔥 **Importante:** Este proyecto involucra trabajar con corriente alterna (AC) de la red eléctrica. Es **crucial** seguir todas las precauciones de seguridad. Si no te sientes cómodo trabajando con electricidad, busca la ayuda de un profesional o limita tu proyecto a dispositivos de bajo voltaje (DC).

🎯 ¿Qué Aprenderás?

Al finalizar este tutorial, serás capaz de:

  • Conectar módulos de relé a tu Raspberry Pi.
  • Controlar dispositivos eléctricos (como luces) de forma segura con Python.
  • Crear un script Python para la lógica de control.
  • Desarrollar una interfaz web sencilla para interactuar con tu sistema.
  • Integrar todo para tener un sistema de control de luces inteligente.

🛠️ Materiales Necesarios

Aquí tienes una lista de los componentes que necesitarás para este proyecto:

| Componente | Descripción | Cantidad | Enlace Sugerido | |:-----------|:------------------------------------|:---------|:----------------| | **Raspberry Pi** | Modelo 3B, 3B+, 4B o Zero W 2 | 1 | Tienda de electrónica | | **Tarjeta microSD** | 16 GB o más, con Raspberry Pi OS | 1 | - | | **Fuente de Alimentación** | Para Raspberry Pi | 1 | - | | **Módulo de Relé de 2 o 4 Canales** | Compatible con 5V | 1 | Amazon/AliExpress | | **Cables Jumper F-M** | Para conectar Raspberry Pi y relé | 5-10 | - | | **Cables Eléctricos** | Calibre adecuado para AC (1.5mm²) | Varios metros | Ferretería | | **Portalámparas y Bombillas** | Para pruebas | 1-2 | Ferretería | | **Caja de Prototipos/Carcasa** | Para seguridad y organización | 1 | Tienda de electrónica | | **Destornillador** | Plano y de estrella | 1 | - | | **Multímetro** | Opcional, pero recomendado | 1 | - | | **Tiras Terminales (Bornas)** | Para conexiones seguras de AC | Varias | Ferretería |
💡 **Consejo:** Es recomendable comprar un módulo de relé con optoacopladores para una mayor seguridad y aislamiento entre la Raspberry Pi y el circuito de AC.

📖 Paso 1: Configuración Inicial de la Raspberry Pi

Si ya tienes tu Raspberry Pi configurada, puedes saltar este paso. Si no, sigue estos puntos:

  1. Instala Raspberry Pi OS: Descarga la última versión de Raspberry Pi OS (recomendado Raspberry Pi OS Lite para este proyecto) desde la página oficial e instálala en tu tarjeta microSD usando Raspberry Pi Imager.
  2. Habilita SSH y Wi-Fi: Antes de expulsar la tarjeta, puedes habilitar SSH y configurar el Wi-Fi creando un archivo ssh (vacío) y wpa_supplicant.conf en la partición boot de la SD. Esto te permitirá conectarte remotamente sin necesidad de monitor.
  3. Primer Arranque: Inserta la microSD en tu Raspberry Pi, conéctala a la alimentación y espera unos minutos.
  4. Conexión SSH: Desde tu ordenador, abre una terminal y conéctate via SSH:
    ssh pi@raspberrypi.local
    
    (La contraseña por defecto es raspberry). Si no funciona raspberrypi.local, puedes usar la dirección IP de tu Pi. Puedes encontrarla con herramientas como nmap o revisando tu router.

Una vez conectado, actualiza tu sistema:

sudo apt update
sudo apt upgrade -y

🔌 Paso 2: Entendiendo y Conectando el Módulo de Relé

¿Qué es un Relé?

Un relé es un interruptor electromecánico que nos permite controlar un circuito de alta potencia (como una luz de AC) utilizando una señal de baja potencia (como la de un pin GPIO de la Raspberry Pi). Es esencialmente un puente seguro entre tu electrónica sensible y la corriente de la red eléctrica.

Esquema Interno Básico de un Relé

CIRCUITO DE CONTROL (Raspberry Pi) IN GND VCC CIRCUITO DE CARGA (Luz) COM NO NC Interno
  • IN (Input): Recibe la señal de control de la Raspberry Pi (GPIO).
  • VCC: Alimentación del relé (5V de la Raspberry Pi).
  • GND: Tierra del relé (GND de la Raspberry Pi).
  • COM (Common): El terminal común que se conecta a la fuente de alimentación de la carga (fase de la red eléctrica).
  • NO (Normally Open): Normalmente abierto. Cuando el relé está desactivado, no hay conexión entre COM y NO. Cuando se activa, COM se conecta a NO.
  • NC (Normally Closed): Normalmente cerrado. Cuando el relé está desactivado, hay conexión entre COM y NC. Cuando se activa, COM se desconecta de NC.

Para el control de luces, generalmente usaremos COM y NO, ya que queremos que la luz esté apagada por defecto y se encienda solo cuando activamos el relé.

Conexión del Módulo de Relé a la Raspberry Pi

⚠️ Advertencia: Asegúrate de que la Raspberry Pi esté desconectada de la corriente eléctrica antes de realizar cualquier conexión física. Ten extrema precaución al manipular cables conectados a la red eléctrica.

Aquí te mostramos cómo conectar un módulo de relé de un solo canal a tu Raspberry Pi. Si tienes uno de múltiples canales, cada canal tendrá sus propios pines IN, mientras que VCC y GND se comparten.

  1. Relé GND Raspberry Pi GND (Cualquier pin GND, ej. pin 6).
  2. Relé VCC Raspberry Pi 5V (Pin 2 o Pin 4).
  3. Relé IN1 Raspberry Pi GPIO (Elije un pin GPIO libre, ej. GPIO 17, pin 11).

Aquí un diagrama de conexiones (simplificado para un relé, enfocándose en la parte de control DC):

Raspberry Pi Pin 2 (5V) Pin 6 (GND) Pin 11 (GPIO 17) Módulo de Relé VCC GND IN1

Conexión de la Carga de AC

Esta es la parte más crítica y donde debes tener máxima precaución.

  1. Corta el cable de alimentación de tu lámpara o dispositivo AC. Necesitarás tres extremos: el enchufe, el extremo que va a la luz, y los dos cables cortados.
  2. Conecta el cable de fase (vivo) del enchufe al terminal COM del relé.
  3. Conecta el cable de fase (vivo) que va a la luz al terminal NO del relé.
  4. El cable de neutro (y tierra, si aplica) de tu enchufe y de tu luz se conectan directamente entre sí, sin pasar por el relé.
⚠️ Advertencia: Es fundamental aislar correctamente todas las conexiones de AC con cinta aislante o termoretráctil y proteger el módulo de relé dentro de una caja para evitar contactos accidentales. Si no estás seguro, consulta a un electricista.

🐍 Paso 3: Controlando el Relé con Python

Ahora que las conexiones físicas están hechas, es hora de escribir el código Python para controlar el relé.

Instalación de la Librería RPi.GPIO

La mayoría de las distribuciones de Raspberry Pi OS ya vienen con RPi.GPIO preinstalada. Si no la tienes, puedes instalarla con:

sudo apt install python3-rpi.gpio

Script Básico para Controlar un Relé

Crea un nuevo archivo llamado control_luz.py:

nano control_luz.py

Introduce el siguiente código:

import RPi.GPIO as GPIO
import time

# Define el pin GPIO que usarás para el relé
# Usa la numeración BCM (Broadcom SOC channel)
RELAY_PIN = 17 

# Configuración de los pines GPIO
GPIO.setmode(GPIO.BCM) # Usa la numeración BCM
GPIO.setup(RELAY_PIN, GPIO.OUT) # Configura el pin como salida

def encender_luz():
    print("Encendiendo la luz...")
    # Los módulos de relé comunes suelen activarse con un LOW (0V)
    # y desactivarse con un HIGH (3.3V o 5V).
    # Verifica la hoja de datos de tu relé, algunos son activos-HIGH.
    GPIO.output(RELAY_PIN, GPIO.LOW)

def apagar_luz():
    print("Apagando la luz...")
    GPIO.output(RELAY_PIN, GPIO.HIGH)

if __name__ == '__main__':
    try:
        print("Prueba de control de luz:")
        encender_luz()
        time.sleep(5) # La luz permanecerá encendida por 5 segundos
        apagar_luz()
        time.sleep(2) # La luz permanecerá apagada por 2 segundos
        encender_luz()
        time.sleep(5)
        apagar_luz()

    except KeyboardInterrupt:
        print("\nPrograma terminado por el usuario.")
    finally:
        # Limpia la configuración de GPIO al salir
        GPIO.cleanup()
        print("GPIOs limpiados.")

Guarda el archivo (Ctrl + X, Y, Enter) y ejecútalo:

python3 control_luz.py

Deberías ver cómo tu luz se enciende y apaga según el script. Si el comportamiento es inverso (se enciende con HIGH y apaga con LOW), simplemente invierte GPIO.LOW y GPIO.HIGH en las funciones encender_luz() y apagar_luz().

📌 **Nota:** `GPIO.cleanup()` es crucial para liberar los pines GPIO al finalizar el script. Si no lo haces, los pines podrían quedar en un estado inesperado y causar problemas en ejecuciones futuras.

🌐 Paso 4: Creando una Interfaz Web con Flask

Para controlar nuestras luces de forma remota, construiremos una pequeña aplicación web usando Flask, un microframework de Python.

Instalación de Flask

pip install Flask

Estructura del Proyecto

Crearemos una estructura de directorios simple:

~/smart_home/
├── app.py
└── templates/
    └── index.html

Crea el directorio smart_home y templates:

mkdir ~/smart_home
mkdir ~/smart_home/templates

app.py (La Lógica del Servidor)

Navega al directorio smart_home y crea app.py:

cd ~/smart_home
nano app.py
from flask import Flask, render_template, request
import RPi.GPIO as GPIO
import time

app = Flask(__name__)

# --- Configuración de GPIO (igual que en el script anterior) ---
RELAY_PIN = 17 
GPIO.setmode(GPIO.BCM)
GPIO.setup(RELAY_PIN, GPIO.OUT)
# Asegúrate de que la luz esté apagada al iniciar el servidor
GPIO.output(RELAY_PIN, GPIO.HIGH) 

def set_light_state(state):
    if state == 'on':
        GPIO.output(RELAY_PIN, GPIO.LOW) # Activar relé
        return True
    elif state == 'off':
        GPIO.output(RELAY_PIN, GPIO.HIGH) # Desactivar relé
        return False
    return None

@app.route('/')
def index():
    current_state = "encendida" if GPIO.input(RELAY_PIN) == GPIO.LOW else "apagada"
    return render_template('index.html', state=current_state)

@app.route('/control', methods=['POST'])
def control_light():
    action = request.form['action']
    new_state = set_light_state(action)
    if new_state is not None:
        current_state_str = "encendida" if new_state else "apagada"
        print(f"Luz {current_state_str}.")
    return index()

if __name__ == '__main__':
    try:
        # Para que el servidor sea accesible desde cualquier IP en la red
        app.run(host='0.0.0.0', port=8000, debug=False) 
    except KeyboardInterrupt:
        print("\nApagando servidor web.")
    finally:
        GPIO.cleanup()
        print("GPIOs limpiados al apagar el servidor.")

index.html (La Interfaz Web)

Crea el archivo index.html dentro del directorio templates:

nano templates/index.html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Control de Luces Inteligentes</title>
    <style>
        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
        .container { background-color: #ffffff; padding: 30px; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); text-align: center; width: 100%; max-width: 400px; }
        h1 { color: #4A90D9; margin-bottom: 25px; font-size: 2.2em; }
        p { font-size: 1.1em; margin-bottom: 30px; }
        .button-group { display: flex; justify-content: space-around; gap: 15px; margin-bottom: 25px; }
        .button { padding: 15px 30px; border: none; border-radius: 8px; cursor: pointer; font-size: 1.1em; font-weight: bold; transition: background-color 0.3s ease, transform 0.2s ease; }
        .button.on { background-color: #50C878; color: white; }
        .button.on:hover { background-color: #4CAF50; transform: translateY(-2px); }
        .button.off { background-color: #FF6B6B; color: white; }
        .button.off:hover { background-color: #e53935; transform: translateY(-2px); }
        .state { font-size: 1.3em; font-weight: bold; margin-top: 20px; padding: 10px; border-radius: 8px; background-color: #e0f7fa; color: #00796b; border: 1px solid #00acc1; }
        .state.on { background-color: #e8f5e9; color: #2e7d32; border-color: #4caf50; }
        .state.off { background-color: #ffebee; color: #c62828; border-color: #ef5350; }
    </style>
</head>
<body>
    <div class="container">
        <h1>💡 Control de Luz Inteligente</h1>
        <p>Estado actual de la luz: <span class="state {{ 'on' if state == 'encendida' else 'off' }}">{{ state.capitalize() }}</span></p>
        
        <form action="/control" method="post" class="button-group">
            <button type="submit" name="action" value="on" class="button on">✅ Encender</button>
            <button type="submit" name="action" value="off" class="button off">❌ Apagar</button>
        </form>
    </div>
</body>
</html>

Ejecutando la Aplicación Web

Desde el directorio ~/smart_home, ejecuta:

python3 app.py

Ahora, abre un navegador web en tu ordenador o teléfono y visita la dirección IP de tu Raspberry Pi seguida del puerto 8000. Por ejemplo, http://192.168.1.100:8000 (reemplaza 192.168.1.100 con la IP real de tu Pi).

Verás una página con botones para encender y apagar tu luz. ¡Felicidades, has creado tu propia luz inteligente!

100% Completo

✨ Mejoras Adicionales (Ideas para el futuro)

Este es solo el comienzo. Aquí tienes algunas ideas para expandir tu proyecto:

  • Múltiples Luces: Utiliza un módulo de relé con más canales (4, 8, 16) y extiende el código Python para controlar cada luz de forma independiente.
  • Programación: Añade funcionalidad para programar el encendido/apagado de las luces a horas específicas o con temporizadores. Puedes usar la librería schedule de Python o cron para esto.
  • Sensores: Integra sensores de luz (LDR) para encender las luces automáticamente al anochecer, o sensores de movimiento (PIR) para que las luces se enciendan al detectar presencia.
  • Interfaz de Usuario Avanzada: Utiliza un framework web más potente como Django, o herramientas frontend como React/Vue para una interfaz de usuario más dinámica y atractiva.
  • Control por Voz: Conecta tu sistema a asistentes de voz como Google Assistant o Alexa usando servicios como IFTTT o Home Assistant.
  • Seguridad: Implementa autenticación de usuario y cifrado HTTPS para proteger tu interfaz web. Para el acceso externo (fuera de tu red local), considera una VPN o servicios de túnel seguros.
  • Automatización Local: Usa Node-RED o Home Assistant directamente en tu Raspberry Pi para una gestión de automatización más robusta y con una interfaz gráfica.

Ejemplo de Estructura para Múltiples Luces

Si quisieras añadir más luces, modificarías tu app.py para manejar múltiples pines GPIO y tu index.html para tener más botones.

# app.py (fragmento para múltiples luces)
LIGHTS = {
    'sala': 17, # GPIO 17 para la luz de la sala
    'cocina': 27 # GPIO 27 para la luz de la cocina
}

# ... en la función index()
@app.route('/')
def index():
    states = {}
    for name, pin in LIGHTS.items():
        states[name] = "encendida" if GPIO.input(pin) == GPIO.LOW else "apagada"
    return render_template('index.html', states=states)

@app.route('/control/<light_name>', methods=['POST'])
def control_light(light_name):
    if light_name in LIGHTS:
        pin = LIGHTS[light_name]
        action = request.form['action']
        if action == 'on':
            GPIO.output(pin, GPIO.LOW)
        elif action == 'off':
            GPIO.output(pin, GPIO.HIGH)
    return index()

Y tu index.html tendría un bucle para generar los controles por cada luz:

<!-- index.html (fragmento para múltiples luces) -->
<div class="container">
    <h1>💡 Control de Luces Inteligentes</h1>
    {% for name, state in states.items() %}
        <p>{{ name.capitalize() }}: <span class="state {{ 'on' if state == 'encendida' else 'off' }}">{{ state.capitalize() }}</span></p>
        <form action="/control/{{ name }}" method="post" class="button-group">
            <button type="submit" name="action" value="on" class="button on">✅ Encender</button>
            <button type="submit" name="action" value="off" class="button off">❌ Apagar</button>
        </form>
        <hr style="border: none; border-top: 1px solid #eee; margin: 20px 0;">
    {% endfor %}
</div>

💡 Consideraciones Finales y Seguridad

  • Aislamiento: Siempre usa relés, no conectes la Raspberry Pi directamente a la red eléctrica.
  • Cajas de Seguridad: Protege todos tus componentes y conexiones con cajas adecuadas para evitar cortocircuitos y contactos accidentales.
  • Conocimiento Eléctrico: Si no tienes experiencia con instalaciones eléctricas, busca ayuda. La seguridad es lo primero.
  • Protección contra sobretensiones: Considera usar un protector de sobretensiones para tus dispositivos conectados y la Raspberry Pi.
  • Desconexión Segura: Siempre desconecta la corriente antes de manipular cualquier cable o componente.

Este proyecto es una excelente introducción al mundo de la domótica con Raspberry Pi. Te proporciona las bases para expandir tus ideas y crear un hogar aún más inteligente y conectado. ¡Experimenta, aprende y, sobre todo, mantente seguro!

Paso 1: Configuración de Raspberry Pi
Paso 2: Conexión del Módulo de Relé
Paso 3: Control con Python
Paso 4: Interfaz Web con Flask
¡Proyecto Completado! Disfruta de tu casa inteligente.

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!