• Autor de la entrada:
  • Categoría de la entrada:Arduino

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. Pero también puedes necesitar el proceso contrario, enviar datos de MySQL  a Arduino.

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 scripts 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. Eso es precisamente lo que vamos a hacer ahora, recuperar información de la base de datos e imprimir por el puerto serie.

Controlemos a nuestros usuarios

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

La tecnología evoluciona

En la fecha en la que escribí este tutorial, PHP estaba a la orden del día, sin embargo esto a cambiado. Puedes usar PHP pero en realidad con la inclusión de las plataformas Cloud otros lenguajes como JavaScript o Python han ganado importancia para realizar estas tareas.

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.

Otra forma de devolver la información es formateándola en un JSON.

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;
}

De MySQL a Arduino en vídeo


De MySQL a Arduino

Enrique Gómez

Ingeniero Electrónico Industrial y Automático, amante 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 www.enriquegomez.me