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