Que Raspberry Pi abra tu garaje

Publicado por Loli Diéguez en

En esta era de IoT (Internet of Things) donde todo se puede controlar de forma remota con su teléfono inteligente, podemos darle un giro de tuerca a la forma en la que abrimos la puerta de nuestro garaje...vamos, sin usar las llaves!!.

En este tutorial, os muestro como abrir la puerta de vuestro garaje usando una Raspberry Pi, un servidor web y un rele para actuar sobre la puerta.

Antes deberás tener configurado un servidor web en tu placa, para ello puedes mirar este otro tutorial donde explico como configurar Wordpress en Raspberry Pi

El esquema de conexionado podría ser como este, comprueba que tu puerta del garaje puede ser conectada de este modo:

Esquema conexion raspberry pi con rele

 

Conecta el mecanismo de apertura de la puerta del garaje a la salida del relé, como aparece en el esquema.

 

Configuración de Flask en Raspberry Pi para controlar la puerta del garaje.

Ahora, vamos a crear un servidor web utilizando  Flask , que proporciona una forma de  enviar los comandos desde la página web alojada en Raspberry Pi a su GPIO. Flask nos permite ejecutar scripts de Python a través de una página web y podemos enviar y recibir datos entre Raspberry Pi y el navegador web. Flask  es un microframework para Python. Esta herramienta tiene su propio servidor de desarrollo y depurador integrados, soporte para pruebas, soporte para cookies seguras y es fácil de usar, estos aspectos lo hacen muy atractivo para usar en estos proyectos.

Ejecuta los siguientes comandos para instalar el Flask en tu Raspberry Pi :

sudo apt-get update 
sudo apt-get install python-pip python-flask

Ahora, ejecuta el siguiente comando para instalar Flask y sus dependencias :

sudo pip install flask

instalacion flask python en Raspberry pi

Puedes ver más información sobre como programar con Flask aquí.

Ahora, toca hacer el script en python para ejecutar en el servidor web.

Script Python para el abrir la puerta del garaje.

Este script interactuará con el GPIO de la Raspberry Pi y configurará el servidor web. Por lo tanto, esta es la parte central de este proyecto para el control de la puerta por Raspberry Pi y Python. Al final del articulo puedes descargarte el código completo, ahora vamos a desgranar algunas de las partes más interesantes del código. 

Primero, haz una carpeta donde guardaremos todo lo necesario. Todas las demás carpetas que se necesitarán deben estar en esta carpeta solamente. Ejecuta los siguientes comandos para crear la carpeta y el script python app.py dentro de esta carpeta.

mkdir garage_door 
cd garage_door 
nano app.py

Esto abrirá el editor Nano donde tenemos que escribir el script.

Comienza por incluir bibliotecas importantes.

import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__, static_url_path='/static')
 

Ahora, crea un diccionario como pines para almacenar el número, el nombre y el estado de los pines. Puedes usar más de un pin según lo que quieras hacer.

pins = {
   14 : {'name' : 'Puerta Garaje', 'state' : GPIO.LOW}
   }

 

Luego, establece el pin como salida y ponlo a 0 para empezar.

for pin in pins:
   GPIO.setup(pin, GPIO.OUT)
   GPIO.output(pin, GPIO.LOW)

 

Ahora, haz una función principal para leer el estado del pin y almacenar este estado en una variable .

@app.route("/")
def main():
   for pin in pins:
      pins[pin]['state'] = GPIO.input(pin)
..

 

Tenemos que pasar estos datos a la página html para poder controlar el estado del botón de entrada.

   return render_template ('main.html', ** templateData)

 

Ahora, haz una función para gestionar las solicitudes desde la URL con el número de pin y la acción que contiene.

@ app.route ("/ <changePin> / <action>", methods = ['GET', 'POST']) 
def action (changePin, action):

 

Convierte el pin de la URL en un entero.

   changePin = int (changePin)

 

Si la parte de acción de la URL es "abrir" , haz lo siguiente:

   if action == "abrir": 
      GPIO.output (changePin, GPIO.HIGH) 
   if action == "cerrar": 
      GPIO.output (changePin, GPIO.LOW)

 

Puedes copiar el script completo del final de este tutorial y guardarlo con ctrl + x y luego presiona Intro.

De momento ya hemos terminado con el script de python. Ahora, tenemos que hacer la página HTML para interactuar con el script de python.

 

Pagina web en Raspberry Pi como servidor web.

En la misma carpeta garage_puerta , crea otra carpeta llamada templates y dentro de esta carpeta crea un archivo .html usando los siguientes comandos:

mkdir templates 
cd templates 
nano main.html

 pagina web en Raspberry Pi

En el editor de texto nano , escribe el código html de más abajo. Puedes editar la parte <head> de la página y diseñarla según quieras. Acabo de usar el esquema css de terceros usando la etiqueta de enlace. El código HTML completo es este:

<!DOCTYPE html>
<head>
<title>Web Puerta Garaje</title>
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<center>
<body>
<h1>Web Puerta Garaje</h1>
{% for pin in pins %}
<h2>{{ pins[pin].name }}
{% if pins[pin].state == true %}
esta <strong>Abierta</strong></h2><div class="row"><div class="col-md-2">
<a href="/{{pin}}/close" class="w3-button w3-blue" role="button">Cerrar</a></div></div>
{% else %}
esta <strong>Cerrada</strong></h2><div class="row"><div class="col-md-2">
<a href="/{{pin}}/open" class="w3-button w3-black" role="button">Abrir</a></div></div>
{% endif %}
{% endfor %}
</body>
</center>
</html>

 

Aquí lo importante es crear un botón para abrir y cerrar la puerta, y asignar un estado para el botón en caso de puerta abierta o cerrada. El botón ejecutará el script the Python para comprobar el estado del pin del GPIO y enviará el comando.

Una vez que tengas el archivo html creado ya estaremos listos para usarlo.

Abre el terminal y navega hasta la carpeta garage_puerta y ejecuta el siguiente comando:

sudo python app.py

Después del comando deberías ver algo así:

Servidor python en reaspberry pi

 

Si tienes algún error te saldrán en este momento, en mi caso, he tenido varios errores por los espacios en el script de python. Así que recuerda que los espacios en Python son parte de la sintaxis del lenguaje...a mi se me olvidó por un momento.

Verás también que en mi caso el servidor lo estoy iniciando en la IP 0.0.0.0 puerto 8080, esto es así porque ya tengo otra web en el puerto 80, si no te das cuanta de esto veras un error diciendo que esa IP y puerto ya están en uso, si te pasa, solo tienes que modificar esta linea indicando otro puerto.

puerto 8080

 

Ahora, abre el navegador e introduce la dirección IP de la Raspberry Pi (o 0.0.0.0) y presiona Enter.


Verás una página como esta:

Pagina web control de puerta garaje desde Raspberry Pi

 

Asegúrate de que el módulo de relé está conectado a la Raspberry Pi. Presiona el botón Abrir para activar el relé y abrir la puerta del garaje. También puedes ver el estado del relé. Tan pronto como hayas activado el relé, el texto del botón cambiará a Cerrar para desactivar el relé. Ahora, cuando vuelvas a hacer clic en el botón, el relé se desactivará y el texto del botón cambiará a Abrir nuevamente.

Con esto ya hemos llegado al final y como ves ha sido muy sencillo configurar todo para controlar la puerta del garaje...o lo que quieras conectar al otro lado del rele!! 

Os dejo a continuación el código del script que he usado:

import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__, static_url_path='/static')
GPIO.setmode(GPIO.BCM)
pins = {
     14 : {'name' : 'Puerta garaje', 'state' : GPIO.LOW}
      }
for pin in pins:
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)

@app.route("/")
def main():
       for pin in pins:
          pins[pin]['state'] = GPIO.input(pin)
       templateData = {
             'pins' : pins
             }
        return render_template('main.html', **templateData)
@app.route("/<changePin>/<action>", methods=['GET', 'POST'])
def action(changePin, action):
      changePin = int(changePin)
      deviceName = pins[changePin]['name']
      if action == "open":
         GPIO.output(changePin, GPIO.HIGH)
      if action == "close":
         GPIO.output(changePin, GPIO.LOW)
      for pin in pins:
           pins[pin]['state'] = GPIO.input(pin)
      templateData = {
            'pins' : pins
       }
       return render_template('main.html', **templateData)
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)
GP IO.cleanup()


Compartir esta publicación



← Publicación más antigua Publicación más reciente →