jueves, 26 de enero de 2017

Control domótico de relés y cámara raspicam


IDEA ORIGINAL DE: Peatonet
http://www.peatonet.com/raspberry-pi-zero-timelapse-con-la-nueva-camara-de-8-megapixels-parte-i/#more-10362

MODIFICADO POR: Carlos Ávalos.
En construcción, sin resolver 100%

Objetivo: poder controlar diferentes dispositivos (la board de 4 relés) y la raspicam a través de una página web. La página estará alojada en un servidor apache2 en la Pi.

La página web contiene los botones (HTML) y los script en PHP con el código para ejecutar los scripts en BASH. La idea que todo este en un solo archivo.

Los botones del relé serán cuatro (encender o apagar). De momento las funciones de la raspicam será capturar una foto, capturas 5 fotos o vídeos de 10s ó 20s.

Esta es la interfase


Problemas:
  1. Las instrucciones de en los GPIO funcionan, para encender hay que darle dos veces (No se la razón).
  2. Las instrucciones en la raspicam no funciona.
Los scripts corren perfectamente de la consola linux



Web server Apache2

ps -ef  | grep -i apache2 (Para ver los permisos)


Permisos en este directorio






Código en el archivo index.php (dentro del servidor Apache)

HTML-->PHP-->BASH

La idea es que todo este contenido este en la misma página para aumentar la rapidez en la ejecución.

<html>
<head>
<title>Panel de control</title>
</head>

IDEA ORIGINAL DE: Peatonet 
<br>
MODIFICADO POR: Carlos Ávalos.
<br>
 https://chitoraspberrypi.blogspot.com.es
</br>


<div align="center">
Sistema domótico libre para un relé de 4 salidas y control de picámara
 <table>
    <thead>
    <tr>
     <th>    <img src="https://2.bp.blogspot.com/-ZdZdUSG9qyc/WHnEgudw9LI/AAAAAAAALPE/8ZPXmQE-xZEYVyNPgOj46dQpT3ZoenoqgCK4B/s1600/sense_hat_%2526_pi.png" alt="texto alternativo" width="ancho" height="alto"/></th>
    </tr>
    </thead>
    <tr>
     <td></td>
     <td></td>
    </tr>
    </table>
</div>


<!--VISUALIZACIÓN DE LOS BOTONES EN LA WEB Y CREACIÓN DE LAS VARIABLES  TABLA 2X2-->

<!--BOTONES DEL RELE-->
<br></br>
<br></br>
<div align="center">
CONTROL DEL RELE
</div>

<body>
<div align="center">
        <!--GPIO4/IN1-->
<form action="" method="post">
&nbsp;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">
&nbsp;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">


<!-- BOTONES RASPICAM-->
<br></br>
<br></br>

<div align="center">
CONTROL DE LA PICÁMARA
</div>
                <!--fotos-->
<form action="" method="post">
&nbsp; FOTOS &nbsp;
<input type="submit" name="foto1" value="1 foto">
<input type="submit" name="foto5" value="5 fotos">

                <!--videos-->
<form action="" method="post">
&nbsp; VIDEOS &nbsp;
<input type="submit" name="video10s" value="video 10s">
<input type="submit" name="video20s" value="video 20s">

</html>

<!------------------FUNCIONES EN PHP DE LOS BOTONES----------------------------->
<?php

/////////////////// control del rele

// 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 0 > /sys/class/gpio/gpio4/value");
 echo $a;
 }

 if ($_POST[apagar4]) {
 $a- exec("sudo echo 1 > /sys/class/gpio/gpio4/value");
 $a- exec("echo 4 > /sys/class/gpio/unexport");
 echo $a;
 }


// 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 0 > /sys/class/gpio/gpio17/value");
 echo $a;
 }

 if ($_POST[apagar17]) {
 $a- exec("sudo echo 1 > /sys/class/gpio/gpio17/value");
 $a- exec("echo 17 > /sys/class/gpio/unexport");
 echo $a;
 }


// 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 0 > /sys/class/gpio/gpio27/value");
 echo $a;
 }

 if ($_POST[apagar27]) {
 $a- exec("sudo echo 1 > /sys/class/gpio/gpio27/value");
 $a- exec("echo 27 > /sys/class/gpio/unexport");
 echo $a;
 }


// 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 0 > /sys/class/gpio/gpio22/value");
 echo $a;
 }

 if ($_POST[apagar22]) {
 $a- exec("sudo echo 1 > /sys/class/gpio/gpio22/value");
 $a- exec("echo 22 > /sys/class/gpio/unexport");
 echo $a;
 }


//////////////////////////////control de la raspicam

if ($_POST[foto1]) {
 $a- exec("cd /var/www/html");
 $a- exec("sh tomafotos");
 echo $a;
 }


//if ($_POST[foto5]) {
//$a- exec("sh /home/pi/Desktop/timelapses/tomafotos.sh");
//echo $a;
//}

//////otra opcion de momento desactivada

//if(isset($_GET['foto1']))
//system("raspistill -w 512 -h 320 -o /home/pi/Desktop/vigilancia/photos/img.jpg");

//if ($_POST[foto5]) {
// $a- exec("sudo python /home/pi/programas_chito/python/photo_5.py");
// echo $a;
// }


// /home/pi/Desktop/vigilancia/photos/


?>





Problemas de momento no solucionados:
  • No funciona el código ssh de la raspicam. Me comentan un amigo que puede ser un problema de permisos.
  • Mejorar la seguridad del sistema, para ser utilizados desde internet. Ya que de esta forma, cualquiera que tenga tu ip pública podría entrar al sistema domótico.
 Otras ideas

Siete imágenes en un lapso de tiempo de un minuto.
Probando si funciona raspstill desde la consola. 

-o, --output    : Output filename <filename> (to write to stdout, use '-o -'). If not specified, no file is saved
-t, --timeout   : Time (in ms) before takes picture and shuts down (if not specified, set to 5s)
-tl, --timelapse: Timelapse mode. Takes a picture every <t>ms. %d == frame number (Try: -o img_%04d.jpg)
código

raspistill -o a%04d.jpg -t 60000 -tl 10000

 

Bash script de raspicam

Para tomar fotos ejecutando este script


Puedes crear un pequeño script el cual tomará fotos. Para crear un script puedes abrir algún editor de texto (nano, etc) y escribir el siguiente código:
 
#!/bin/bash 
DATE=$(date +"%Y-%m-%d_%H%M") 
raspistill -vf -hf -o /home/pi/camera/$DATE.jpg

Este script tomará una foto y la nombrará como el "timestamp" o marca de tiempo.
También necesitará asegurarse de que la ruta existe creando la
Carpeta de la cámara

mkdir camera

Digamos que el script lo guardamos como  
camera.sh

Nosotros haremos que el archivo sea ejecutable con:
chmod +x camera.sh


Para ver las opciones de raspistill

Para poder ver las diferentes opciones, corra.  raspistill with no arguments. To scroll, redirect stderr to stdout and pipe the output to less:
 
raspistill 2>&1 | less
 
ó

raspistill --help 

Use the arrow keys to scroll and type q to exit.

Bash script de raspicam

Más completo


#!/bin/bash
# tomafoto.sh

#chmod +x tomafoto.sh para que sea un ejecutable

############  CREA UN ARCHIVO CON LA FECHA
DATE=$(date +"%Y-%m-%d_time_%H:%M:%S") #VARIABLE DATE (ANO_MES_DIA_HORA:MINUTO)

#rotado 180 en vertical y guardado en esta ruta resol:512x320 px y una calidad del 50%
#toma el nombre de la variable
raspistill -hf --quality 50 --width 520 --height 320 --output /home/pi/Desktop/timelapses/$DATE.jpg




##OTRA OPCION CREA FOTOS DENTRO DE UN DIRECTORIO DIARIO

#MIN_FOTO=$(date +%H:%M) #FOTO HORAS_MINUTOS
#DIRECTORIO=$(date +%m_%d) #DIRECTORIO MES_DIA
#raspistill -w 512 -h 320  -q 50 -o /home/pi/Desktop/timelapses/$DIRECTORIO/$MIN_FOTO.jpg

#NOTA1
#Asignar en crontap (cronetap -e) la tarea de ejecutar
#Posibles tareas
#Capturamos una imagen cada minuto.
* * * *  /home/pi/Desktop/timelapses/tomafoto.sh

#Capturamos una imágen cada 5 minutos.
#0,5,10,15,20,25,30,35,40,45,50,55  * * * * /home/pi/Desktop/timelapses/tomafoto

#Capturamos una imágen cada 10 minutos.
#0,10,20,30,40,50  * * * * /home/pi/Desktop/timelapses/tomafoto


#NOTA 2
#Comprueba si existe la carpeta de hoy, y si no, la crea.

#if [ ! -d /home/pi/Desktop/timelapses/$(date '+%m_%d'|tr -s “/” “_”) ]; then
#su -c "mkdir home/pi/Desktop/timelapses/$(date '+%m_%d'|tr -s “/” “_”)" pi
#printf "Se ha creado el directorio de timelapse de hoy"
#fi


Cronetap

crontap -e

#Capturamos una imagen cada minuto.
* * * *  /home/pi/Desktop/timelapses/tomafoto.sh

#Capturamos una imágen cada 5 minutos.
#0,5,10,15,20,25,30,35,40,45,50,55  * * * * /home/pi/Desktop/timelapses/tomafoto

#Capturamos una imágen cada 10 minutos.
#0,10,20,30,40,50  * * * * /home/pi/Desktop/timelapses/tomafoto


Creacion de un directorio en el arranque
Para terminar añadiremos las siguiente líneas de código en el archivo /etc/rc.local para que cada vez que iniciemos el sistema, se cree un subdirectorio para el día en el caso de que no se haya hecho con anterioridad, y con la fecha actual como nombre; es importante situarlas sobre la última linea de dicho script, que es la que contiene “exit 0“.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

#Comprueba si existe la carpeta de hoy, y si no, la crea.

if [ ! -d /home/pi/Desktop/timelapses/$(date '+%m_%d'|tr -s “/” “_”) ]; then
  su -c "mkdir home/pi/Desktop/timelapses/$(date '+%m_%d'|tr -s “/” “_”)" pi
  printf "Se ha creado el directorio de timelapse de hoy"
fi



exit 0







Vídeo demostrativo sin terminar.

No hay comentarios:

Publicar un comentario