Raspberry PI y los pines GPIO: Controlando el LED desde una interfaz web





Vamos a instalar el servidor web apache, y aprenderemos a escribir el código en HTML y PHP para controlar  un LED, o varios, desde una interfaz web.
Lo primero que debemos hacer es instalar el servidor web LAMP, para lo que teclearemos las siguientes órdenes en la terminal:

#Actualizamos los repositorios y el software de la pi
usuario@maquina:~$ sudo apt-get update && sudo apt-get upgrade

#Instalamos LAMP
usuario@maquina:~$ sudo apt-get install apache2
usuario@maquina:~$ sudo apt-get install php5 libapache2-mod-php5
usuario@maquina:~$ sudo service apache2 restart

Ahora añadiremos como sudoer al usuario www-data, esta no es la opción mas segura pero recordemos que estamos haciendo una prueba en un entorno controlado; para un entorno en producción deberíamos buscar otra forma de ejecutar los scripts en python como sudoer.
Para editar estos permisos, escribimos sudo visudo en la terminal y al final del archivo añadimos a www-data como sudoer, debe quedar así.

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
pi ALL=(ALL) NOPASSWD: ALL
www-data ALL=(ALL) NOPASSWD: ALL

Para cada pin GPIO debemos crear un subdirectorio y tres scripts en Python; uno para encender, otro para apagar, y un último script para hacer parpadear nuestro LED, veamos un ejemplo con el pin 4.


#!usr/bin/env/ python
## enciende.py

#Importamos la libreria y le cambiamos el nombre a GPIO
import RPi.GPIO as GPIO

#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM 
GPIO.setmode(GPIO.BCM) 

#Configuramos el pin GPIO 4 como una salida 
GPIO.setup(4, GPIO.OUT) 

#Encendemos el led 
GPIO.output(4, GPIO.HIGH) 

-------------------------------------------------------------------


#!usr/bin/env/ python
## apaga.py
#Importamos la libreria y le cambiamos el nombre a GPIO 
import RPi.GPIO as GPIO 

#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM 
GPIO.setmode(GPIO.BCM) 

#Configuramos el pin GPIO 4 como una salida 
GPIO.setup(4, GPIO.OUT) 

#Apagamos el led 
GPIO.output(4, GPIO.LOW) 

#Y liberamos los GPIO 
GPIO.cleanup() 

---------------------------------------------------------------------



#!usr/bin/env/ python
## parpadea.py 
#Importamos la libreria y le cambiamos el nombre a GPIO 

import RPi.GPIO as GPIO 

#Necesario para los delays 
import time 

#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM 
GPIO.setmode(GPIO.BCM) 

#Configuramos el pin GPIO 4 como una salida 
GPIO.setup(4, GPIO.OUT) 

#Encendemos y apagamos el led 5 veces
 for i in range(0,5): 
       GPIO.output(4, GPIO.HIGH) 
       time.sleep(1) 
       GPIO.output(4, GPIO.LOW) 
       time.sleep(1) 

#Y liberamos los GPIO 
GPIO.cleanup() 

Ahora es el momento de crear nuestra página de inicio en HTML y PHP, que contendrá los botones que deberemos pulsar para ejecutar los scripts en Python desde una interfaz web, mas adelante veremos como queda la jerarquía final.


<html>
 <head>
                        <!--index.php--> 
 </head>
 <body>

  <!--GPIO17--> 
  <form action="" method="post">
   GPIO 17&nbsp;<input type="submit" name="encender17" value="Encender">
   <input type="submit" name="apagar17" value="Apagar">
   <input type="submit" name="parpadear17" value="Parpadear">

 <br></br>

  <!--GPIO27--> 
  <form action="" method="post">
   GPIO 27&nbsp;<input type="submit" name="encender27" value="Encender">
   <input type="submit" name="apagar27" value="Apagar">
   <input type="submit" name="parpadear27" value="Parpadear">

 <br></br>

  <!--GPIO4--> 
  <form action="" method="post">
   GPIO 04&nbsp;<input type="submit" name="encender4" value="Encender">
   <input type="submit" name="apagar4" value="Apagar">
   <input type="submit" name="parpadear4" value="Parpadear">

 <br></br>

  <!--GPIO22--> 
  <form action="" method="post">
   GPIO 22&nbsp;<input type="submit" name="encender22" value="Encender">
   <input type="submit" name="apagar22" value="Apagar">
   <input type="submit" name="parpadear22" value="Parpadear">

 </body>
</html>

<?php

// Funciones PHP del pin GPIO 17

//Si queremos ejecutar el  script python en segundo plano (background)
//debemos agregar al final de la linea :    > /dev/null &

  if ($_POST[encender17]) { 
    exec("sudo python /var/www/leds/gpio/17/enciende.py");
   
  }

  if ($_POST[apagar17]) { 
   exec("sudo python /var/www/leds/gpio/17/apaga.py");
   
  }

  if ($_POST[parpadear17]) { 
   exec("sudo python /var/www/leds/gpio/17/parpadea.py > /dev/null &");
   
  }

// Fin de las funciónes del pin GPIO 17


// Funciones PHP del pin GPIO 27

  if ($_POST[encender27]) { 
   exec("sudo python /var/www/leds/gpio/27/enciende.py");
   echo $a;
  }

  if ($_POST[apagar27]) { 
    exec("sudo python /var/www/leds/gpio/27/apaga.py");
   
  }

  if ($_POST[parpadear27]) { 
   exec("sudo python /var/www/leds/gpio/27/parpadea.py > /dev/null &");
   
  }

// Fin de las funciónes del pin GPIO 27


// Funciones PHP del pin GPIO 4

  if ($_POST[encender4]) { 
    exec("sudo python /var/www/leds/gpio/4/enciende.py");
   
  }

  if ($_POST[apagar4]) { 
    exec("sudo python /var/www/leds/gpio/4/apaga.py");
   
  }

  if ($_POST[parpadear4]) { 
    exec("sudo python /var/www/leds/gpio/4/parpadea.py > /dev/null &");
   
  }

// Fin de las funciónes del pin GPIO 4


// Funciones PHP del pin GPIO 22

  if ($_POST[encender22]) { 
   exec("sudo python /var/www/leds/gpio/22/enciende.py");
  
  }

  if ($_POST[apagar22]) { 
   $a- exec("sudo python /var/www/leds/gpio/22/apaga.py");
  
  }

  if ($_POST[parpadear22]) { 
   exec("sudo python /var/www/leds/ejecgpio/22/parpadea.py > /dev/null &");
  
  }

// Fin de las funciónes del pin GPIO 22

?>

Lo he agrupado todo en la misma página ya que si creaba una página en PHP para cada opción, al ejecutarla me mandaba a la página del script (una página en blanco)ahora ejecuta el código y se queda en la misma página.

Aunque he agregado algunos cambios,  el post original es : http://www.peatonet.com/raspberry-pi-y-los-pines-gpio-controlando-el-led-desde-una-interfaz-web/

Comentarios