Podcast: Descargar (30.9MB)

Cualquier proyecto que se precie necesita tener un servidor por dos motivos básicos, almacenar datos y mostrar esos datos almacenados. Siempre que hablo de servidores debemos tener una parte hardware y otra parte software. En este capítulo voy a exponer las diferentes alternativas que tenemos para crear con Raspberry Pi proyectos DIY. Seremos capaces de almacenar y consultar la información a muy bajo coste y con un consumo mínimo.
Pero no todo vale, aunque Raspberry Pi es una buena opción, debemos ser conscientes de sus limitaciones en cuanto al rendimiento y al almacenamiento. Veremos diferentes alternativas cuando nuestros proyectos requieren de más pretaciones. Lo que si debemos tener claro es que una buena opción para crear con Raspberry Pi proyectos, es utilizar un servidor web. Da lo mismo del hardware que utilicemos.
Podemos utilizar Raspberry Pi en proyectos de diferente índole. Para un sistema de control de riego, controlando la humedad del suelo y la temperatura y así tomar decisiones para un regadío óptimo. Control de niveles de líquidos en recipientes. Consumos de energía. En definitiva, cualquier proyecto que requiera de un almacenamiento y análisis de datos.
Ya hemos visto algún ejemplo donde utilizábamos un servidor web. Con Arduino MKR1000 y la librería WiFi101 tenemos la opción de montar uno dentro de la propia placa. Esta configuración tiene dos grandes inconvenientes. Por un lado, es complicado almacenar datos. Se requiere de periféricos e incluso de algún servidor. Por otro lado el consumo, al configurar el Arduino MKR1000 como servidor web, necesita estar siempre conectado contestando las peticiones de los clientes. Esto supone que el módulo WiFi siempre deba estar conectado con el consiguiente consumo de batería. Sin embargo, es una manera muy sencilla para conocer los conceptos que hay detrás de los dispositivos del IoT.
También veremos como el Arduino MKR1000 puede funcionar como un cliente web. Esto nos permitirá ahorrar consumo en la batería y hacer peticiones al servidor. Gracias al método GET para enviar datos por HTTP, podremos pasar la información de Arduino a Raspberry Pi.
Crear con Raspberry Pi proyectos para almacenar datos
Sin duda alguna, mi elección con respecto al hardware es Raspberry Pi. Gracias a su bajo coste y a su bajo consumo, lo hacen el hardware ideal para crear proyectos DIY. Pero debemos de conocer otras opciones por si las necesidades del proyecto nos lo requieren.
Alternativas a Raspberry Pi
A continuación te voy a detallar diferentes alternativas divididas en dos grandes grupos, plataformas en la nube y servidores dedicados.
Plataformas en la nube
Una de las alternativas que más en auge están en estos momentos son los servicios en la nube (Cloud Computing). Las grandes empresas del sector ofrecen este tipo de servicio e incluso algunos específicos para las nuevas tendencias como el IoT. A continuación te enumero las más conocidas.
- Azure (Microsoft)
- AWS (Amazon)
- Compute Engine (Google)
Además de las más comunes, existen plataformas como thinger.io o Xively especializadas en los objetos conectados.
Todas ellas requieren de conocimientos en diferentes áreas como los servicios web, manejo de APIs y algún lenguaje de programación ya sea JavaScript, Java o C#. El coste dependerá de nuestras necesidades pero por lo general, no son muy baratas. Debemos tener en cuenta la seguridad, se envían datos a través de Internet. Por el contrario, nos olvidamos del mantenimiento del servidor, la propia empresa se encarga, y tienen un alto rendimiento y disponibilidad.
Servidor dedicado
Es el escalón intermedio entre hacer con Raspberry Pi proyectos de bajo coste y las plataformas en la nube. Podemos utilizar diferentes sistemas operativos pero los más comunes son Linux y Windows. Al igual que los servicios en la nube, debemos tener conocimientos previos, y tenemos un coste añadido debido al propio hardware, debemos comprar un servidor. Si utilizamos Windows hay que añadir la licencia. Su consumo es más elevado que el de la Raspberry Pi y requiere de un mantenimiento por nuestra parte.
Puestos a elegir, si el proyecto requiere de ciertas funcionalidades que no nos puede aportar Raspberry Pi, yo me decantaría por las plataformas en la nube. Aunque el coste puede ser algo superior, nos olvidamos del mantenimiento del hardware y el software. Solo nos centramos en programar.
Raspberry Pi
Para sistemas pequeños, crear con Raspberry Pi proyectos DIY quizás sea la mejor opción. Pero no nos engañemos, tenemos que tener conocimientos previos y además debemos ser capaces de mantener un servidor Linux. Por el contrario vamos a abaratar costes y reducir el consumo.
Eligiendo el servidor web
Una vez que tenemos claro que Raspberry Pi es la mejor opción para nuestros proyectos, hay que elegir el software que nos permita almacenar y consultar los datos. Lo lógico y normal es que utilicemos un servidor web ya que tiene estas dos funcionalidades. Dentro del abanico que tenemos a nuestra disposición, debemos elegir aquel software que nos permita crear con Raspberry Pi proyectos de una manera sencilla y fácil. Ya te hablé en el capítulo 47 las diferentes opciones que tenemos. A continuación te las voy a detallar.
- Apache + PHP
- Tomcat + Java
- NodeJS + JavaScript
- .NET Core + ASP.NET
Pero existen otras alternativas muy válidas e igual de potentes. Un servidor web o «microframework» (como ellos mismos lo denominan) que está subiendo en popularidad en este último año es Flask. En concepto, es muy parecido a NodeJS y se sale de los estereotipos de los servidores más comunes como Apache.
Flask, servidor web con Python
Si tengo que elegir una virtud de este servidor, sin duda alguna destaca su sencillez. Es extremadamente sencillo comenzar y configurar un servidor de este tipo. Los creadores lo denominan «microframework». Esto es debido a que tiene un núcleo o core muy simple pero que es extensible. En la instalación inicial viene lo indispensable para que haga las funciones de un servidor web. Esto es muy importante para crear con Raspberry Pi proyectos. No olvidemos que una de las limitaciones es la capacidad de almacenamiento. Esto vendrá determinado por la tarjeta SD que utilicemos.
Gracias a su faceta extensible, podemos ir añadiendo módulos que doten de funcionalidades extra al servidor. Por ejemplo, podemos añadir validación de datos de formulario o acceso a datos.
Otro punto fuerte es que está escrito en Python. Para programar una aplicación debemos tener conocimientos de este lenguaje de programación. Requiere la versión 3. Esto no es ningún inconveniente ya que la versión Raspbian, el sistema operativo para Raspberry Pi basado en la distribución de Linux Debian, lo lleva incorporado.
Es un software de código abierto que lo podemos encontrar en GitHub. Lo puedes descargar y modificar a tu antojo.
Comunicación entre Arduino y Flask
No es necesario disponer de un Arduino MKR1000 para almacenar datos. Nos basta con cualquier Arduino con acceso a la red ya sea a través de un shield WiFi o Ethernet. El objetivo es que se comporte como un cliente y que haga peticiones al servidor. La cuestión es ¿cómo enviamos los datos al servidor? Hay dos métodos que permiten hacer esto, el POST y el GET. Se utiliza sobre todo para enviar datos de un formulario. La gran diferencia entre ellos es que el método POST lo envía oculto, no los vemos a simple vista, y el método GET los envía en la URL.
Lo más conveniente en este caso sería enviar los datos a través del método GET. Para que te hagas una idea, el resultado sería algo parecido a esto.
1 |
http://www.tudominio.com/grabar/?param1=valor1¶m2=valor2¶m3=valor3 |
Ejemplo sensor DHT11, Arduino MKR1000 y Raspberry Pi
Como ves es muy sencillo. Vamos a verlo con un simple ejemplo. Imagínate que tenemos un sistema donde tenemos conectado un Arduino MKR1000 a un sensor de temperatura y humedad, el DHT11. El esquema eléctrico sería el siguiente.

Programación Arduino MKR1000
En la parte que toca a Arduino, vamos a configurar la placa para que se comporte como un cliente y no como un servidor. Además tenemos que leer el sensor de temperatura y humedad DHT11. Esto lo haremos a través de la librería WiFi101 y de la DHT. El resultado es el siguiente sketch que debemos cargar en la placa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include "DHT.h" #include <SPI.h> #include <WiFi101.h> #define DHTPIN 5 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); int maxh = 0, minh = 100, maxt = 0, mint = 100; char ssid[] = "SSID"; char pass[] = "CLAVE"; int keyIndex = 0; int status = WL_IDLE_STATUS; IPAddress server(192, 168, 1, 37); // Ip de la Raspberry Pi WiFiClient client; void setup() { Serial.begin(9600); Serial.println("Comprobacion sensor DHT11:"); dht.begin(); Serial.begin(9600); while (!Serial) { ; } if (WiFi.status() == WL_NO_SHIELD) { Serial.println("No tiene WiFi"); while (true); } while (status != WL_CONNECTED) { Serial.print("Intentando contectar a la red con SSID: "); Serial.println(ssid); status = WiFi.begin(ssid, pass); delay(10000); } Serial.println("Conectado a la wifi"); } void loop() { int h = dht.readHumidity(); int t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Fallo al leer del sensor DHT"); } else { if (client.connect(server, 5000)) { Serial.println("Conectado al servidor"); client.print("GET /guardar/?temperatura="); client.print(t); client.print("&humedad="); client.print(h); client.println(" HTTP/1.1"); client.println("Host: 192.168.1.37"); client.println("Connection: close"); client.println(); client.stop(); } } delay(1000); } |
Debes cambiar la IP de la Raspberry Pi y el SSID y CLAVE de la WiFi. Es importante cuando queremos crear con Raspberry Pi proyectos que se conecten a la red. Debemos tener una seguridad mínima.
Programación Raspberry Pi
Antes de continuar asegúrate que tienes Flask bien instalado. Puedes seguir este tutorial donde te explico como hacerlo paso a paso. Una vez lo tengas configurado sustituye el archivo app.py por este otro.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from flask import Flask, render_template, request app = Flask(__name__) temp = 0 hume = 0 @app.route('/') def index(): return 'Página inicial, consulta de temperatura y humedad' @app.route('/cargar/') def cargar(): return render_template('temperatura.html',temperatura = temp, humedad = hume) @app.route('/guardar/') def guardar(): global temp global hume temp = request.args.get('temperatura') hume = request.args.get('humedad') return render_template('temperatura.html',temperatura = temp, humedad = hume) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0') |
En este nuevo archivo tenemos tres rutas. El index, que solo muestra un texto de bienvenida, /cargar/, para mostrar los datos almacenados en las variables globales temp y hume y la ruta /guardar/ que será la que reciba los datos del Arduino MKR1000.
Programación página web
Todo se muestra a través de una plantilla, temperatura.html, que es responsive gracias a Bootstrap. Te dejo a continuación el código. Debes descargarlo y guardarlo en una carpeta que se llame templates donde tengas el archivo app.py.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Control de temperatura</title> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> <style type="text/css"> header { background-color: #2980b9; color: white; } aside{ background-color: #0f5786; color: white; } #h1temp{ font-size: 100px; } .color1{ background-color: #e67d22; color: white; } .color2{ background-color: white; color: #e67d22; } footer { background-color: #2980b9; color: white; } a:link { color: white; } a:visited { color: white; } a:hover { color: hotpink; } a:active { color: white; } </style> </head> <body> <header> <div class="container"> <h1>Control de temperatura</h1> <h3>Arduino MKR1000</h3> <h4><a href="https://programarfacil.com">programarfacil.com</a></h4> </div> </header> <div class="container"> <section class="main row"> <article class="col-xs-12 col-sm-4 col-md-4 col-lg-4 "> <h3 class="text-center">Temperatura</h3> <h1 id="h1temp" class="text-center">{{ temperatura }}°</h1> </article> <article class="col-xs-12 col-sm-4 col-md-4 col-lg-4 "> <h3 class="text-center">Humedad</h3> <h1 id="h1temp" class="text-center">{{ humedad }}%</h1> </article> <aside class="col-xs-12 col-sm-4 col-md-4 col-lg-4"> <h3>Arduino MKR1000</h3> <p><img src="https://i0.wp.com/programarfacil.com/wp-content/uploads/2016/04/mkr1000-difuminada.jpg?w=450" alt="MKR1000" style="width:190px;height:127px;" class="img-responsive center-block"></p> </aside> </section> </div> <footer> <div class="container"> <h4>Luis del Valle <a href="https://twitter.com/ldelvalleh">@ldelvalleh</a></h4> </div> </footer> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-2.2.3.min.js" integrity="sha256-a23g1Nt4dtEYOj7bR+vTu7+T8VP13humZFBJNIYoEJo=" crossorigin="anonymous"></script> </body> </html> |
Y con esto, ya podemos crear con Raspberry Pi proyectos que nos almacenen los datos. Es muy sencillo y nos será de mucha utilidad.
Muchas gracias a todos por los comentarios y valoraciones que haces en iVoox, iTunes y en Spreaker, me da mucho ánimo para seguir con este proyecto.