Guardar en un servidor web información enviada desde un Arduino

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.

Mirar ejemplo 1

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.

Mirar ejemplo 2

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.

Mirar ejemplo 3

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.

Mirar ejemplo 4

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.

 

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 ;

Después con el fichero csv podemos importarlo desde Excel y generar gráficas como estas:

grafica-excel

 

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.

 

rows_mysql

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:

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:

sqlite_expert

19 comentarios en “Guardar en un servidor web información enviada desde un Arduino

  1. 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

    1. 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.

    1. 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

  2. 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! 🙂

    1. 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.

  3. 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?

    1. 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.

  4. 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 !

    1. 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.

  5. 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 😀

    1. 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.

  6. 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.

    1. 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.

  7. 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

  8. 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

Escriba aquí su comentario