Publicado por el 17 enero, 2015 18 comentarios
Dificultad media altaComplejidad media alta
CC BY-SA 4.0

Sea cual sea el motivo, puede ser que te encuentres con la necesidad de tener que almacenar en una base de datos, como MySQL, información que proviene de un dispositivo electrónico como un sensor o el proceso contrario enviar datos de MySQL  a Arduino, por ejemplo. Imagina almacenar la lectura de un sensor en MySQL o pedir a la base de datos el valor de uno de sus registros desde Arduino o desde ESP8266.



Si fuiste uno de los que me pediste un tutorial sobre como obtener con Arduino información que está almacenada en una base de datos MySQL estas de enhorabuena, porque aquí esta.

¿Por qué usar MySQL con Arduino o ESP8266?

Cuando montamos proyectos en los que tenemos que gestionar grandes cantidades de datos, ya no solo almacenarlos, sino procesarlos y mostrarlos a un usuario, usar un servidor con MySQL puede ser una opción muy interesante. Tras almacenar los datos podemos ejecutar scrips en el servidor que hagan los cálculos necesarios, cálculos que por ser complejos en un microcontrolador tardarían más en realizarse.

Logo de MySQL a Arduino

Pero aparte de almacenarlos, también es interesante que Arduino pueda leerlos y tomar decisiones como controlar actuadores o mostrar información en pantallas y eso es precisamente lo que vamos a hacer ahora, recuperar información de la base de datos e imprimir por el puerto serie.

Vamos a partir de la idea de que tenemos una base de datos con usuarios de un sistema de control de accesos. En ella almacenamos los nombres de los usuarios y un identificador de cada uno de ellos. En una situación como esta puede ser interesante poder enviar datos de MySQL a Arduino.

Arduino se encargará de identificar a la persona por el método que sea necesario. Para simplificar el ejemplo, el microcontrolador pedirá el número que identifica al usuario por el puerto serie, es decir, el id de usuario. Una situación más realista podría ser un control de accesos con RFID. En el caso del sistema basado en RFID, Arduino se podría encargar de leer el identificador de un tag RFID y usar este como el id de usuario.

El segundo paso será acceder a al base de datos y recuperar el nombre de la persona que está relacionado con ese id de ususario. Como no podemos comunicarnos directamente con MySQL usaremos un intermediario, un archivo escrito en PHP. Se pueden usar muchas alternativas a PHP, sin embargo, esta es bastante generalista.

Código PHP

Hay que tener en cuenta que el código en PHP tendrá que ser ejecutado en una máquina que pueda hacerlo. En mi caso, lo haré en el mismo servidor en el que está la base de datos. Es por estar en la misma máquina el motivo por el cual se usa localhost en la función de conexión con MySQL.



A efectos prácticos, la conexión entre Arduino y el servidor que ejecuta el PHP es una simple petición HTTP 1.0 en la cual se envia el identificador de usario por medio de GET. El servidor responde a la petición buscando el nombre en la base de datos y devolviendo un texto plano. Este texto plano será analizado e interpretado en Arduino para llevar a cabo lo que necesitemos en función de la aplicación.

Es interesante que el texto que devulve el script PHP, esté formateado y no sea simple texto sin sentido. Al formatearlo, el programa necesario para tratar la información en Arduino será infinitamente más fácil. Ni que decir la sencillez de entender un texto formateado al hacer depuración. El texto se lee mejor si existen delimitadores como , (coma), ; (punto y coma), : (dos puntos), = (signo igual) o espacios.

Una forma de delimitar y formatear la respuesta del servidor puede ser:

valor=Juanito;

La respuesta es “Juanito“, pero si existen multiples respuestas, este formato es fácil de interpretar.

Atent@!!!

Este código PHP está desactualizado, es una forma no recomendada actualmente para hacer la conexión segura con la base de datos. Te recomiendo que busques más información sobre como hacer una conexión entre PHP y MySQL. La técnica y códigos de Arduino no presentan ningún problema. Actualizado: 12/01/2018

<?php
$conexion = mysql_connect("localhost", "******", "******");
mysql_select_db("proyectos",$conexion);
$resultado = mysql_query("SELECT nombre FROM accesorfid WHERE id='" . $_GET['id']. "'", $conexion);
$nombre = mysql_result($resultado, 0);

echo "valor=" . $nombre . ";";
?>


Código Arduino para conectar con MySQL

#include <SPI.h>
#include <Ethernet.h>

//Asignamos una dirección MAC
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

//Asignar dirección IP
IPAddress ip(192,168,1,173);

//Inicializar instancia de la libreria ethernet
EthernetClient client;

//Dirección IP del servidor con la página PHP
char server[] = "192.168.1.251"; 

//Variables que neceita para funcionar
String codigo;        //Aquí se almacena la respuesta del servidor
String nombre;        //Aquí se almacena el nombre que recuperamos de MySQL
boolean fin = false;  
boolean pregunta = true;


void setup() {
  // Iniciar puerto serie
  Serial.begin(9600);
  // Dar un respiro a Arduino
  delay(1000);
  //Iniciar la coneción de red
  Ethernet.begin(mac, ip);
  // Imprimir la dirección IP
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
    //Comprobamos si tenemos datos en el puerto serie
    if (pregunta == true) Serial.print("Escribe el identificador de la persona: ");
    pregunta = false;
    if (Serial.available()>0){
        //leemos el identificador
        int identificador=Serial.read()-48;
        //llamamos a la función quenos permitira comunicarnos con el servidor
        httpRequest(identificador);
        pregunta = true;
  }
      

}

// Con esta función hacemos la conecion con el servidor
int httpRequest(int identificador) {

  // Comprobar si hay conexión
  if (client.connect(server, 80)) {
    Serial.println("nConectado");
    // Enviar la petición HTTP
    //Dirección del archivo php dentro del servidor
    client.print("GET /ingenieros/comunicaciones/valormysql.php?id=");
    //Mandamos la variable junto a la línea de GET
    client.print(identificador);
    client.println(" HTTP/1.0");
    //IP del servidor
    client.println("Host: 192.168.1.251");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
  }
  else {
    // Si no conseguimos conectarnos
    Serial.println("Conexión fallida");
    Serial.println("Desconectando");
    client.stop();
  }

  delay(500);
  //Comprobamos si tenemos respuesta del servidor y la 
  //almacenamos en el string ----> codigo.
  while (client.available()) {
    char c = client.read();
    codigo += c;
    //Habilitamos la comprobación del código recibido
    fin = true;

  }
  //Si está habilitada la comprobación del código entramos en el IF
  if (fin)  {
   // Serial.println(codigo);
   //Analizamos la longitud del código recibido
    int longitud = codigo.length();
    //Buscamos en que posición del string se encuentra nuestra variable
    int posicion = codigo.indexOf("valor=");
    //Borramos lo que haya almacenado en el string nombre
    nombre = "";

    //Analizamos el código obtenido y almacenamos el nombre en el string nombre
    for (int i = posicion + 6; i < longitud; i ++){
      if (codigo[i] == ';') i = longitud;
      else nombre += codigo[i];
    }
    //Deshabilitamos el análisis del código
    fin = false;
    //Imprimir el nombre obtenido
    Serial.println("Valor de la variable nombre: " + nombre);
    //Cerrar conexión
    Serial.println("Desconectarn");
    client.stop();
  }
  //Borrar código y salir de la función//Dirección IP del servidor
  codigo="";
  return 1;
}



Sobre el autor
Amante de la ingeniería electrónica, de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars, cuenta más de lo que parece. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario