Programar fácil con Arduino

Programar fácil con Arduino, entiende cómo funciona el mundo.

  • Inicio
  • Blog
  • Podcast
  • ¿Quién soy?
  • Contactar
  • Acceder
Usted está aquí: Inicio / Podcast / 88. Servidor web Low Cost con Raspberry Pi

88. Servidor web Low Cost con Raspberry Pi

Comentarios(6)
Luis del Valle Hernández

http://api.spreaker.com/download/episode/9062389/podcast88.mp3

Podcast: Descargar (30.9MB)

Raspberry Pi proyectos

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&param2=valor2&param3=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.

DHT11 ARDUINO MKR1000

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.

¿VAS COPIANDO Y PEGANDO CÓDIGO COMO UN POLLO SIN CABEZA?

Mini-curso de Arduino para principiantes y pollos.

Por si quieres aprender (gratis) de qué va esto de Arduino.

7 vídeos + 1 caso práctico

Explicado para que lo entienda
hasta tu abuela.

__CONFIG_colors_palette__{"active_palette":0,"config":{"colors":{"30800":{"name":"Main Accent","parent":-1},"f2bba":{"name":"Main Light 10","parent":"30800"},"trewq":{"name":"Main Light 30","parent":"30800"},"frty6":{"name":"Main Light 45","parent":"30800"},"flktr":{"name":"Main Light 80","parent":"30800"}},"gradients":[]},"palettes":[{"name":"Default","value":{"colors":{"30800":{"val":"rgb(59, 136, 253)","hsl":{"h":216,"s":0.98,"l":0.61}},"f2bba":{"val":"rgba(59, 136, 253, 0.1)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.1}},"trewq":{"val":"rgba(59, 136, 253, 0.3)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.3}},"frty6":{"val":"rgba(59, 136, 253, 0.45)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.45}},"flktr":{"val":"rgba(59, 136, 253, 0.8)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.8}}},"gradients":[]},"original":{"colors":{"30800":{"val":"rgb(59, 136, 253)","hsl":{"h":216,"s":0.98,"l":0.61}},"f2bba":{"val":"rgba(59, 136, 253, 0.1)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.1}},"trewq":{"val":"rgba(59, 136, 253, 0.3)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.3}},"frty6":{"val":"rgba(59, 136, 253, 0.45)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.45}},"flktr":{"val":"rgba(59, 136, 253, 0.8)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.8}}},"gradients":[]}}]}__CONFIG_colors_palette__

TinyGS estaciones terrestres de código abierto

Bienvenidos a un capitulo nuevo de «La tecnología para todos«. Hoy vienen al podcast Oscar, German y José Manuel, para contar sobre Tiny GS la red … [+ info...]

raspberry pi vs intel nuc

Raspberry Pi vs Intel NUC

Bienvenidos a «La tecnología para todos«. En este capitulo de la sexta temporada junto a German y José Manuel, se plantea una incógnita: ¿Qué … [+ info...]

ESP-32

ESP32 Wifi y Bluetooth en un solo chip

ESP32 es una familia de microcontroladores de la empresa Espressif Systems. Su analogía más clara es la de un ESP8266 con esteroides, que incluye … [+ info...]

Copyright © 2021 · Programar Fácil · Aviso legal

Utilizamos cookies propios y de terceros para mejorar nuestros servicios y experiencia de usuario. Si continua navegando, consideramos que acepta su uso.Aceptar Política de privacidad y cookies
Política de cookies

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Siempre activado

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Non-necessary

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.

GUARDAR Y ACEPTAR