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.
[email protected]!!!
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; }
Hola. Me ha gustado mucho este artículo; me será de gran ayuda. Se me ocurre, para proteger los datos de la base de datos, poner esta información confidencial en un archivo de texto y dicho archivo ponerlo en una carpeta protegida (Configurando el archivo htaccess, para que sólo pudiera leerse desde nuestro dominio). Así el código principal, similar al que has puesto, puede llamar a los datos sin que se puedan capturar. Sería interesante y de agradecer un código parecido para conectar el esp8266 mediante la wifi. Seguramente lo podemos (y debemos) hacer nosotros solos; pero como es una cuestión… Leer más »
Buenas, como se podría hacer para conectar a un mismo php varias placas arduino? Tienen que ir conectadas individualmente a un router? O se podrían poner en serie de forma que los puertos de cada una se sumasen?
hola me podrias ayudar a hacerlo con un sensor de gas Q2, que envie el dato de arduino a una base de datos phpmysql en raspberry, saludos
Buenas, se podria hacer esto mismo pero en vez de mySQL con mongoDB??Gracias
Sí, pero recuerda que esta ya no es una técnica recomendada.
Si ya no es una técnica recomendable, ¿Cuál nos recomiendas?
De antemano gracias!
cual tecnica recomiendas Master
Hola, muy buen tutorial!
Hacia ya tiempo que estaba buscado esto la verdad, pero para usarlo con wifi, mediante un nodemcu.
Sería posible ver un ejemplo parecido pero conectandose por wifi?
Me sería de muchisima ayuda.
Salu2!!
Hola, como sería el código php con mysqli?
que sugieres usar con mysqli, master
Buenas tardes Sr. Profesor, estoy desarrollando una aplicación idéntica, que dependiendo de la información devuelta de la base de datos debe activar un actuador o encender un led, pero después de recibir el valor de la base de datos, ingresa solo si y nunca pasa a otra cosa, será que el sr. el profesor podría ayudarme a identificar el problema?
Puedes hacer un println del código que te ha devuelto el servidor para analizar su respuesta. Veo que tienes esa línea comentada.
ya hice un println del codigo y no responde el servidor desde la peticion HTTP de alli para abajo no se acciona como si no existiera codigo en el skech sigue contestando solo conectado y alli se queda
¿Por qué poner «get/» en el código? No aparece en la ruta del servidor. La primera impresión a cliente debe ser sin «ln», no puedes introducir un salto de línea.
No, entendí muy bien tu respuesta esa donde dice ¿Por que poner get en el código? Es pregunta o afirmación y el salto de linea que debo quitar es el de cliente.conect
GRACIAS SEGÚN YO YA QUIETE SALTO DE LINEA Y LA PREGUNTA NO SE QUE HACER ME SIGUE DICENDO SOLO CONECTADO PERO NO ME DA LA RESPUESTA
SALUDOS
En la petición del código tienes algo como: client.println(«get/proyectos_arduino/conexion_base.php?id=»); Usa print en lugar de println. La dirección que escribiste en un anterior comentario fue proyectos_arduino/conexion_bas…. y en el código tienes get/proyectos_arduino/conexion_base….
yAa le quite la ln (salto de linea) y quedaría así????
if (client.connect(server, 80)) {
Serial.print(«nConectado»);
client.print(«GET /arduino/conexion_base.php?id=»);
client.print(cardID);
client.println(«HTTP/1.0»);
client.println(«User-Agent: arduino-ethernet»);
client.println(«Connection: close»);
client.println();
Esta es la respuesta:

client.println(«HTTP/1.0»);
client.println(«User-Agent: arduino-ethernet»);
client.println(«Connection: close»);
deben tener ln, en la imagen no aparece el mismo código que has copiado en el comentario
Buenas Tardes
ya realice todo lo que dice el video 21 de mysql y arduino y no me regresa nada de la base de datos solo se repite escriba el identificador, a ver si me puedes ayudar
Verifica que la base de datos y PHP estan funcionando realizando la consulta desde un navegador web.
En espera de ayuda ya respondi y realice lo que me dices que hago?
Puede ser que esté rechazando la conexión. Monta un lamp o wamp en local y prueba ha realizar la consulta con Arduino contra tu máquina en lugar de contra el servidor.
qe version de wamp o lamp me recomiendas ya ves que las versiones de mysql o php a veces novan bien
Desconozco cuales son las últimas, en Ubuntu las tengo actualizadas y no tengo problemas. En Windows, si no recuerdo mal, puedes descargar el paquete completo.
ubuntu es de linux? verdad
Si
YA MONTE UN WAMP, XAMP, Y OTROS Y NO FUNCIONA QUE ESTARÁ PASANDO?
AYUDA
Todo perfecto en SERVIDOR LOCAL
pero la petición lo hace solo con ip y esto lo hago local
pero yo quiero hacerlo en Internet y si se conecta pero no hay respuesta
y lo unico que le hago es en lugar de poner IP pongo nombre de dominio y con el nombre no funciona en internet, como resuelvo poner nombre de dominio y no la ip ya que la empresa me dice que tengo que usar nombre de dominio y no la IP
Puedes poner el nombre de dominio en la variable de char server[]