覆盆子 PI – 實施可負擔得起的家庭自動化系統 [第三部分]

幾個月後,我決定返回到 此專案 與我打算創建的 免費的家庭自動化系統, 和 經適房; 此微機為基礎的低消費, 但 跨平臺 可擕式 到任何設備與作業系統 GNU/Linux 可從 GPIO.前面的帖子 我們學會了如何控制模組 繼電器 optoacoplados覆盆子 PI 通過 bash, PHP, 和 Python; 在這個場合 我已經優化自動化系統, 順便說一句我已經遷移到 覆盆子 PI 3 處置 無線連接, 但是,如果你希望你可以使用任何以前的模型.

硬體 它是由兩個模組的八個繼電器 每個, 這使總數的 十六出局 控制 電器, 電動千斤頂, 照明; 並沒有結束 設備 將它轉換成這小 覆盆子 PI 3, 在你需要的一切 domotic 的房子 u 辦公室 常規.

樓宇自動化計畫

斷路開關圖 domotic DIY.

控制台被程式設計中 PHP, 和是一種優化的代碼 以前的版本 但用於進行管理 GPIO 直接通過 bash 大大加快這一進程; 一定要來, 因為我們將為此服務通過頁 Wifi 上網.

FremooticsPI

自動化系統 web 控制台.

事實 沒有附加檔 管理埠輸出 GPIO覆盆子 通過 Python; 將轉換這個簡單 web 頁, 單個檔, 在真正的起始點的已成為某一天在 全套家居自動化系統 我將開發 在一起.

<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

?>

若要執行 覆盆子和繼電器之間的連接, 你必須 以下各表去山腳下這封信 基於架構 GPIO BCM; 因為否則你就不得不修改檔中的行 PHP, 在中和替換 代碼 數目 PIN 雇員.

覆盆子 PI 模型 B + / 2/3 繼電器模組 1
+ 5V + 5V
GPIO 4
在 1
GPIO 17
在 2
GPIO 27 在 3
GPIO 22
在 4
GPIO 18 在 15
GPIO 23
IN1 6
GPIO 24
IN1 7
GPIO 25
IN1 8
吉安達 吉安達
覆盆子 PI 模型 B + / 2/3 繼電器模組 2
+ 5V + 5V
GPIO 5
在 1
GPIO 6
在 2
GPIO 13
在 3
GPIO 12
在 4
GPIO 19
IN1 5
GPIO 16
IN1 6
GPIO 20
IN1 7
GPIO 21
IN1 8
吉安達 吉安達

一旦連接了所有 針腳覆盆子 對各自 VCC, 吉安達, e 投入 的的 繼電器; 剩下的只是 將 PHP 檔案複製 覆盆子 PI, 什麼用 SCP 這將使我們能夠這樣做 遠端.

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/

遠端 我們將該檔移到 web 伺服器的目錄, 和我們將指派由業主 SSH使用者和組 www 資料; 會將其添加到 組 gpio, 然後 我們重新開機以應用所做的更改.

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

最後 我們用 230V 繼電器喂 正如我們看到的 以前的文章 製作 入口處和其他陽性兩極之間的橋樑,, 若要使用單個 插頭, 或切換 小型斷路器; 但是,如果我們想要連接 十六個設備 高消費是 建議使用兩個, 或更多插頭.

relespuenteados

積極的兩極之間的中繼模組橋方案.

其餘的電線, 對應于 負極 及至 需要的 地球, 我們會將它們連接 直接到設備 想要通過控制 繼電器模組, 在我的例子 插頭 domotic DIY; 我們亦應謹記一點, 為了安全我們繼電器均應具有 1A 退出, 所以對於 16 產出將需要的繼電器 16自.

繼電器圖插頭

圖插頭 domotic DIY.

在以下 視頻 你可以看到這性能 十六個輸出系統 通過檢查他們, 通過演示 用低能量燈; 如果你喜歡不要忘記 按照我上 YouTube 為了不錯過任何的 未發佈的視頻 我要發佈.

如果你願意,你可以跟著我 推特, Facebook, 谷歌 +, LinkedIn, Feedly, 或它分享這份出版物下方的按鈕, 如果您有任何疑問或建議,請不要猶豫,置評.

説明我們達成更多的讀者 Share on LinkedInShare on FacebookTweet about this on TwitterShare on Google+Email this to someone

15 思考"覆盆子 PI – 實施可負擔得起的家庭自動化系統 [第三部分]

  1. Peatonet 的問題, 我已複製的代碼是和一切工作正常, 除了那去的後退按鈕, 打開關閉下降,反之亦然.

    謝謝你的所有輝煌的博客.

      • 我正在測試連接到連絡人之前 230 V 和紅帶領的繼電器轉身的時候關閉脈衝. 我略有修改代碼以扭轉這種局面和看起來很好, 但懷疑真理出現了我. 謝謝你的回答.

  2. 好的貢獻. 我需要類似的東西為灌溉控制,但有一個條件: 如果一個 n 輸出處於 1 然後,GPIOx 將在 1. 骨 GPIO 如果只有當所有輸出 = 0 = 0. 任何想法?? 電磁閥和 GPIOx 泵輸出在哪裡. 從已經謝謝你.

  3. 你好, 我對此感興趣,因為我想要控制一些外國從移動的燈.
    它將是第一次嘗試與覆盆子.
    但引起我懷疑,當調用這個帖子 “第三部分”.
    只有那 PHP 代碼已經不會缺乏使用什麼第一和第二的部分?
    我明白,此代碼將 index.php, 在哪裡放置莎?
    多謝!

      • 非常感謝您的及時反應.
        我已與八個繼電器單剪板連接.
        但一件罕見的事發生在我身上,找不到解決方案.
        使 web 按鈕的, GPIO 是啟動我完美, 給予其相應的電壓和保持,直到將其關閉, 但另一方面,繼電器使其 “按一下” 運行但不是開關. 聲音是好像繼電器是劍和停用, 它是如此之快米沒有檢測到任何更改.
        這可能是由於?
        謝謝.

        Salu2!

        • 我發現 bug.
          在 PHP 代碼中, 關閉命令, 刪除 $a 代碼- exec(“回聲 18 > /sys/類/gpio/匯出”); , 因為你有第一個交換器上和現在的作品我.
          現在是什麼讓, 第一次你打開覆盆子; 8 個 led 到中等強度的光, 你要打開和關閉一次,然後你打開 led 好和現在的作品正確.

          Salu2!

          • 抱歉我說得太重了這麼多評論,但這是我跟我的 raspery 的第一個專案,它是令人驚歎和非常非常簡單! 是本教程.
            打開與此設備的世界是 inmeso!
            在 web 上, 無需離開 PHP, 你可以看到那個開關處於活動狀態?
            開關, 能達到處理與時間安排和時間安排?
            真理的,我已經打開了一個新的世界, 非常有趣和經濟.

            Salu2 和感謝!

          • Hola Pablo GC.

            Creo que en algún comentario expliqué como ver que interruptor está activo leyendo mediante PHP el estado de los GPIO.

            Para el control mediante programación horaria lo más sencillo es usar el demonio del sistema CRON para que ejecute lo que desees, a las horas que le marques.

            非常感謝你的評論.

          • ya avancé bastante en el proyecto, para leer el estado de los gpio basta con usar
            exec ( “gpio read 29”, $status21 );
            如果 ($status21[0] == 0) {
            }
            y meter entre los corchetes lo que quieres que se muestre si está encendido o estatus == a 1 para apagado.

            La numeración del gpio read no concuerda con la numeración del puerto gpio, si queréis os pongo aquí la tabla que hice de equivalencias de cada puerto con su numeración de read.

            Lo único que sigo sin entender, es porque 1 es apagado y 0 es encendido.
            y por que al encender la raspberry, todas las salidas salen sin estado, dejando las salidas a medio voltage y sin funcionar asta que las apagas dos veces.

            Cree una pagina reset, que lo que hace es darle la orden de apagar a todas las salidas, 一個 “睡眠” y otra vez vuelve a dar la orden de apagarlas todas, después de este proceso ya quedan todas funcionales.

            Por que puede ser que pasen estas dos cosas?

            Salu2!

          • 嗨,保羅 ·, disculpa la demora pero últimamente ando muy escaso de tiempo entre el trabajo y los estudios.

            En primer lugar quiero agradecerte que hayas compartido tus avances con los demás lectores del blog, en cuanto tenga tiempo libre tengo pendiente continuar esta sección de tutoriales sobre domótica fácil y asequible, pero es realmente un orgullo para mi ver como seguís vosotros mismos adelante con el proyecto y lo vais convirtiendo cada uno en vuestro propio sistema personalizado.

            Respecto a encender los relés asignando un valor lógico bajo (0), y apagarlos con un valor lógico alto (1) es posible que se deba a que tengas conectado el relé al circuito de 230V como normalmente abierto en lugar de normalmente cerrado, como le comenté al lector XuFLes en el primer comentario de este artículo; si lo pruebas y el problema persiste, no dudes en comentar e intentaremos pensar en alguna otra posibilidad.

            Para no tener que hacer el reset de las salidas después de cada encendido de Raspbian, puedes crear un simple script que exporte y configure los pins que desees al iniciar el sistema, y lanzarlo por ejemplo desde rc.local.

          • 你好!
            No pasa nada en que tardes en contestar!
            Es lógico que te lleve tiempo y sobre todo en estas fechas.
            Lo de encendido y apagado, que funcione al revés, los relés los tengo bien conectados.

            Y lo del rc.local, para no tener que entrar a la pagina de reset, como lo haría.

            Salu2!

  4. Buenas peatones, llevo tiempo leyendo las 3 partes de tutoriales sobre domotica, pero en la parte programación vais muy rápido para mi, el tema me parece super interesante pero creo que nos falta un detalle para poder realizar un sistema domotico completo y es poder recibir input del exterior, ( pulsadores, sensores lumínicos, 等). Me gustaría colaborar y creo que en la parte eléctrica os puedo ayudar y a cambio os pido ayuda para comprender toda la parte programación. Mi correo es tecnico.antono.raya@gmail.com

    Un saludo y felicidades por la web

留言