INTERNET DE LAS COSAS [PARTE 2] – SUBIR LOS DATOS A UNA BASE DE DATOS

¡Hola! Seguimos con la serie de tutoriales del Internet de las Cosas (Internet of Things). Como ya comenté en el tutorial anterior, en estos artículos aprenderemos a leer datos de Arduino y a guardarlos en una base de datos para después graficarlos.

Los tutoriales que forman parte de esta serie son:

  1. Leer datos de Arduino: leeremos la temperatura de un sensor LM35.
  2. Mandar estas lecturas a una base de datos que se encuentre en un servidor. Utilizaré mi Raspberry Pi.
  3. Graficar estos datos con HighCharts.

En esta segunda parte, crearemos la base de datos y subiremos los datos de los sensores a ella. En este caso sólo tengo un sensor de temperatura (LM35), así que será más sencillo que si tenemos muchos.

El ecosistema de la aplicación que estamos realizando consta de dos partes principales: una es el cliente (Arduino) y otra el servidor, que estará programado en PHP. No es nada del otro mundo, pero si queréis darle un repaso, os aconsejo estos tutoriales de PHP.

Paso 1: crear la base de datos

Si no tenéis instalado LAMP en vuestra Raspberry Pi, os recomiendo que os paséis por este tutorial para instalar un servidor Web en Raspberry Pi. Una vez tengáis eso hecho, podréis seguir con lo que viene ahora.

Abrimos phpMyAdmin para crear la base de datos. Yo la voy a llamar "sensores":

A continuación, creamos una tabla llamada "valores", la cual tendrá 3 columnas:

Estas 3 columnas van a ser las siguientes:

  • ID: aquí se almacenará el identificador del registro. Será la clave primaria.
  • valor: en este campo se almacenará el valor de la lectura del sensor.
  • tiempo: este campo almacenará la hora en que se ha tomado la muestra.

Como podéis observar en la captura de pantalla anterior, tenemos que el atributo tiempo va a ser de tipo TIMESTAMP y su valor predeterminado es CURRENT_TIMESTAMP. Esto significa que cada vez que insertemos una muestra en la base de datos, en el campo tiempo se almacenará la hora actual.

Si queréis profundizar más en el tema de creación de bases de datos, os recomiendo que leáis este tutorial.

Paso 2: programación del servidor

Una vez configurada la base de datos, procedemos a la programación del servidor. Puede ser una Raspberry Pi o incluso vuestro propio ordenador. También vale un servidor remoto.

Voy a crear una carpeta dentro de mi servidor que se va a llamar tutoiot (tutorial Internet de las Cosas) y, dentro crearé dos archivos: config.php y iot.php. El archivo config.php contiene la información para establecer una conexión con la base de datos. El archivo iot.php se encarga de subir los datos recibidos a la base de datos de sensores. Los datos los vamos a pasar a través de GET.

<?php // config.php // Credenciales $dbhost = "localhost"; $dbuser = "user"; $dbpass = "pass"; $dbname = "sensores"; // Conexión con la base de datos $con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); ?><?php // iot.php // Importamos la configuración require("config.php"); // Leemos los valores que nos llegan por GET $valor = mysqli_real_escape_string($con, $_GET['valor']); // Esta es la instrucción para insertar los valores $query = "INSERT INTO valores(valor) VALUES('".$valor."')"; // Ejecutamos la instrucción mysqli_query($con, $query); mysqli_close($con); ?> Para probar si funciona, simplemente vamos a abrir el navegador e insertar una muestra en la base de datos. Los métodos GET no es que sean demasiado seguros, pero como esto es un proyecto "de una tarde", tampoco vamos a complicarnos demasiado la vida. La IP de mi servidor es la 192.168.1.6, así que en el navegador introduzco lo siguiente:

192.168.1.6/tutoiot/iot.php?valor=22.55

Esto quiere decir que estoy metiendo en la base de datos un valor de 22.55, que representa la temperatura leída por Arduino.

Paso 3: programación de Arduino

Una vez configurada la base de datos, tenemos que programar el Arduino. Como lo conectaremos, en este caso, a un servidor remoto, ya sea la Raspberry Pi o cualquier ordenador, tendremos que introducir algunas variables extra para conseguir la conexión.

Si recordáis el primer tutorial, el código era muy simple. Únicamente leíamos el valor del sensor y lo mostrábamos con el monitor serial. No teníamos en cuenta la parte de Ethernet Shield, cosa que sí haremos ahora.

#include <Ethernet.h> #include <SPI.h> // Configuracion del Ethernet Shield byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Direccion MAC byte ip[] = { 192,168,1,100 }; // Direccion IP del Arduino byte server[] = { 192,168,1,6 }; // Direccion IP del servidor EthernetClient client; float temperatura; int analog_pin = 0; void setup(void) { Ethernet.begin(mac, ip); // Inicializamos el Ethernet Shield delay(1000); // Esperamos 1 segundo de cortesia } void loop(void) { temperatura = analogRead(analog_pin); temperatura = 5.0*temperatura*100.0/1024.0; //Display in Serial Monitor Serial.print(temperatura); //Return temperature to Monitor Serial.println(" oC"); // Proceso de envio de muestras al servidor Serial.println("Connecting..."); if (client.connect(server, 80)>0) {  // Conexion con el servidor client.print("GET /tutoiot/iot.php?valor="); // Enviamos los datos por GET client.print(temperatura); client.println(" HTTP/1.0"); client.println("User-Agent: Arduino 1.0"); client.println(); Serial.println("Conectado"); } else { Serial.println("Fallo en la conexion"); } if (!client.connected()) { Serial.println("Disconnected!"); } client.stop(); client.flush(); delay(60000); // Espero un minuto antes de tomar otra muestra }

Una vez hecho esto, conectamos el Ethernet Shield a nuestro router y comenzará a mandar los datos al servidor, tal y como se ve en la siguiente imagen:

Esto es todo por este tutorial. Espero que os haya servido y, si tenéis alguna duda, dejad un comentario. ¡Saludos!