Está en la página 1de 26

Proyectos Arudino

https://giltesa.com/2015/05/14/guardar-en-un-servidor-web-informacion-enviadadesde-un-arduino

Guardar en un servidor web informacin


enviada desde un Arduino

14 May 2015 17 comentarios

Como vimos en la anterior entrada enviar correos electrnicos desde Arduino es muy sencillo.
Pues bien, hacer que esos datos u otros sean guardados en el servidor, en vez de enviarlos por
correo, es tambin sencillo.

Arduino

La parte de cdigo de Arduino no cambia respecto al ejemplo de enviar emails. La informacin


se manda de la misma forma y se recoge igual por lo que esa parte de cdigo me la salto en
esta entrada y solo se vern las formas de guardar la informacin.

Servidor
Existen varias formas de guardar la informacion por lo que lo primero es decidir cmo
queremos guardar esos datos:

Mediante ficheros de texto


Sin duda la forma mas sencilla es usando un fichero de texto plano, es decir, un fichero que
podemos abrir con cualquier editor y que solo incluye la informacin de los caracteres que
contiene. Esa informacin podemos almacenarla de dos formas:
En crudo
Es decir, tal cual la recibimos desde el Arduino la volcamos en el fichero. Si son varios campos
los separamos con un espacio. Cada conjunto de datos que envi Arduino se guardaran como
una linea.
Mirar ejemplo 1
O en formado CSV
O como un fichero de texto con extensin .CSV que sigue determinada estructura para separar
los campos y que incluye una cabecera para despus poder usar esos datos mas fcilmente en
algn
otro
programa.
Si tenemos instalado Microsoft Excel puede que ese programa tenga asociada la extensin .csv
y pueda abrirlo, pero no es un fichero Excel, si no un fichero de texto plano.
Mirar ejemplo 2

Mediante una base de datos


Si vamos a guardar una cantidad grande de informacin y sobre todo vamos a quererla leer
desde el servidor, por ejemplo para mostrarla en una web, entonces la mejor forma de
almacenar esa informacin es haciendo uso de una base de datos. Podemos usar bien ficheros
de bases de datos o un servidor de bases de datos.
SQLite
Si preferimos la comodidad de poder respaldar los datos con tan solo copiar un fichero, o
nuestro servidor tienen limitacin de bases de datos. Podemos usar una base de datos de tipo

SQLite con la cual toda la informacin se guarda en un fichero binario, ese fichero contiene las
tablas que creemos, cada una de las cuales con las columnas y los valores que guardemos.
Mirar ejemplo 3
MySQL
Si por el contrario disponemos en el servidor del servicio/gestor de bases de datos
MySQL/MariaDB podemos usar este mtodo para almacenar la informacin.
Mirar ejemplo 4

Ejemplos servidor
Todos los ejemplos guardaran la fecha, sacada del propio servidor, y un nico nmero entero
enviado desde el Arduino, por ejemplo el tiempo que lleva encendida la placa.
Ejemplo 1
Empezamos por lo fcil, el ejemplo 1, en el que guardamos la informacin en un fichero de
texto sin formato ni estructura alguna.
Ejemplo 1
PHP

1 <?php
2
3

//Si la llamada incluye la variable "var" se guarda la informacion,

//si no se imprime todo por pantalla:

if( isset($_GET["var"]) )

$file = fopen( "./log.txt" , "a" );

8
9

date_default_timezone_set('Europe/Madrid');

1
0

$row = date('Y/m/d H:i:s', time()) . " -> " . $_GET["var"] . "\r\n";

1
1
1
2
1
3
1
4
fputs( $file , $row );

1
5
1
6
1
7

fclose( $file );
}
else
{
$file = fopen( "./log.txt" , "r" );

1
8
1
9

echo "<h1>Datos almacenados:</h1>";

2
0

while( !feof($file) )

2
1

echo fgets($file) . "<br/>";

2
2
2
3

fclose( $file );
}

2
4 ?>
2
5
2
6
2
7

Ejemplo 2
Realmente es lo mismo que el ejemplo 1 pero aadiendo una comprobacin para saber si se
ha de imprimir la cabecera, solo hay que hacerlo cuando se crea el fichero, y separando los
datos con el carcter ;

Ejemplo 2
PHP

1 <?php
2
3

$pathFile = "./log.csv";

4
5

if( isset($_GET["var"]) )

$exist = file_exists($pathFile);

8
9
1
0
1
1
1
2
1
3

$file = fopen( $pathFile , "a" );

if( !$exist )
fputs( $file , "Fecha;Hora;Valor" . "\r\n" );

date_default_timezone_set('Europe/Madrid');
$row = date('Y/m/d', time()) . ";" . date('H:i:s', time()) . ";" . $_GET["var"] . "\r\n";

1
4
1
5
1
6
1 ?>
7
1
8
1
9
2
0

fputs( $file , $row );


fclose( $file );
}

2
1

Despus con el fichero csv podemos importarlo desde Excel y generar grficas como estas:

Ejemplo 4
Al usar bases de datos el cdigo se complica bastante mas, por eso primero veremos el
ejemplo con MySQL ya que lo soporta de serie PHP. Para poder usar el cdigo PHP sera
necesario antes crear la base de datos, un usuario, una contrasea, darle permisos a ese
usuario sobre esa base de datos, y crear la tabla con las columnas necesarias.
Dependiendo del servidor, y de su panel de control en el caso de tenerlo, se har de una forma
u otra, as que paso directamente a adjuntar el script que crea la tabla con las columnas
necesarias, y el cdigo PHP que inserta los datos.
Tabla BD Ejemplo 4
MySQL

1 CREATE TABLE arduino

2(
3

id

INTEGER AUTO_INCREMENT PRIMARY KEY,

datetime

valor

DATETIME DEFAULT '0000/00/00 00:00:00' NOT NULL,


INTEGER NOT NULL

6 );

Ejemplo 4
PHP

1 <?php
2

define('MYSQL_HOST'

, 'localhost'

);

define('MYSQL_DBNAME' , 'base_de_datos' );

define('MYSQL_USUARIO' , 'usuario'

define('MYSQL_PASSWORD', 'contrasea'

);
);

6
7

if( isset($_GET["var"]) )

date_default_timezone_set('Europe/Madrid');

1
0

try

1
1

{
$conexion = new PDO("mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DBNAME,
MYSQL_USUARIO, MYSQL_PASSWORD);

1
2
1
3
1
4
1
5
1

$stmt = $conexion->prepare("INSERT INTO arduino(datetime, valor) VALUES (?,?);");


$stmt->bindParam(1, date('Y/m/d H:i:s', time()) );
$stmt->bindParam(2, $_GET["var"] );

echo $stmt->execute() ? $conexion->lastInsertId() : -1;

6
1
7
1
8
1
9
2
0
2
1

$conexion = null;
}
catch( Exception $e )
{

2
2

if( $conexion != null )

2
3

echo $e->getMessage();

2
4

}
2
?>
5
2
6
2
7
2
8

$conexion = null;

Ejemplo 3
Para guardar los datos en SQLite en mi caso uso el framework Medoo. Para ello lo
descargamos y lo copiamos en el mismo directorio que el siguiente cdigo:
Ejemplo 3
PHP

1 <?php
2

error_reporting(E_ALL ^ E_NOTICE);

require_once("medoo.min.php");

4
5

if( isset($_GET["var"]) )

date_default_timezone_set('Europe/Madrid');

try

1
0
1
1
1
2
1
3

$fileDB = "database.db";
$exist

= file_exists($fileDB);

$database = new Medoo($fileDB);

if( !$exist )
{
$database->query(

1
4

"CREATE TABLE IF NOT EXISTS arduino(

1
5

id

1
6

valor

datetime TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,

);"

1
7
1

INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,

);
}

INTEGER NOT NULL

8
1
9
2
0
2
1
2
2
2
3
2
4

$result = $database->insert("arduino", array(


"datetime" => date('Y-m-d H:i:s', time()),

2
5

"valor"

2
6

));
echo $result;

2
7

2
8

catch( Exception $e )
{

2
9
3
0

=> $_GET["var"]

echo $exc->getTraceAsString();
}
}

3
?>
1
3
2
3
3
3
4
3
5
3
6

Con ello conseguiremos que si no existe el fichero se cree la tabla en la base de datos, a
continuacin insertara la informacin que le hayamos enviado.
Para visualizar los datos podemos usar SQLite Expert:

Enviar emails desde Arduino


https://giltesa.com/2015/03/09/enviaremails-desde-arduino

9 Mar 2015 19 comentarios

Normalmente cuando queremos generar algn aviso con Arduino podemos emplear avisos
luminosos o sonoros mediante leds o buzzers, sin embargo si no estamos en la misma estancia
no nos enteraremos.
Para solventar este problema y con ayuda de un servidor web podemos hacer que Arduino
nos envi correos electrnicos para avisarnos de lo que queramos, estemos donde estemos!
Para ello es necesario un Arduino con conexin a internet, como con una shield ethernet,
WiFi o GSM, y tambin de un servidor web que permita la ejecucin de cdigo PHP y que
permita usar la funcin mail(), ademas claro de que cuente de servicio de correo para que
pueda enviar nuestros correos.

Cdigo servidor
El siguiente cdigo en PHP es un fichero que deberemos de subir a nuestro servidor, de pago o
gratuito, y hacer que sea accesible desde internet. Si podemos acceder a l desde nuestro
navegador entonces el Arduino tambin podr.
mail.php

1 <?php
2 /**
3 * URL:

http://giltesa.com/?p=16650

4 * License: (CC) BY-NC-SA


5 *
6 * Example URL:
7 * http://domain.com/mail.php?
key=s7x45IUFBrHHDTw&name=Arduino&from=arduino@domain.com&to=youremail@domain.com
8 &subject=Hello&message=This email was sent from Arduino!
9 *
1 * http://domain.com/mail.php
0
* ?key=s7x45IUFBrHHDTw
1
1 * &name=Arduino
1 *
2
*
1
3 *

&from=arduino@domain.com
&to=youremail@domain.com
&subject=Hello

1 * &message=This email was sent from Arduino!


4
*/
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2

// Authentication key, required to use this service:


define("KEY", "s7x45IUFBrHHDTw");

// Possible output responses:


define("OK",

"1");

define("ERROR_AUTENTICATION", "2");
define("ERROR_PARAMETERS",
define("ERROR_SEND_MAIL",

"3");
"4");

// Parameters sent from the Arduino:

$key

2
3

$name

2
4
2
5

$from
$to

= $_GET['key'];
= $_GET['name'];
= $_GET['from'];
= $_GET['to'];

$subject = $_GET['subject'];
$message = $_GET['message'];

2
6
2
7

if( !isset($key) || $key !== KEY )

2
8

2
9

3
0

echo ERROR_AUTENTICATION;

else if( !isset($name) || !isset($from) || !isset($to) || !isset($subject) || !isset($message) )


{

3
1
3
2
3
3

echo ERROR_PARAMETERS;
}
else
{

echo mail( $to, $subject, $message, "From: $name<$from>\r\nReturn-path: $from" ) ? OK :


3 ERROR_SEND_MAIL;
4
}
3
5 ?>
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4

3
4
4
4
5
4
6
4
7
4
8

El fichero nos har de WebService, y para funcionar necesita que le pasemos ciertos
parmetros, todos ellos obligatorios.
El primero de ellos y el ms importante es una contrasea sin la cual no podremos usar el
servicio, as solo quin conozca la clave podr enviar correos, nuestro Arduino!
El resto de parmetros son los relacionados con el envi del correo: Nombre del remitente,
correo del remitente, correo del destinatario, asunto, y el mensaje.
Tras la ejecucin del servicio recibiremos un nmero que nos indica el resultado de la
ejecucin:
1. Email enviado con xito.
2. Error de autenticacin.
3. Faltan parmetros.
4. Error al enviar el correo.

Cdigo cliente
Tambin necesitamos el cdigo para el Arduino. Dependiendo de la tarjeta que usemos para
conectarnos a internet el cdigo puede variar, tanto la forma en la que se enva la informacin
como la forma en la que se recibe, aunque la informacin en s debera de ser la misma. Por
ello el siguiente cdigo solo es orientativo y puede necesitar algunos ajustes para funcionar a la
perfeccin.
arduino_email_test.ino

1 /**
2 * URL:

http://giltesa.com/?p=16650

3 * License: (CC) BY-NC-SA


4 */
5
6 #include <SoftwareSerial.h>
7 SoftwareSerial wifi(2, 3); // RX | TX
8
9 #define KEY_EMAIL "s7x45IUFBrHHDTw"
1 #define NAME
0
#define FROM
1
1 #define TO

"Arduino"
"arduino@domain.com"
"youremail@domain.com"

1 #define SUBJECT "Hello"


2
#define MESSAGE "This email was sent from Arduino!"
1
3
1
4 void setup()
1 {
5
1
6

while(!Serial);

1
7

wifi.begin(9600);

1
8
1
9

Serial.begin(9600);

delay(5);
}

2
0
void loop()
2
1 {
2

// Send an email every 30 seconds:

if( millis()%30000 == 0 )

2
3

{
wifi.print("GET /mail.php");

2
4

wifi.print("?key=");

wifi.print(KEY_EMAIL);

wifi.print("&name=");

2
5

wifi.print(NAME);

wifi.print("&from=");

2
6

wifi.print("&to=");

wifi.print(FROM);
wifi.print(TO);

wifi.print("&subject="); wifi.print(SUBJECT);

2
7

wifi.print("&message="); wifi.print(MESSAGE);

2
8

wifi.print(" HTTP/1.1\r\n");

2
9

wifi.print("Connection: close\r\n");

wifi.print("Host: domain.com\r\n");

wifi.println();

3
0
3
1

delay(100);
if( wifi.available() > 0 )

3
2

3
3

switch( wifi.parseInt() )
{

3
4

case 1: Serial.println("The mail was sent successfully.");


case 2: Serial.println("Authentication failure");

3
5

case 4: Serial.println("The server could not send the email.");

3
8

while( wifi.available() > 0 && wifi.read() != -1 );


}

3
9

4
2
4

break;
break;

default: Serial.println("The server returned an unexpected response."); break;

3
7

4
1

break;

case 3: Serial.println("Parameters not found");

3
6

4
0

break;

3
4
4
4
5
4
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7
5
8
5
9

El cdigo de ejemplo se ejecuta cada 30 segundos en los cuales, en su primera parte se encarga
de enviar todos los parmetros necesarios al servidor, y despus en recoger la respuesta y en
mostrarla por el monitor Serial.

Con esos dos cdigos tan sencillos ya tendremos lo necesario para enviar correos desde el
Arduino!

https://geekytheory.com/internet-de-las-cosas-parte-2-subir-los-datos-a-una-basede-datos/

I N T E R N E T D E L A S C O S A S [ PAR T E 2 ]
S U B I R L O S D ATOS A U N A B A S E D E
D ATOS

Hola! Seguimos con la serie de tutoriales del Internet de las Cosas (Internet of Things). Como ya
coment en el tutorial anterior, en estos artculos aprenderemos a leer datos de Arduino y a
guardarlos en una base de datos para despus graficarlos.
Los tutoriales que forman parte de esta serie son:

1.
2.

3.

Leer datos de Arduino: leeremos la temperatura de un sensor LM35.


Mandar estas lecturas a una base de datos que se encuentre en un servidor. Utilizar
mi Raspberry Pi.
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 slo tengo un sensor de temperatura (LM35), as que ser ms sencillo que si
tenemos muchos.
El ecosistema de la aplicacin 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 queris darle un repaso, os aconsejo estos tutoriales de PHP.

Paso 1: crear la base de datos


Si no tenis instalado LAMP en vuestra Raspberry Pi, os recomiendo que os pasis por
este tutorial para instalar un servidor Web en Raspberry Pi. Una vez tengis eso hecho, podris
seguir con lo que viene ahora.
Abrimos phpMyAdmin para crear la base de datos. Yo la voy a llamar "sensores":

A continuacin, 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 podis 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 queris profundizar ms en el tema de creacin de bases de datos, os recomiendo que
leis este tutorial.

Paso 2: programacin del servidor


Una vez configurada la base de datos, procedemos a la programacin del servidor. Puede ser
una Raspberry Pi o incluso vuestro propio ordenador. Tambin 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 informacin para establecer una conexin 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 travs de GET.
<?php
// config.php
// Credenciales
$dbhost = "localhost";
$dbuser = "user";
$dbpass = "pass";
$dbname = "sensores";
// Conexin con la base de datos
$con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
?>
<?php
// iot.php
// Importamos la configuracin
require("config.php");
// Leemos los valores que nos llegan por GET
$valor = mysqli_real_escape_string($con, $_GET['valor']);
// Esta es la instruccin para insertar los valores
$query = "INSERT INTO valores(valor) VALUES('".$valor."')";
// Ejecutamos la instruccin
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 mtodos 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 leda por Arduino.

Paso 3: programacin 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 conexin.
Si recordis el primer tutorial, el cdigo era muy simple. nicamente leamos el valor del sensor
y lo mostrbamos con el monitor serial. No tenamos 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 tenis alguna duda, dejad un
comentario. Saludos!

También podría gustarte