Tras varios meses he decidido retomar este proyecto con el que pretendo crear un sistema domótico libre, y económicamente asequible; basado en este microcomputador de bajo consumo, pero multiplataforma y portable a cualquier dispositivo con sistema operativo GNU/Linux que disponga de puerto GPIO.En anteriores entradas aprendimos a controlar modulos de relés optoacoplados con Raspberry PI mediante bash, PHP, y Python; en esta ocasión he optimizado el sistema domótico, y de paso lo he migrado a Raspberry PI 3 para disponer de conectividad inalámbrica, pero si lo deseáis podéis usar cualquier modelo anterior.
El hardware consta de dos módulos de ocho relés cada uno, que conforman un total de dieciséis salidas para controlar electrodomésticos, tomas eléctricas, iluminación; y un sin fin de dispositivos que convertirán a esta pequeña Raspberry PI 3, en todo lo necesario para domotizar una casa u oficina convencionales.
El panel de control está programado en PHP, y es una optimización del código de la anterior versión pero pensado para gestionar los GPIO directamente mediante bash lo que acelera en gran medida el proceso; algo imprescindible, puesto que serviremos esta página mediante WiFi.
El hecho de prescindir de los archivos adicionales para gestionar las salidas del puerto GPIO de Raspberry mediante Python; convierte esta simple página web, un único archivo, en el verdadero punto de partida del que ha de convertirse algún día en un completo sistema domótico que iremos desarrollando juntos.
<html>
<head>
<title>Panel de control - Sistema domotico libre</title>
</head>
<body>
<div align="center">
<br></br>
<!--GPIO4/IN1-->
<form action="" method="post">
Interruptor 01 <input type="submit" name="encender4" value="Encender">
<input type="submit" name="apagar4" value="Apagar">
<!--GPIO17/IN2-->
<form action="" method="post">
Interruptor 02 <input type="submit" name="encender17" value="Encender">
<input type="submit" name="apagar17" value="Apagar">
<br></br>
<!--GPIO27/IN3-->
<form action="" method="post">
Interruptor 03 <input type="submit" name="encender27" value="Encender">
<input type="submit" name="apagar27" value="Apagar">
<!--GPIO22/IN4-->
<form action="" method="post">
Interruptor 04 <input type="submit" name="encender22" value="Encender">
<input type="submit" name="apagar22" value="Apagar">
<br></br>
<!--GPIO18/IN5-->
<form action="" method="post">
Interruptor 05 <input type="submit" name="encender18" value="Encender">
<input type="submit" name="apagar18" value="Apagar">
<!--GPIO23/IN6-->
<form action="" method="post">
Interruptor 06 <input type="submit" name="encender23" value="Encender">
<input type="submit" name="apagar23" value="Apagar">
<br></br>
<!--GPIO24/IN7-->
<form action="" method="post">
Interruptor 07 <input type="submit" name="encender24" value="Encender">
<input type="submit" name="apagar24" value="Apagar">
<!--GPIO25/IN8-->
<form action="" method="post">
Interruptor 08 <input type="submit" name="encender25" value="Encender">
<input type="submit" name="apagar25" value="Apagar">
<br></br>
<!--GPIO5/IN1-->
<form action="" method="post">
Interruptor 09 <input type="submit" name="encender5" value="Encender">
<input type="submit" name="apagar5" value="Apagar">
<!--GPIO6/IN2-->
<form action="" method="post">
Interruptor 10 <input type="submit" name="encender6" value="Encender">
<input type="submit" name="apagar6" value="Apagar">
<br></br>
<!--GPIO13/IN3-->
<form action="" method="post">
Interruptor 11 <input type="submit" name="encender13" value="Encender">
<input type="submit" name="apagar13" value="Apagar">
<!--GPIO12/IN4-->
<form action="" method="post">
Interruptor 12 <input type="submit" name="encender12" value="Encender">
<input type="submit" name="apagar12" value="Apagar">
<br></br>
<!--GPIO19/IN5-->
<form action="" method="post">
Interruptor 13 <input type="submit" name="encender19" value="Encender">
<input type="submit" name="apagar19" value="Apagar">
<!--GPIO16/IN6-->
<form action="" method="post">
Interruptor 14 <input type="submit" name="encender16" value="Encender">
<input type="submit" name="apagar16" value="Apagar">
<br></br>
<!--GPIO20/IN7-->
<form action="" method="post">
Interruptor 15 <input type="submit" name="encender20" value="Encender">
<input type="submit" name="apagar20" value="Apagar">
<!--GPIO21/IN8-->
<form action="" method="post">
Interruptor 16 <input type="submit" name="encender21" value="Encender">
<input type="submit" name="apagar21" value="Apagar">
</div>
</body>
</html>
<?php
// Funciones PHP del pin GPIO 4
if ($_POST[encender4]) {
$a- exec("echo 4 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio4/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio4/value");
echo $a;
}
if ($_POST[apagar4]) {
$a- exec("echo 0 > /sys/class/gpio/gpio4/value");
echo $a;
}
// Fin de las funciónes del pin GPIO 4
// Funciones PHP del pin GPIO 17
if ($_POST[encender17]) {
$a- exec("echo 17 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio17/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio17/value");
echo $a;
}
if ($_POST[apagar17]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio17/value");
$a- exec("echo 17 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 17
// Funciones PHP del pin GPIO 27
if ($_POST[encender27]) {
$a- exec("echo 27 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio27/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio27/value");
echo $a;
}
if ($_POST[apagar27]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio27/value");
$a- exec("echo 27 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 27
// Funciones PHP del pin GPIO 22
if ($_POST[encender22]) {
$a- exec("echo 22 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio22/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio22/value");
echo $a;
}
if ($_POST[apagar22]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio22/value");
$a- exec("echo 22 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 22
// Funciones PHP del pin GPIO 18
if ($_POST[encender18]) {
$a- exec("echo 18 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio18/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio18/value");
echo $a;
}
if ($_POST[apagar18]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio18/value");
$a- exec("echo 18 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 18
// Funciones PHP del pin GPIO 23
if ($_POST[encender23]) {
$a- exec("echo 23 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio23/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio23/value");
echo $a;
}
if ($_POST[apagar23]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio23/value");
$a- exec("echo 23 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 23
// Funciones PHP del pin GPIO 24
if ($_POST[encender24]) {
$a- exec("echo 24 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio24/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio24/value");
echo $a;
}
if ($_POST[apagar24]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio24/value");
$a- exec("echo 24 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 24
// Funciones PHP del pin GPIO 25
if ($_POST[encender25]) {
$a- exec("echo 25 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio25/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio25/value");
echo $a;
}
if ($_POST[apagar25]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio25/value");
$a- exec("echo 25 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 25
// Funciones PHP del pin GPIO 5
if ($_POST[encender5]) {
$a- exec("echo 5 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio5/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio5/value");
echo $a;
}
if ($_POST[apagar5]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio5/value");
$a- exec("echo 5 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 5
// Funciones PHP del pin GPIO 6
if ($_POST[encender6]) {
$a- exec("echo 6 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio6/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio6/value");
echo $a;
}
if ($_POST[apagar6]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio6/value");
$a- exec("echo 6 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 6
// Funciones PHP del pin GPIO 13
if ($_POST[encender13]) {
$a- exec("echo 13 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio13/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio13/value");
echo $a;
}
if ($_POST[apagar13]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio13/value");
$a- exec("echo 13 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 13
// Funciones PHP del pin GPIO 12
if ($_POST[encender12]) {
$a- exec("echo 12 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio12/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio12/value");
echo $a;
}
if ($_POST[apagar12]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio12/value");
$a- exec("echo 12 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 12
// Funciones PHP del pin GPIO 19
if ($_POST[encender19]) {
$a- exec("echo 19 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio19/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio19/value");
echo $a;
}
if ($_POST[apagar19]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio19/value");
$a- exec("echo 19 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 19
// Funciones PHP del pin GPIO 16
if ($_POST[encender16]) {
$a- exec("echo 16 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio16/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio16/value");
echo $a;
}
if ($_POST[apagar16]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio16/value");
$a- exec("echo 16 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 16
// Funciones PHP del pin GPIO 20
if ($_POST[encender20]) {
$a- exec("echo 20 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio20/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio20/value");
echo $a;
}
if ($_POST[apagar20]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio20/value");
$a- exec("echo 20 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 20
// Funciones PHP del pin GPIO 21
if ($_POST[encender21]) {
$a- exec("echo 21 > /sys/class/gpio/export");
$a- exec("echo out > /sys/class/gpio/gpio21/direction");
$a- exec("echo 1 > /sys/class/gpio/gpio21/value");
echo $a;
}
if ($_POST[apagar21]) {
$a- exec("sudo echo 0 > /sys/class/gpio/gpio21/value");
$a- exec("echo 21 > /sys/class/gpio/unexport");
echo $a;
}
// Fin de las funciónes del pin GPIO 21
?>
Para realizar las conexiones entre Raspberry y el relé, debéis seguir al pié de la letra las siguientes tablas basadas en el esquema GPIO BCM; pues de lo contrario tendréis que modificar las líneas del archivo PHP, y substituir en el código los números de pin empleados.
Raspberry PI Modelo B+/2/3 | Modulo relés 1 |
+ 5V | + 5V |
GPIO 4 |
IN 1 |
GPIO 17 |
IN 2 |
GPIO 27 | IN 3 |
GPIO 22 |
IN 4 |
GPIO 18 | IN 15 |
GPIO 23 |
IN1 6 |
GPIO 24 |
IN1 7 |
GPIO 25 |
IN1 8 |
GND | GND |
Raspberry PI Modelo B+/2/3 | Modulo relés 2 |
+ 5V | + 5V |
GPIO 5 |
IN 1 |
GPIO 6 |
IN 2 |
GPIO 13 |
IN 3 |
GPIO 12 |
IN 4 |
GPIO 19 |
IN1 5 |
GPIO 16 |
IN1 6 |
GPIO 20 |
IN1 7 |
GPIO 21 |
IN1 8 |
GND | GND |
Una vez conectados todos los pins de Raspberry a los respectivos VCC, GND, e inputs del relé; ya solo queda copiar el archivo PHP a la Raspberry PI, para lo que utilizaremos scp que nos permitirá hacerlo remotamente.
usuario@maquina:~ $ scp index.php pi@192.168.1.*:/home/pi/
usuario@maquina:~ $ ssh pi@192.168.1.* -C sudo mv /home/pi/index.php /var/www/html/
También de forma remota moveremos el archivo al directorio del servidor web, y asignaremos como propietarios mediante ssh al usuario y grupo www-data; lo añadiremos al grupo gpio, y acto seguido reiniciaremos para aplicar los cambios.
usuario@maquina:~ $ ssh pi@192.168.1.* -C sudo chown www-data:www-data /var/www/html/index.php
usuario@maquina:~ $ ssh pi@192.168.1.* -C sudo usermod -a -G gpio www-data
usuario@maquina:~ $ ssh pi@192.168.1.* -C sudo reboot
Finalmente alimentaremos el relé con 230V como vimos en los anteriores artículos haciendo un puente entre la entrada y los demás polos positivos, para utilizar un único enchufe, o interruptor magnetotérmico; pero si pretendemos conectar dieciséis dispositivos de consumo elevado es recomendable utilizar dos, o más enchufes.
Los cables restantes, que corresponden al polo negativo y a la toma de tierra, los conectaremos directamente al dispositivo que queremos controlar mediante el modulo de relés; en mi caso un enchufe domotizado DIY.
En el siguiente vídeo podéis ver el funcionamiento de este sistema de dieciséis salidas mediante la comprobación de las mismas, mediante una demostración con una lámpara de bajo consumo; si os gusta no olvidéis seguirme en Youtube para no perderos ninguno de los vídeos inéditos que voy publicando.
Si te ha gustado puedes seguirme en Twitter, Facebook, Google+, Linkedin, Feedly, o compartirlo con los botones ubicados debajo de esta publicación, si tienes cualquier pregunta o sugerencia no dudes en comentar.