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.

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

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
Suscribete
Notificame
guest
29 Comments
Nuevos
Antiguos Más votados
Inline Feedbacks
View all comments
Mario
Mario
10 meses hace tiempo

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 »

Alberto
Alberto
2 años hace tiempo

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?

artur
artur
2 años hace tiempo

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

Angel
Angel
2 años hace tiempo

Buenas, se podria hacer esto mismo pero en vez de mySQL con mongoDB??Gracias

Luis
Luis
Reply to  Enrique Gómez
1 año hace tiempo

Si ya no es una técnica recomendable, ¿Cuál nos recomiendas?
De antemano gracias!

juan rivera
juan rivera
Reply to  Luis
3 meses hace tiempo

cual tecnica recomiendas Master

Pablo
Pablo
2 años hace tiempo

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!!

Last edited 2 años hace tiempo by Pablo
Osiel Mendoza Padron
Osiel Mendoza Padron
2 años hace tiempo

Hola, como sería el código php con mysqli?

juan rivera
juan rivera
Reply to  Osiel Mendoza Padron
3 meses hace tiempo

que sugieres usar con mysqli, master

Augusto
Augusto
3 años hace tiempo

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?

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

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

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

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

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

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:
comment image

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
5 años hace tiempo

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

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

En espera de ayuda ya respondi y realice lo que me dices que hago?

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

qe version de wamp o lamp me recomiendas ya ves que las versiones de mysql o php a veces novan bien

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

ubuntu es de linux? verdad

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

YA MONTE UN WAMP, XAMP, Y OTROS Y NO FUNCIONA QUE ESTARÁ PASANDO?
AYUDA

Miguel Angel Navejas Torres
Miguel Angel Navejas Torres
Reply to  Enrique Gómez
5 años hace tiempo

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