Como vimos en la anterior entrada enviar correos electrónicos 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 también sencillo.
Arduino
La parte de código de Arduino no cambia respecto al ejemplo de enviar emails. La información se manda de la misma forma y se recoge igual por lo que esa parte de código me la salto en esta entrada y solo se verán las formas de guardar la información.
Servidor
Existen varias formas de guardar la informacion por lo que lo primero es decidir cómo 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 información de los caracteres que contiene. Esa información 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.
O en formado CSV
O como un fichero de texto con extensión .CSV que sigue determinada estructura para separar los campos y que incluye una cabecera para después poder usar esos datos mas fácilmente en algún otro programa.
Si tenemos instalado Microsoft Excel puede que ese programa tenga asociada la extensión .csv y pueda abrirlo, pero no es un fichero Excel, si no un fichero de texto plano.
Mediante una base de datos
Si vamos a guardar una cantidad grande de información y sobre todo vamos a quererla leer desde el servidor, por ejemplo para mostrarla en una web, entonces la mejor forma de almacenar esa información 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 limitación de bases de datos. Podemos usar una base de datos de tipo SQLite con la cual toda la información 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.
MySQL
Si por el contrario disponemos en el servidor del servicio/gestor de bases de datos MySQL/MariaDB podemos usar este método para almacenar la información.
Ejemplos servidor
Todos los ejemplos guardaran la fecha, sacada del propio servidor, y un único número entero enviado desde el Arduino, por ejemplo el tiempo que lleva encendida la placa.
Ejemplo 1
Empezamos por lo fácil, el ejemplo 1, en el que guardamos la información en un fichero de texto sin formato ni estructura alguna.
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 |
<?php //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" ); date_default_timezone_set('Europe/Madrid'); $row = date('Y/m/d H:i:s', time()) . " -> " . $_GET["var"] . "\r\n"; fputs( $file , $row ); fclose( $file ); } else { $file = fopen( "./log.txt" , "r" ); echo "<h1>Datos almacenados:</h1>"; while( !feof($file) ) echo fgets($file) . "<br/>"; fclose( $file ); } ?> |
Ejemplo 2
Realmente es lo mismo que el ejemplo 1 pero añadiendo una comprobación para saber si se ha de imprimir la cabecera, solo hay que hacerlo cuando se crea el fichero, y separando los datos con el carácter ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $pathFile = "./log.csv"; if( isset($_GET["var"]) ) { $exist = file_exists($pathFile); $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"; fputs( $file , $row ); fclose( $file ); } ?> |
Ejemplo 4
Al usar bases de datos el código se complica bastante mas, por eso primero veremos el ejemplo con MySQL ya que lo soporta de serie PHP. Para poder usar el código PHP sera necesario antes crear la base de datos, un usuario, una contraseña, 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 código PHP que inserta los datos.
1 2 3 4 5 6 |
CREATE TABLE arduino ( id INTEGER AUTO_INCREMENT PRIMARY KEY, datetime DATETIME DEFAULT '0000/00/00 00:00:00' NOT NULL, valor INTEGER NOT NULL ); |
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 |
<?php define('MYSQL_HOST' , 'localhost' ); define('MYSQL_DBNAME' , 'base_de_datos' ); define('MYSQL_USUARIO' , 'usuario' ); define('MYSQL_PASSWORD', 'contraseña' ); if( isset($_GET["var"]) ) { date_default_timezone_set('Europe/Madrid'); try { $conexion = new PDO("mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DBNAME, MYSQL_USUARIO, MYSQL_PASSWORD); $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; $conexion = null; } catch( Exception $e ) { if( $conexion != null ) $conexion = null; echo $e->getMessage(); } } ?> |
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 código:
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 |
<?php error_reporting(E_ALL ^ E_NOTICE); require_once("medoo.min.php"); if( isset($_GET["var"]) ) { date_default_timezone_set('Europe/Madrid'); try { $fileDB = "database.db"; $exist = file_exists($fileDB); $database = new Medoo($fileDB); if( !$exist ) { $database->query( "CREATE TABLE IF NOT EXISTS arduino( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, datetime TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL, valor INTEGER NOT NULL );" ); } $result = $database->insert("arduino", array( "datetime" => date('Y-m-d H:i:s', time()), "valor" => $_GET["var"] )); echo $result; } catch( Exception $e ) { echo $exc->getTraceAsString(); } } ?> |
Con ello conseguiremos que si no existe el fichero se cree la tabla en la base de datos, a continuación insertara la información que le hayamos enviado.
Para visualizar los datos podemos usar SQLite Expert:
Enhorabuena por este semejante artículo.
Saludos desde Panamá.
que tan fiable o eficaz puede ser la conexion arduino-ethernet.. lo digo en el ejemplo de que pueda fallar; ya que si envio 100 solicitudes puede que solo un 95 llegue y 5 no lleguen, me explico? en la experiencia que tienen ustedes, que tan fiable puede ser el envio de datos a la bd a travez de ethernet? saludos
Cómo de fiable es tu conexión de internet y la estabilidad de tu router?
Puede fallar el envío tanto por culpa del arduino que se cuelgue, como por el módulo ethernet/wifi/gprs, por culpa del router o de la conexión a internet.
Si los datos son importantes comprueba que el servidor de el OK confirmando que los datos se han guardado. Si no lo consigues lo intentas de nuevo o los guardas en una SD para intentarlo más tarde o para recuperarlos a mano.
Saludos.
Que tal Saludos
En el caso del ejemplo dos ese archivo donde lo podria ver? o a donde lo mandaria?
Hola,
Los ficheros se guardan en el mismo directorio que el fichero PHP, aunque puedes cambiarlo si editas los ejemplos.
Si te refieres a cómo visualizarlo en el ordenador, puedes abrirlo con el editor de texto, también puedes importarlo desde Excel como datos externos en csv
Saludos
Hola.
Muy interesante el Blogg, me gustaría saber si se puede aplicar para crear una base de datos, para tener un control sobre las personas que visitan X pagina? estoy incursionando en este tipo de productos.
Saludos! 🙂
Hola,
En esta entrada/articulo solo se explica cómo guardar datos generados por Arduino en una base de datos de un servidor web, no tienen nada que ver con registrar visitas de una página.
Si que podrías repartir una key única por cada usuario-arduino que accede al servicio y llevar un control de cuántas veces accede a la base de datos… pero por lo que indicas no es lo que buscas…
Saludos.
Yo lo que estoy buscando es que guarde la información en una base de datos, hasta ahi ok el tema es que si en la base se de una condición le envíe una orden a arduino. sin tener que hacer una web en el arduino que este actúe como cliente cuando se de determinada condición que le envia un php remoto. Es posible?
Hola Nahuel,
Lo mas sencillo es que en el momento de la inserción compruebes lo que tengas que comprobar y le respondas al Arduino ya sea con un OK por la inserción o con la respuesta de esa condición.
También podrías hacer que el Arduino aun sin tener que insertar datos se comunicara con el servidor cada X tiempo, así que servidor podría devolverle la respuesta a esa condición que se ha dado.
En ambos casos la comunicación la inicia el Arduino conectándose a un servidor el cual es accesible desde internet y localizable con una dirección fija, por eso es sencillo conectarse desde el Arduino al servidor, si quisieras realizar la conexión inversa, del servidor al Arduino, entonces necesitarías configurar el router de casa abriendo el puerto web hacia el Arduino, necesitarías una IP fija o bien configurar un cliente DDNS junto a un servidor DDNS en internet y necesitarías que el Arduino tuviera una web o web service cargado para capturar la conexión del servidor que en ese momento actúa como cliente.
Si el envió de datos hacia el servidor es constante entonces tu mismo podrías facilitarle la IP al servidor para que supiera dónde conectarse en caso de tener que mandarle una respuesta al Arduino cuando esa condición se diera.
Saludos.
Excelente información !!! pero aquí vengo a molestar con un par de preguntitas.
Antes que todo haré una pequeña introducción. He realizado un proyecto de sensado de temperatura con arduino. El proyecto ya está corriendo y funcionando en perfectas condiciones. Toda la información que me entregan los sensores la he rescatado a través del puerto serial (COM) y almacenado en la pc local.
Por otro lado, me he aventurado con shield ethernet hace muy poco, sé que hay harta información pero esta vez recurro a los mejores. Ya he logrado montar «un tipo de servidor web quizás?» en arduino. Con ello y la ayuda de un router puedo monitorear las variables desde cualquier pc, smartphone o similar que estén asociados a la misma red del router.
Hasta ahí todo OKAY !…
La pregunta en concreto es: cual es la manera mas eficiente de poder rescatar, almacenar, guardar o respaldar , los datos que visualizo en el servidor web montado en arduino ?
Se relaciona con algún ejemplo mencionado en este artículo ?
Favor orientarme un poquito.
De antemano agradezco sus positivas respuestas. Saludos !
Hola Francuqo,
No tiene relación con este articulo ya que por lo que entiendo quieres hacerlo todo con el Arduino, y en esta entrada se explica cómo recibir los datos de un Arduino y guardarlos en un servidor web en internet.
Para tu caso lo mejor seria que cuando accedas al servidor montado en el Arduino enviándole una fecha como parámetro en la URL, el Arduino te responda con todos los datos registrados ese día, así podrás copiarlos y guardarlos.
Eso mismo hago yo con mi estación meteorológica con bluetooth: https://youtu.be/XNbPumKQSX8?t=5m
Aunque lo mejor seria que el Arduino no tuviera ninguna web para que se limitara a enviar los datos, a un servidor en internet o a una raspberry pi, y se guardaran en una base de datos y se pintaran con una web con html, css y js.
Saludos.
Gracias GILTESA, en realidad no me estoy limitando a realizar todo con arduino, básicamente lo que busco es poder guardar los datos que estoy recibiendo de mis sensores en un computador (o servidor) remoto; me explico. Tengo arduino Mega montado en terreno, y sobre él una shield ethernet que la utilizo para poder monitorear los mismos sensores. Pero no sólo quiero monitorearlos, busco poder almacenar esos datos en alguna parte. Objetivamente me gustaria poder almacenarlo en un servidor físico que ya existe. Me imagino que claramente no es algo que no se pueda realizar, es por ello que me dirijo a ustedes para poder nutrirme de sus conocimientos.
Ruego disculpen mi insistencia. Gracias 😀
Hola,
Si cuentas con un servidor físico y tiene instalado php (o jsp, asp) puedes montar una web como la del ejemplo de recibir correos, que reciba los datos enviados por el Arduino Mega y los guarde en un fichero, o en una base de datos SQLite o MySQL como se explica en esta entrada.
Saludos.
Hola, estamos haciendo un globo meteorológico y teníamos ciertas dudas en cuanto a obtener datos del puerto serial y subirlos a un servidor.
Hice que un arduino mande valores de sensores cada 3 segundos en CSV (temperatura,presion,giroscopiox,etc.) Son aproximadamente 70 caracteres. Quiero hacer que esos valores estén en tiempo real en la pagina, cada dato separado.
Estoy viendo si lo hago directamente con PHP y de allí descargo cada valor a una base de datos (de preferencia). O de arduino a una base de datos y con ajax.
Cómo podemos sacar las cadenas del puerto serial, separarlas y subirlas en tiempo real a la página?
Disculpe la ignorancia, gracias.
Hola Jonathan,
Si te refieres a qué hardware necesitas para poder enviar los datos en tiempo real solo puedes usar un modulo GSM/GPRS para Arduino, aunque no tengo muy claro si a esas alturas habrá cobertura ya que la señal es mediante antenas en tierra.
Quizás otra forma seria que el globo enviara los datos a tierra por RF donde tengáis montada una base que recoja esos datos y después los envié por GSM/GPRS.
Para hacer el enlace por RF no sé si valdrá con los módulos que se suelen usar con Arduino o quizás haga falta usar una emisora de radio a la que se le pueda conectar el Arduino, con puerto de conexión o modificando el circuito.
Saludos.
Hola, muy buena info.!
Estoy en un proyecto con arduino el cual tiene conectado un modulo wifi 8266, estoy intentando probar mandando una cadena de caracteres a la base de datos del servidor local que tengo en mi maquina (usando xamp).
te queria hacer algunas consultas:
1) ¿Sabes como establecer conexion entre el arduino y la base de datos local mediante comandos AT ?(son los comandos que admite el modulo wifi)
2)¿Como se vincula arduino con el codigo php?¿Mediante una peticion GET?
3)¿Los archivos PHP donde se deben guardar para que arduino los use?
Gracias
Hola Gabriel,
El Arduino no tiene bases de datos local ni puede ejecutar archivos PHP.
Te recomiendo que te leas todas estas entradas y luego vuelvas a leer esta.
https://giltesa.com/2016/03/22/1-curso-iot-con-arduino-y-esp8266-wifi-internet-de-las-cosas
Saludos.
buenas tardes no se si llego tarde a este post y ocupo alluda
estoy creando una pagina web a la que quisiera le llegara a informacion desde un arduino conectado en medio de una parcela y se almacene y muestre los datos en la pagina en cualquier lugar del mundo
el arduino que ete montado en la parcela estara funcionando como
estacion meteorologica
mi correo es riomgama493@hotmail.com
cualquier ayuda o comentario se los aradeceria mucho
Hola,
La información que estas pidiendo es la que tienes escrita y documentada a modo de manual en este artículo.
Saludos.
Hola! Muy buenos tus post! Te quisiera hacer un par de consultas y te agradecería enormemente recibir tus opiniones y nutrirme de tu experiencia. Te comento por arriba lo que quiero hacer. Tengo una varas Placas similares a arduino (STM32F4 Discovery) que almacenan datos de sensores. La idea es que esas placas (muchos clientes identificados) envien datos por red 2G a un servidor, y una pagina web acceda a estos datos para mostrarlos en graficos en tiempo real. Por ejemplo, uno eligiria desde la pagina web el cliente del cual mostrar los datos y una vez seleccionado, empezaria a mostrarlos en tiempo real. No tengo ninguna experiencia previa con paginas web ni con bases de datos, por lo que cualquier informacion que me puedas brindar me seria de mucha utilidad. Mas que nada a donde apuntar o que temas leer/ investigar, que lenguaje por ejemplo php y tipo de base de datos. Vos como lo harias? Basicamente son muchos clientes que necesito que guarden datos en un servidor , y mostrarlos en una web en tiempo real con la posibilidad de seleccionar el cliente.
Disculpa por las molestias!
Saludos!!
Hola Agustin,
La forma sencilla seria que la página tuviera un desplegable donde seleccionaras el nodo del cual sacar los datos y después se pintaran los datos con tablas, gráficas o como lo quisieses. Luego si quieres actualizar la información pones un botón que actualice la página y así volverá a generar el contenido con los nuevos datos de la base de datos. (HTML5, PHP, JS, jQuery, MySQL/SQLite)
Si quieres que los datos que estas viendo en la web sean en tiempo real entonces tienes que usar JavaScript y llamadas Ajax para conectarte al servidor y recuperar los datos sin necesidad de recargar la página. (HTML5, PHP, JS, jQuery, Ajax, MySQL/SQLite)
Otra forma mucho mas sencilla seria que usaras una plataforma de almacenamiento de datos de sensores como Thingspeak. (
HTML5, PHP, JS, jQuery, Ajax, MySQL/SQLite)Saludos.
Muchisimas gracias por tu pronta respuesta! Creo que voy a tener que volcarme por la segunda solución que planteas. Si o si necesito ver en tiempo real los datos que mandan los «clientes», para mostrar alarmas en pantalla o realizar alguna acción. Por ejemplo, en la pagina web, seleccionarìa algún umbral de temperatura, y cuando este umbral es superado por el cliente seleccionado que me dispare alguna alerta.
Muchas gracias por tu buena predisposición.
Saludos!
Buenas quisiera saber si tiene el código de Arduino para poder realizar el almacenamiento de datos con el formato csv, gracias.
Hola José,
El código para CSV lo tienes mas arriba, es el ejemplo 2.
Si lo que querías era no usar ningún servidor ni WiFi si no almacenarlo directamente en una SD con el Arduino, entonces tu duda no va en esta entrada… aunque te facilito el código que debería de hacer lo que quieres:
Saludos.
Hola! Muchas gracias por responder tan rápido, pero mi pregunta es como relaciono el programa CSV de php, con el arduino, como en el caso del ejemplo pasado del enviar un correo, vos colocas la progra en php y en codigo arduino, quisiera saber como hago para relacionar la progra de arduino con la de php.
Espero que me explique mejor. Muchas gracias. y Saludos.
Hola José,
Se relacionan de la misma forma que tu navegador de internet cuando escribes una URL en la barra de direcciones y carga la página web.
En este caso es el Arduino quien prepara los datos a enviar junto a la URL y que envía a través de la conexión a internet (que le proporciona un modulo WiFi o GSM), una vez conectado al servidor PHP recoge los datos y los guarda o envía el correo.
Es lo mismo que mi servicio de NTP: https://giltesa.com/ard/ntp.php que proporciona la hora al Arduino al conectarse.
Te recomiendo que montes el servidor PHP y hagas pruebas con el navegador hasta que lo consigas hacer funcionar, después ya te encargas de que el Arduino sepa conectarse y enviar los datos a ese servidor.
Saludos.
Buenas te felicito y agradezco por tu aporte , abuso un poco mas y te consulto y para recibir datos bluetooth en un PHP ,la idea es después montar un HTML y mostrarlo en una web los datos recibidos desde ya gracias
Hola Adrian,
No puedes enviar datos a PHP por conexión bluetooth, tendrás que usar WiFi, Ethernet, telefonía móvil, etc.
Saludos.
Excelente articulo y ejemplo me gusto mucho! Una pregunta y espero no molestarte, tengo un proyecto por el cual quiero guardar datos en un php por medio de un lector de tarjetas, y que este guarde las horas por el que paso la tarjeta por el lector, esto se podria? O puedo encontrar una forma mas sencilla de guardarlos en una base de datos? Saludos!
Hola Tomas,
Puedes hacerlo de dos formas, o bien al Arduino le añades un reloj para de ese modo recuperar la fecha y hora y enviarla al servidor cada vez que les una tarjeta, o puedes enviar simplemente los datos de la tarjeta y usar la fecha y hora del servidor.
Saludos.
hola buenos días tengo un proyecto donde envió un dato a mysql y funciona bien solo me hace falta leer el dato que ,me retorna el servidor como lo puedo hacer con el at+httpread?
Hola neopunko,
Así hacia yo para devolver datos desde el servidor, simplemente con un echo:
https://giltesa.com/2016/04/14/8-curso-iot-con-arduino-y-esp8266-wifi-ejemplo-cliente-recepcion-datos
Saludos.
Hola soy de nuevo Neo punko lo que sucede es que estoy utilizando el modulo sim800l con arduino del cual envio el dato quiero tener la recepcion de lo que me responde el servidor con el at+httpread por favor urgente gracias
Hola, como se configura el php.ini para establecer el tiempo entre registro y registro; a mi me funciona cada 5 segundos, pero necesito que sea mas rapido. Gracias.
Hola Cristhian,
No entiendo. Si ejecutas el fichero PHP en un intervalo de tiempo mas rápido debe ejecutarse, procesar los datos y guardarlos. Si tarda mas de 5 segundos es porque estas haciendo algo en el código que ralentiza la ejecución.
Prueba a ejecutarlo desde el ordenador y refresca la página rápidamente, debería de ejecutarse rápido y guardar los datos en cada ejecución.
Saludos.
¿Hay alguna manera de hacerlo sin el shield de ethernet?
que la comunicación sea por media del puerto serial usb
Gracias por la info.
Hola Emanuel, si no dispones de comunicación a Internet en el Arduino (ethernet, wifi, GSM, satélite) puedes mandar los datos por USB al ordenador y programar una aplicación (en Java, .net, Python, etc.) que lea la información y la mandé al servidor usando la conexión a Internet del ordenador.
Pero necesitas ese software intermedio, un USB no es una conexión a Internet, es una conexión Serial.
Saludos!