https://giltesa.com/2015/05/14/guardar-en-un-servidor-web-informacion-enviadadesde-un-arduino
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
Servidor
Existen varias formas de guardar la informacion por lo que lo primero es decidir cmo
queremos guardar esos datos:
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
if( isset($_GET["var"]) )
8
9
date_default_timezone_set('Europe/Madrid');
1
0
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
2
0
while( !feof($file) )
2
1
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
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
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
2(
3
id
datetime
valor
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
6
1
7
1
8
1
9
2
0
2
1
$conexion = null;
}
catch( Exception $e )
{
2
2
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);
if( !$exist )
{
$database->query(
1
4
1
5
id
1
6
valor
);"
1
7
1
);
}
8
1
9
2
0
2
1
2
2
2
3
2
4
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:
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
&from=arduino@domain.com
&to=youremail@domain.com
&subject=Hello
"1");
define("ERROR_AUTENTICATION", "2");
define("ERROR_PARAMETERS",
define("ERROR_SEND_MAIL",
"3");
"4");
$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
2
8
2
9
3
0
echo ERROR_AUTENTICATION;
3
1
3
2
3
3
echo ERROR_PARAMETERS;
}
else
{
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
"Arduino"
"arduino@domain.com"
"youremail@domain.com"
while(!Serial);
1
7
wifi.begin(9600);
1
8
1
9
Serial.begin(9600);
delay(5);
}
2
0
void loop()
2
1 {
2
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
3
5
3
8
3
9
4
2
4
break;
break;
3
7
4
1
break;
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.
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.
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
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;
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!