Conectar Arduino a base de datos Mysql.

En esta Publicación  les mostrare como conectar nuestro Arduino a una base de datos Mysql de manera directa sin necesidad de utilizar PHP u otros métodos conocidos. para ello utilizaremos el MySQL Conector /Arduino

MySQL Conector/Arduino nos permite conectar nuestros proyectos y almacenar datos directamente a un servidor MySQL. con ello podemos almacenar data de sensores que a diario utilizamos en nuestros Proyectos como los de Temperatura, Humedad, Proximidad, Voltajes, Luces de tipo digital y análogos. todo esto sin utilizar un equipo intermedio o servicio web como PHP  u otros métodos web conocidos. con el acceso directo a un servidor de MySQL podemos almacenar y adquirir datos de nuestros proyectos, desde las Tablas en el servidor. manteniendo la conexión del arduino a la base de datos embedida en nuestro arduino.

El Conector fue desarrollado por:  Dr. Charles Bell, Senior Software Developer, MySQL Utilities Team Lead.

su licencia es tipo: The library is open source, licensed as GPLv2, and owned by Oracle Corporation. Thus, any modifications to the library that you intend to share must meet the GPLv2 license. Open Source (Copyright (c) 2012, 2015 Oracle and/or its affiliates. All rights

Que necesitamos.

1- servidor Msql instalado (windows/Linux/Mac)

2-MySQL Conector/Arduino

3-Arduino Uno/ Mega

 

Primer Paso Instalación de MySQL .

iniciamos con la instalación de MySQ. en este Paso me enfocare en la instalación dentro de sistema operativo Linux, enfocado en distribución derivada de debían , Raspbian, Ubuntu. basándome en Software/Hardware open sourse. luego explicare como instalar en Windows.

Instalación de servidor LAMP (Linux, Apache, MySQL, PHP)Ingresamos en la consola de comando de Linux. recordar que al utilizar el comando sudo nos pedirá la contraseña de root para ejecutar con privilegios de administrador.

  • Actualizamos los repositorios Sudo apt-get update.
  • Actualizamos los paquetes Sudo apt-get upgrade.
  • Ahora instalamos Apache sudo apt-get install apache..
  • instalamos MySQL sudo apt-get install mysql-server-php5 mysql durante la instalación se te solicitara una contraseña para el usuario "root" de MySQL. este usuario contiene los privilegios de administración de nuestro servidor MySQL, no confundir con el usuario “root” de Linux. ojo apuntar esta contraseña y continuar con la instalación.
  • Luego creamos la base de datos Propia de MySQL para su estructura de directorio sudo mysql_install_db.
  • instalamos PHP sudo apt-get install libapache2-mod-php5 php5 php5-mcrypt
  • después de instalar todo realizamos una prueba creamos el siguiente archivo llamado info.phpsudo nano /var/www/info.php  se abrirá el editor de texto "nano" todo sale en blanco ahora escribimos lo siguiente
     <? Php
    phpinfo ();
    ?>

    cerramos con la tecla "ctrl + x" aceptamos con "Y " damos enter.
  • visitamos esta pagina desde nuestro navegador"http://dirección_IP_del_servidor/info.php"
  • debe salir un mensaje como el de la imagen. (IMG)info.php_
  • Ahora instalamos el administrador de base datos phpMyAdmin que nos permite tener un entrono visual para el manejo de nuestra base de datos sudo apt-get install phpmyadmin apache2-utils nos preguntara que servidor web estamos utilizando elegimos Apache2,  le damos Yes cuando nos consulte si queremos configurar la base de datos por"phpmyadmin dbconfig-common", ingresamos la contraseña que establecimos para el usuario"root" en la instalación de MySQL.
  • agregamos phpmyadmin a  la configuración de apache "sudo nano /etc/apache2/apache2.conf".
  •  agregamos phpmyadmin al archivo de configuracion apache2.conf  "Include /etc/phpmyadmin/apache.conf".
  • reiniciamos el servidor apache "sudo service apache2 restart".
  • accedemos al la consola de phpmyadmin "http://dirección_IP_del_servidor/phpmyadmin".
  • utilizamos el nombre de usuario y la contraseña de"root".

Para instalar en Windows solo debemos descargar WAMP y seguir los pasos.

segundo paso.

Descargamos el conector de MySQL y su manual en PDF (ingles) desde este enlace DESCARGA.

continuamos con la instalación del conector copiando los archivos descargados dentro de la carpeta "/Arduino/Libraries/"

 

Configuración del servidor de MySQL para la conexión con el arduino 

se debe preparar el servidor de MySQL, de modo que nuestro arduino pueda conectarse a el. comenzamos configurando el usuario de modo que el mismo pueda acceder a la base datos de diferentes modos, local , remoto.

Nota: es importante verificar que nuestro usuario tenga tanto acceso remoto como acceso via ethernet por medio de la direccion ip de nuestro servidor de MySQL, de no poder establecer conexión con la base de datos sera imposible que nuestro arduino establezca conexión con la base de datos.

iniciamos con la creacion del usuario.

ingresamos a la consola de phpmyadmin desde nuestro explorador  de manera local.

utilizamos el usuario “root” y la “contraseña de root que asignamos en la instalacion”.

"http://localhost/phpmyadmin/index.php"

phpmyadminlogin

debemos de crear un usuario para conectar el Arduino no se recomienda el uso del usuario root.

para facilitar la creacion de usuarios y ahorrarnos la creacion de los mismo por medio de codigo como lo explica el documento lo explicare utilizando la interfase web de phpmyadmin

 

 

Ingresamos en la opción Users.
add user generalsi bien al inicio podemos notar que el usuario root esta creado repetidas veces. les explico la razon.

podemos ver que en la columna Host de usuarios el usuario root mantiene lo siguiente, al conectarse a la base de datos se establece conexion utilizando el nombre de usuario y la direccion desde donde el usuario se esta conectando por ejemplo si utilizamos root para conectarnos a la base de datos desde la consola de SQL Plus estaremos iniciando secion de la siguiente forma root@localhost , si lo utilizamos de manera remota seria root@ip_del_equipo_ remoto. por eso el usuario root tiene difrentes host.

% = cualquier direccion ip puede establecer conexion a la base de datos con el usuario root

127.0.0.1 = este es el ip interno o local host

localhost = conexion desde el servidor.

192.168.1.105 = ip del arduino con el cual se conectara a la base de datos.

ahora debemos crear un 3 usuarios iguales con los mismo privilegios le damos click a Add usser.

add user

 

el usuario debe tener las siguientes opciones

add user 2

los 3 usuarios con la misma contraseña

1- con opción any host

2- con opción local

3-con opción Use text field e ingresamos el ip de nuestro arduino.

Atencion que esta parte es importante y me dio problemas con el servidor LAMP con el servidor WAMP me funciono sin complicaciones.

debemos provar poder conectarnos a la base de datos desde el usuario creado para nuestro arduino.

la prueba la podemos realizar desde otro computador o desde el nuestro de la siguente manera.

abrimos terminal y escribimos  mysql -u nombre_Usuario -h ip_de_la_tarjeta_de_ red_Servidor -p

nos solicitara el password

SQL tets

Si todo va bien ingresa a la consola de SQL plus.

sqlplus

para salir de la consola SQL plus escribimos \q y salimos.

lo importante es poder ingresar por medio del IP de nuestra tarjeta de red ya sea la ethernet o la inalambrica si no podemos acceder  desde el ip, verificamos el acceso por localhost ,

podemos verificar el ip de nuestro pc escribiendo en consola ifconfig. nos muestra las interfaces y sus configuraciones ip ip ifconfig

ahora explico el tipico problema que es que nuestro servidor MySQL esta configurado para aceptar conexiones locales, debemos de modificar el archivo de configuracion

observa la imagen donde trato de ingresar por medio del ip del servidor y me debuelve un error , luego acceso al archivo de configuracion realizo los cambios y listo conecta.

 

errores

si observamos como se resolvió el problema de conexión

después del ultimo intento que devuelve el error 2003 (111).

vemos que estoy en consola dentro del directorio mi directorio”javi@javi-Inspiron-1420:~$ cd ..
con “cd .. ” salí del directorio donde me encontraba y quede en el directorio home, al volver a repetir el comando salí del directorio home y regrese a la raiz principal .

luego con “cd etc/mysql/” ingreso dentro del archivo mysql donde esta el archivo de configuración que debemos editar “sudo nano my.cnf”

mycnf

en bind-address ingresamos el ip de nuestra interfase de red ya sea la física o la inalambrica.

luego detenemos el servidor MySQL "sudo service mysql stop"

lo iniciamos con"sudo service mysql start".

o bien solo lo reiniciamos "sudo service mysql restart" (por experiencia es mejor detener e iniciar).

ahora nos conectamos con el ip de la interfase.

 

Configuracion del Sketch

      • Ahora le cargamos el sketch con la configuracion inicial, la cual sera solamente la conexion del arduno con la base de datos.

/* Primer Sketch, realizamos prueba de conxion entre arduno y la DB*/
#include "SPI.h"
#include "Ethernet.h"
#include "sha1.h"
#include "mysql.h"
/* Configuración Tcp/Ip del ethernet chield */
byte mac_addr[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x69, 0xAC };
byte ip_addr[] = { 192, 168, 1, 127 };
byte dns_addr[] = { 192, 168, 1, 1 };
byte gateway_addr[] = { 192, 168, 1, 1 };
byte netmask[] = { 255, 255, 255, 0 };
IPAddress server_addr(192, 168, 1, 50);/* configuración de MySQL Conector/arduino */Connector my_conn; // referencia de conexion del Conector/arduino
/* Usuario y contraseña para conectar a la DB */
char user[] = "root";
char password[] = "******";// remplazar con la contraseña utilizada en la instalación
void setup() {
Ethernet.begin(mac_addr, ip_addr, dns_addr, gateway_addr, netmask);
Serial.begin(115200);
delay(1000);
Serial.println("Connecting...");
if (my_conn.mysql_connect(server_addr, 3306, user, password)){
delay(1000);
Serial.println("Success!");
my_conn.cmd_query("SELECT * FROM chart.Log LIMIT 8");
Serial.println("Connected");
}
else
Serial.println(“Connection failed.”);
}void loop() {
}

Conectar el arduino a la red y realizar la prueba de conexión. 

al conectar el arduino al puerto usb y tratar de programar o acceder a la consola serial nos debuelve un error de acceso al puerto el cual se corrige cambiando los atributos de acceso al puerto desde la consola de comando dimitamos "sudo chmod 777 /dev/ttyACM0"..

ide error

serial atributos

arduino conect

debe de salir el mensaje de conexión todo esta OK.

cabe mencionar que existen limitantes por lo que se recomienda leer el manual adjunto al Conector MySQL/Arduino. de tener algun problema o duda estamos para apallarles.

saludos

Ver Segunda parte Visualizar Datos almacenados por arduino en Mysql desde interfase web

Javier A. Brathwaite V.

Published by javierbrath

Técnico en ingeniería Electrónica y Telecomunicaciones. Proyectos realizados en mi tiempo libre. Me gusta todo lo relacionado con Tecnología, aplicando Comunicación, automatización y control, bajo diversas plataformas. Mis Proyectos están realizados con open hardware, aplicados a mi Hogar, los comparto en Idioma "Español" con Ustedes.

18 thoughts on “Conectar Arduino a base de datos Mysql.

    1. ok segun entiendo quieres conectar tu arduino y acceder a un registro en una DB.
      mi consulta es la siguiente.

      las bases de datos trabajan registrando datos en una tabla y luego por consulta de datos se pueden optener los datos de ellas.

      si la tabla cuenta con 10 registros quieres poder acceder a los 10 registros o realizar una busqueda especifica?

      1. Tengo la misma duda, como se haría para obtener el valor de un registro específico??

        Digamos por ejemplo, columna=temperatura registro=1

        Saludos

      2. lo puedes obtener desde la web e incluso traficarlos con google chard. ya lo he echo tengo pendiente documentarlo solo debes de conectarte a la base de datos crear un JSon y pasar la data en el orden a desplegar en la gráfica.

  1. Una pregunta, para la conexion de arduino con la base de datos en mysql, el arduino lo tienes conectado por Ethernet o WiFi o por el serial USB.

  2. yo quiero saber como envio mas de 1 dato al server mysql, ya que envio cada uno por aparte y solo me registra en el servidor el primer dato:

    anexo el codigo del skeetch donde envio los datos al servidor, gracias por la ayuda:

    client.print( “my server sql”);
    Serial.print(“Temperatura Actual: “);
    Serial.println(celsius);
    Serial.print(” \t”); //tab
    client.print(celsius);
    client.print(” \t”); //tab
    Serial.println(Humedad);
    Serial.print(” \t”); //tab
    client.print(Humedad);
    client.print(” \t”); //tab
    Serial.println(Ambiente);
    client.print(Ambiente);
    client.print(“&dn=”);
    client.print(dn);
    client.println( ” HTTP/1.1″);
    client.print( “Host: ” );
    client.println(server);
    client.println( “Connection: close” );
    client.println();
    client.println();
    client.stop();

    1. en el servidor ya debes de haber creado la base de datos con la cantidad de colunmas necesarias para los datos.
      de tener conexion exitosa con la base de datos solo debes de crear un void mysqldata te dejo un ejemplo de como se almacenan diferentes valores en la tabla pudes reemplazar los valores por variables pero la misma debe de corresponder con el tipo de dato que se acepta tu tabla.
      por ejemplo si es texto chart, varchart, si es numerico ,

      void mysqldata()
      {
      // uncomment to use the given functions
      // tmp = temperature();
      // ht = humidity();
      // smk = smoke();
      // ns = noise();
      // lt = light();
      // ac = ACData();

      if (sqlconnect==true)
      {
      delay(150);
      //”INSERT INTO dcmsData (Humidity,Light,Noise,Smoke,Temperature,AC,DayTime) values(‘100′,’200′,’300′,’400′,’500′,’600’,NOW()) “;
      sprintf(sqlbuf, “INSERT INTO dcmsData (Humidity,Light,Noise,Smoke,Temperature,AC,DayTime) values (‘%f’,’%d’,’%d’,’%d’,’%d’,’%f’,NOW())”,ht,lt,ns,smk,tmp,ac) ;
      my_conn.cmd_query(sqlbuf);
      Serial.println(“Data stored!”);
      }

      } // end mysql…!

      // main program

      saludos

  3. Hola, cual sería la ventaja de no utilizar PHP en el medio y enviar directamente los datos a Mysql?

    Pregunto esto porque estoy en un proyecto de este tipo y lo que hago es enviar por GET los valores obtenidos por el Arduino a un servidor donde los proceso con PHP (decido a que tabla van ya que hay más de un sensor y usuario, también sí hay que activar alguna alarma, etc.) y desde ahí los almaceno en la Base de Datos según los valores obtenidos.

    Hablé con un Ing. en Sistemas y me recomendó esto que plantean acá, de enviar los valores a Mysql directamente desde el Arduino y procesar todo desde ahí mediante código SQL, la razón que él me indica es la de optimizar el uso de servidores para que no se vuelvan lentos ante el aumento de consultas o envío de información. Hice una prueba con el Network de Chrome y una consulta compleja desde Arduino a PHP y de ahí a Mysql me lleva 120 milisegundos… Realmente creen que vale la pena perder la flexibilidad de PHP en este caso para enviarlo directamente a Mysql dado que antes debo procesar tanta información? ya que para mí todos los datos no son lo mismo y debo filtrarlos antes.

    Por otro lado yo no manejo al detalle SQL por lo que perdería mucho control del manejo de la aplicación online, este sería el trabajo del Ing. en Sistemas… me pregunto sí no me convendrá seguir procesando por PHP y ante al aumento de consultas contratar un servidor dedicado y aumentar así el rendimiento de mis servidores a medida que lo necesite. Qué opinan?

    Saludos a todos

  4. Amigo, funciona con XAMPP instalado en Linux Ubuntu 16.04, en XAMPP trae defecto MariaDB. gracias y felicitaciones, un gran tema.

  5. Buenos días.

    Quería saber si existe alguna limitante para la toma de datos en MySQL (velocidad), ya que necesito tomar algunos datos con diferencia de unos 20ms entre ellos.

    Muchas gracias.

Leave a comment