Raspberry PI – Implementar un sistema d'automatització de casa assequible [Part III]

Després de diversos mesos, he decidit tornar a Aquest projecte amb la qual tinc la intenció de crear una sistema domòtic lliure, i assequible econòmicament; Aquest baix consum basats en Microcomputadors, però multi-plataforma i portàtil a qualsevol mecanisme amb OS GNU/Linux disponible des de Portuària GPIO.En posts anteriors Podem aprendre a controlar els mòduls de Relés optoacoplados amb Gerd PI per colpejar, PHP, i Python; en aquesta ocasió M'han optimitzat el sistema d'automatització, i per cert he emigrat a Raspberry PI 3 de disposar de connectivitat sense cables, Però si ho desitja pot utilitzar qualsevol model anterior.

La maquinari Consta de dos mòduls de vuit relés cada, que componen un total de Sortides de setze per controlar electrodomèstics, Preses elèctriques, il·luminació; i un sense fi de dispositius que es convertiran en aquest petit Raspberry PI 3, en tot el que necessari per casa domòtica Oficina d'u convencional.

Esquema d'automatització de construcció

Magnetotèrmic interruptor diagrama domòtica DIY.

Quadre de control està programat en PHP, i és una optimització del codi de la versió prèvia però la intenció de gestionar el GPIO directament a través colpejar en gran mesura que accelera el procés; una obligació, Ja que això servirà mitjançant la pàgina WiFi.

FremooticsPI

El tauler de control web sistema de automatització.

El fet de sense arxius addicionals gestionar les sortides Portuària GPIO de Gerd per Python; Converteix aquest simple pàgina web, una filera, en el veritable punt de partida del qual ha esdevingut algun dia a un sistema domòtic complet que jo s'aniran desenvolupant junts.

<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 &nbsp;<input type="submit" name="encender4" value="Encender">
 <input type="submit" name="apagar4" value="Apagar">

 <!--GPIO17/IN2-->
 <form action="" method="post">
 &nbsp; Interruptor 02 &nbsp;<input type="submit" name="encender17" value="Encender">
 <input type="submit" name="apagar17" value="Apagar">

<br></br>

 <!--GPIO27/IN3-->
 <form action="" method="post">
 Interruptor 03 &nbsp;<input type="submit" name="encender27" value="Encender">
 <input type="submit" name="apagar27" value="Apagar">

 <!--GPIO22/IN4-->
 <form action="" method="post">
 &nbsp; Interruptor 04 &nbsp;<input type="submit" name="encender22" value="Encender">
 <input type="submit" name="apagar22" value="Apagar">

<br></br>

 <!--GPIO18/IN5-->
 <form action="" method="post">
 Interruptor 05 &nbsp;<input type="submit" name="encender18" value="Encender">
 <input type="submit" name="apagar18" value="Apagar">

 <!--GPIO23/IN6-->
 <form action="" method="post">
 &nbsp; Interruptor 06 &nbsp;<input type="submit" name="encender23" value="Encender">
 <input type="submit" name="apagar23" value="Apagar">

<br></br>

 <!--GPIO24/IN7-->
 <form action="" method="post">
 Interruptor 07 &nbsp;<input type="submit" name="encender24" value="Encender">
 <input type="submit" name="apagar24" value="Apagar">

 <!--GPIO25/IN8-->
 <form action="" method="post">
 &nbsp; Interruptor 08 &nbsp;<input type="submit" name="encender25" value="Encender">
 <input type="submit" name="apagar25" value="Apagar">

<br></br>

 <!--GPIO5/IN1-->
 <form action="" method="post">
 Interruptor 09 &nbsp;<input type="submit" name="encender5" value="Encender">
 <input type="submit" name="apagar5" value="Apagar">

 <!--GPIO6/IN2-->
 <form action="" method="post">
 &nbsp; Interruptor 10 &nbsp;<input type="submit" name="encender6" value="Encender">
 <input type="submit" name="apagar6" value="Apagar">

<br></br>

 <!--GPIO13/IN3-->
 <form action="" method="post">
 Interruptor 11&nbsp;<input type="submit" name="encender13" value="Encender">
 <input type="submit" name="apagar13" value="Apagar">

 <!--GPIO12/IN4-->
 <form action="" method="post">
 &nbsp; Interruptor 12 &nbsp;<input type="submit" name="encender12" value="Encender">
 <input type="submit" name="apagar12" value="Apagar">

<br></br>

 <!--GPIO19/IN5-->
 <form action="" method="post">
 Interruptor 13 &nbsp;<input type="submit" name="encender19" value="Encender">
 <input type="submit" name="apagar19" value="Apagar">

 <!--GPIO16/IN6-->
 <form action="" method="post">
 &nbsp; Interruptor 14 &nbsp;<input type="submit" name="encender16" value="Encender">
 <input type="submit" name="apagar16" value="Apagar">

<br></br>

 <!--GPIO20/IN7-->
 <form action="" method="post">
 Interruptor 15 &nbsp;<input type="submit" name="encender20" value="Encender">
 <input type="submit" name="apagar20" value="Apagar">

 <!--GPIO21/IN8-->
 <form action="" method="post">
 &nbsp; Interruptor 16 &nbsp;<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

?>

Per dur a terme les connexions entre gerds i relleus., Heu de anar a peu de la lletra les taules següents basat en l'esquema GPIO BCM; perquè en cas contrari tindreu que modifiqui les línies a l'arxiu PHP, i reemplaçar en la codi els números de PIN empleats.

Model de PI Gerd B + / 2/3 Mòdul de relleus 1
+ 5V + 5V
GPIO 4
EN 1
GPIO 17
EN 2
GPIO 27 EN 3
GPIO 22
EN 4
GPIO 18 EN 15
GPIO 23
IN1 6
GPIO 24
IN1 7
GPIO 25
IN1 8
GND GND
Model de PI Gerd B + / 2/3 Mòdul de relleus 2
+ 5V + 5V
GPIO 5
EN 1
GPIO 6
EN 2
GPIO 13
EN 3
GPIO 12
EN 4
GPIO 19
IN1 5
GPIO 16
IN1 6
GPIO 20
IN1 7
GPIO 21
IN1 8
GND GND

Una vegada connectat tot el agulles de cap de Gerd a les respectives VCC, GND, e aportacions de la Relleus; només queda Copiï l'arxiu PHP a la Gerd PI, a quina utilitat SCP que ens ho permetrà remotament.

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/

També remotament Passarem el fitxer al directori del servidor web, i us assignarem com pels propietaris SSH a la l'usuari i grup www-dades; s'afegeix a la Grup gpio, i llavors Tornem a arrencar per aplicar els canvis.

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

En l'últim Alimentem amb relleus de 230V com hem vist en el articles anteriors fent un pont entre l'entrada i els altres pols positiu, utilitzar un sol Endoll, o canviar interruptor de circuit en miniatura; Però si volem connectar Dispositius de setze alt consum és recomana utilitzar dos, o més endolls.

relespuenteados

Esquema del pont entre els pols positiu del mòdul relleus.

Els cables restants, que corresponen a la Pol negatiu i a la pren de Terra, Anem a connectar-los directament al dispositiu voler de control a través de la Mòdul de relleus, en el meu cas un Endoll domòtica DIY; També hem de tenir en compte que seguretat dels nostres relleus hauria de tenir sortida de 1A, Així que per a 16 sortides es necessita un relé de 16A.

Relleus diagrama endoll

Diagrama endoll domòtica DIY.

En el següent vídeo Podeu veure l'actuació d'aquest Sistema de setze sortides marcant-los, a través d'una demostració amb una làmpada de baix consum; Si t'agrada no t'oblidis Segueix-me a YouTube per no perdre cap de les vídeos inèdits Vaig a publicar.

Si us agrada podeu segueix-me a Refilar, Facebook, Google +, LinkedIn, Feedly, o compartir-lo amb els botons sota aquesta publicació, Si vostè té alguna pregunta o suggeriment no dubtis a comentar.

Ajuda'ns a arribar a més lectors Share on LinkedInShare on FacebookTweet about this on TwitterShare on Google+Email this to someone

16 Reflexions sobre la"Raspberry PI – Implementar un sistema d'automatització de casa assequible [Part III]

  1. Peatonet una pregunta, He copiat el codi com és i tot funciona correctament, excepte que botons endarrere anar, engegar el tancar avall i viceversa.

    Gràcies per tot d'un bloc brillant.

    • Hola XuFLeS, Gracias por tu comentario.

      Probablement té a veure amb el relleu la connexió de xarxa; Seria útil comprovar si heu connectat en horari habitual (NO) en comptes de normalment tancat (NC).

      ens veiem aviat.

      • Estic provant abans de connectar els contactes per 230 V i el vermell portat del relè és convertit en quan girar-se de pols. He modificat alguna cosa el codi per invertir-lo i és ben, però ho havia sorgit dubtes la veritat. Gràcies x la seva resposta.

  2. Bona aportació. Necessito alguna cosa similar per control de reg, però en una condició: Si una de les n sortides estan en 1 llavors GPIOx serà en 1. OS GPIO = 0 si només si tots = 0. Qualsevol idea?? On són sortides electrovàlvules i GPIOx bomba. Des de ja moltes gràcies.

    • Hola Edu,

      Segons el nombre de sortides de finals, utilitzar un o més gerds PI; seria un simple, amb diversos ha considerant que és la manera més òptima informació entre dispositius.

      Gràcies pels seus comentaris.

  3. Hola, Estic interessat en això perquè m'agradaria controlar llums exteriors des del telèfon.
    Seria la primera vegada intentat alguna cosa amb gerds.
    Però dubte m sorgeix quan trucar a aquest post “tercera”.
    Codi PHP amb només que com falta no utilitzaria res de parts d'un i dos?
    Entenc que aquest codi seria index. php, on posa iria?
    Gràcies alot!

    • Hola Pau,

      Només amb aquest codi PHP pot executar la versió més ' actual’ Sistema.

      En els anteriors tutorials i comentaris d'ells explicar on és l'arxiu (index. php), com donar els permissions correctes, etc.…

      Gràcies pel comentari.

      • Moltes gràcies per la seva resposta ràpida.
        Que ja he connectat amb un plat únic de vuit relés.
        Però una cosa rara, està passant a mi que no poden trobar una solució.
        Donant els botons de la web, les GPIO són em activat perfectament, donant la seva tensió corresponent i mantenir-lo fins que desactiveu-lo, però d'altra banda, el relleu fa seu “Feu clic a” corrent però no canviar. El so és com si el relleu és activase i està desactivat, És tan ràpid que el mesurador no detecta qualsevol canvi.
        Que podria ser deguda a?
        Gràcies.

        Salu2!

        • He trobat l'error.
          En el codi PHP, en el torn de comanda, eliminar el codi $a- executiu(“Eco 18 > /sys/classe/gpio/inexportar”); , com vostè tenir-lo en el primer interruptor i ara treballa I.
          Ara el que fa, la primera vegada que engega el gerd; els vuit leds a la llum d'intensitat mitjana, vostè ha de encendre i tancar una vegada i llavors es gira en el liderat bé i ara obres corregir.

          Salu2!

          • Perdó per ser tan pesat amb tants comentaris, però aquest és el primer projecte que vaig fer amb el meu raspery i és sorprenent i molt! És aquesta classe.
            I el món que s'obre amb aquest equipament és inmeso!
            A la web, sense deixar el PHP, es podia veure que l'interruptor és actiu?
            Els canvis de, podria arribar a manejat amb horari i calendari?
            Realment,M'han obert un món nou, molt entretingut i econòmica.

            Salu2 i gràcies!

          • Hola Pau GC.

            Crec que en un comentari expliquen com comprovar que l'interruptor és lectura activa a través de l'estat de PHP de la GPIO.

            Per controlar el temps programàticament la cosa més simple és utilitzar el dimoni CRON sistema per executar el que vol, vegades al qual le Marquès.

            Moltes gràcies pels seus comentaris.

          • projecte ja força Tendal, per llegir que l estat de la gpio és suficient per utilitzar
            executiu ( “GPIO llegir 29”, $status21 );
            Si ($status21[0] == 0) {
            }
            i posar les mènsules que voleu mostrar si està encesa o = = estatus a 1 per al tancament.

            La numeració de la gpio llegir no coincideix amb la numeració de gpio Portuària, Si voleu poso aquí la taula d'equivalències per a cada port amb la numeració de lectura que feia.

            L'únic que encara no entenc, és perquè 1 És lliure i 0 És en.
            i per què en el gerd, totes les sortides són sense estat, deixant a mitja tensió i sortides no treball fins que convertir-los dues vegades.

            Crear una reinicialització de lloc, el que fa és donar l'ordre a totes les sortides, un “son” i una altra vegada per donar l'ordre a extingir-los tots, Després d'aquest procés ja estan completament funcional.

            Pot ser que passen aquestes dues coses?

            Salu2!

          • Hola Pau, Perdoneu el retard però jo estic últimament molt poc temps entre treball i estudis.

            En primer lloc vull donar les gràcies que han compartit el seu progrés amb els altres lectors del bloc, Quan tinc temps lliure que tinc pendent continuar aquesta secció de tutorials sobre Domòtica fàcil i assequible, però és realment un orgull per a mi veure-vos que seguiu amb el projecte i anar fent cadascuna en el seu propi sistema personalitzat.

            Connexió en el relleu mitjançant l'assignació d'un baix valor lògic (0), i convertir-los amb un valor lògic alt (1) És possible que degut a que ha connectat el relleu a 230V com normalment obert en lloc normalment circuit tancat, com deia el lector XuFLes el primer comentari d'aquest article; Si ho intentes i el problema persisteix, Senti lliure de comentar i tractar de pensar en qualsevol altra possibilitat.

            Per evitar haver de fer les sortides restaurarà després de cada Raspbian encesa, Podeu crear un script senzill que exportar i establir els pins que voleu tornar a arrencar, i llanci'l per exemple de rc.local.

          • Hola!
            Res en aquesta tarda en la resposta!
            És lògic pren-te temps i sobretot en aquestes dates.
            Encesa i apagada, Funciona al revés, Tinc els relleus connectats.

            I què de la rc.local, per evitar haver d'anar a la pàgina per restablir, com si fos.

            Salu2!

  4. Bon vianant, He estat llegint el 3 classes en parts d'automatització de casa, però en la seva programació va molt ràpid per la meva, el tema sembla super interessant però crec que necessitem un detall d'un sistema domòtic completa i és de rebre aportació des de fora, ( botons, sensors de llum, etc.). M'agradaria col·laborar i pensar en la part elèctrica em pot ajudar i a canvi li demano ajuda per entendre la programació sencera. El meu e-mail és tecnico.Antono.Raya@gmail.com

    Una salutació i Felicitats per la web

  5. Hola que tal, me interesa el proyecto, pero no veo el repositorio de github, me gustaría cooperar, estoy a punto de comprarme un raspberry pi para proyectos basados en domótica, aunque no conozco mucho de electrónicaestamos aprendiendo, saludos.

Deixa un comentari