Arduino - MySQL

Arduino puede recopilar datos de sensores y almacenarlos en la base de datos MySQL. Arduino también puede obtener datos (comandos) de la base de datos MySQL y controlar un LED, un motor, un actuador y un dispositivo.

En este tutorial, vamos a aprender:

Arduino MySQL

El tutorial proporciona el código de Arduino para dos casos:

Arduino - MySQL

Si no tienes mucho conocimiento de la arquitectura del sistema, dos términos: Base de datos MySQL y Servidor MySQL pueden entenderse como lo mismo. Encontrarás las diferencias más adelante cuando sepas mucho sobre la arquitectura del sistema.

Hay dos formas en las que Arduino puede interactuar con la base de datos MySQL:

  • Arduino interactúa directamente con el servidor MySQL a través de una conexión MySQL (llamada vía directa)
  • Arduino interactúa indirectamente con el servidor MySQL a través de una conexión HTTP (llamada vía indirecta)

Vamos a encontrar el mejor.

Arduino interactúa directamente con el servidor MySQL

Arduino directamente a MySQL

Esto suena más sencillo, pero hay muchas desventajas:

  • Esto permite que una cuenta de usuario de MySQL acceda de forma remota a la base de datos de MySQL ⇒ Esto es peligroso desde el punto de vista de seguridad, incluso si se concedieron privilegios limitados a la cuenta de usuario.
  • Los datos DEBEN procesarse en Arduino y/o servidor MySQL ⇒ Esto aumenta la complejidad del código de Arduino y del script de MySQL. Especialmente, consume muchos recursos de Arduino (memoria y uso de CPU).
  • El servidor MySQL puede devolver una gran cantidad de datos a Arduino en algunos casos ⇒ Esto puede hacer que Arduino se quede sin memoria.
  • La mayoría de las bibliotecas de MySQL disponibles no admiten SSL/TLS. Los datos, incluyendo el nombre de usuario y la contraseña, se enviarán en texto plano ⇒ Otro problema de seguridad.

Arduino interactúa indirectamente con el servidor MySQL vía HTTP/HTTPS

Este enfoque indirecto soluciona todos los problemas que presenta el enfoque directo. Antes de ver cómo el enfoque indirecto supera las desventajas del enfoque directo, veamos primero cómo funciona.

Cómo funciona

  • Paso 1: Arduino realiza una solicitud HTTP al servidor web
  • Paso 2: El servidor web ejecuta un script PHP
  • Paso 3: El script PHP obtiene los datos de la solicitud HTTP, procesa los datos y luego interactúa con la base de datos MySQL.
  • Paso 4: El script PHP procesa el resultado y devuelve el resultado a Arduino a través de la respuesta HTTP
Arduino MySQL Protocolo de Transferencia de Hipertexto HTTP

En este tutorial, el servidor web y el servidor MySQL se instalarán en la PC.

Parece complicado, pero no. Ahora veamos cómo el camino indirecto supera las desventajas del camino directo.

  • Al instalar el servidor MySQL y el servidor HTTP en el mismo servidor físico, podemos limitar una cuenta de usuario de MySQL para que acceda SOLO a localhost. Además, el nombre de usuario y la contraseña de la cuenta de MySQL se almacenan en el servidor (paso 3); esto hace que el sistema sea más seguro.
  • Los datos son procesados por un script PHP (paso 3 y paso 4). Esto reduce el trabajo y la complejidad para los servidores Arduino y MySQL. Procesar datos usando código PHP es mucho más fácil que el código de Arduino y el script de MySQL.
  • El script PHP puede procesar los datos y enviar solo los datos necesarios al Arduino (Paso 4) para evitar que Arduino se quede sin memoria.
  • La mayoría de las bibliotecas Ethernet/WiFi soportan TLS/SSL, lo que nos permite realizar solicitudes HTTPS. Al usar HTTPS, los datos están cifrados y se intercambian de forma segura a través de Internet.

En el paso 1, podemos usar otro nombre de usuario y contraseña para realizar la autenticación entre Arduino y el servidor web. Tenga en cuenta que el nombre de usuario y la contraseña HTTP deben ser diferentes de las credenciales de MySQL por motivos de seguridad.

Con esas ventajas, el resto de este tutorial mostrará cómo usar Arduino con MySQL mediante un enfoque indirecto.

Arduino - MySQL vía HTTP/HTTPS

Necesitamos realizar el siguiente paso:

  • Instala el servidor MySQL, el servidor web y PHP en tu PC
  • Habilita MySQL y el servidor web
  • Crea una cuenta de usuario de MySQL
  • Crea una base de datos MySQL
  • Crea una tabla de MySQL
  • Escribe uno o más archivos de script PHP
  • Escribe código para Arduino

Ahora hagámoslo paso a paso.

1. Instalar el servidor MySQL, el servidor web y PHP en tu PC

Afortunadamente, el paquete XAMPP incluye todos estos. Solo necesitamos instalarlo una vez.

Después de instalar, verás la carpeta C:\xampp\htdocs en tu PC. Aquí es donde colocas código PHP (ver más adelante).

2. Habilitar MySQL y servidor web

  • Abra el Panel de Control de XAMPP
  • Haga clic en el botón Inicio para habilitar MySQL y el servidor web (Vea la imagen a continuación)
Arduino XAMPP

3. Crear una cuenta de usuario de MySQL

Crearemos una cuenta de MySQL que solo pueda conectarse a la base de datos MySQL desde localhost.

  • Incluso si se revelan el nombre de usuario y la contraseña, los atacantes aún no pueden acceder a su base de datos MySQL a menos que tomen el control de su PC.
  • Debido a que PHP y MySQL están instalados en la misma PC, PHP puede usar este nombre de usuario y contraseña para conectarse a la base de datos MySQL.

Vamos a crear una cuenta de usuario de MySQL con el nombre de usuario Arduino y la contraseña ArduinoGetStarted.com:

  • Abre el símbolo del sistema en tu PC. No lo cierres hasta el final del tutorial.
  • Escribe el siguiente comando en el símbolo del sistema:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\youruser>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Por defecto, MySQL tiene la cuenta root sin contraseña. Deberías añadir una contraseña

(p. ej. your-root-password) para la cuenta raíz escribiendo el siguiente comando en el Símbolo del sistema:

mysqladmin -u root password your-root-password
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password your-root-password C:\xampp\mysql\bin>
  • Escribe el siguiente comando en el Símbolo del sistema:
mysql.exe -u root -p
  • Escribe tu contraseña de root y presiona Enter
Command Prompt
C:\xampp\mysql\bin>mysql.exe -u root -p Enter password: ****************** Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.6-MariaDB mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
  • Crear una cuenta de usuario de MySQL con el nombre de usuario Arduino y la contraseña ArduinoGetStarted.com copiando los siguientes comandos y pegándolos en el Símbolo del sistema:
CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]>

Ahora has creado con éxito una cuenta de usuario de MySQL. Memoriza el nombre de usuario y la contraseña; se utilizarán en el script de PHP.

4. Crear una base de datos de MySQL

Vamos a crear una base de datos llamada db_arduino escribiendo el siguiente comando en el símbolo del sistema:

CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci';
Command Prompt
MariaDB [(none)]> CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci'; Query OK, 1 row affected (0.003 sec) MariaDB [(none)]>

5. Crear una tabla de MySQL

Vamos a crear una tabla llamada tbl_temp copiando los comandos a continuación y pegándolos en el Símbolo del sistema:

USE db_arduino; CREATE TABLE tbl_temp ( temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, temp_value FLOAT DEFAULT 0.00, PRIMARY KEY (temp_id) );
Command Prompt
MariaDB [(none)]> USE db_arduino; Database changed MariaDB [db_arduino]> MariaDB [db_arduino]> CREATE TABLE tbl_temp ( -> temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> temp_value FLOAT DEFAULT 0.00, -> PRIMARY KEY (temp_id) -> ); Query OK, 0 rows affected (0.044 sec) MariaDB [db_arduino]>

6. Escribe uno o más archivos PHP

Crea un archivo PHP llamado insert_temp.php que obtenga la temperatura de la solicitud HTTP y la inserte en la base de datos.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "Arduino"; $password = "ArduinoGetStarted.com"; $dbname = "db_arduino"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO tbl_temp (temp_value) VALUES ($temperature)"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " => " . $conn->error; } $conn->close(); } else { echo "temperature is not set"; } ?>
  • Coloca este archivo dentro de la carpeta C:\xampp\htdocs.
  • Obtén la dirección IP de tu PC. Si no sabes cómo hacerlo, búscala en Google.
  • Prueba el código PHP abriendo un navegador web (p. ej. Chrome) y accediendo a este enlace: http://192.168.0.26/insert_temp.php?temperature=27.5. Ten en cuenta que necesitas reemplazar la dirección IP anterior por la de tu PC.
  • La salida en el navegador web.
Prueba de MySQL
  • Compruebe si los datos están almacenados en la base de datos escribiendo el siguiente comando en el Símbolo del sistema:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_arduino]>

Como puedes ver, la temperatura de 27.5 está almacenada en la base de datos. El siguiente paso es escribir código para Arduino que realice una solicitud HTTP similar a la de tu PC.

7. Escribir código de Arduino

Usaremos Arduino Uno y Escudo Ethernet o Arduino Uno R4 WiFi para la prueba

El código de Arduino que se muestra a continuación realiza una solicitud HTTP a tu PC para insertar una temperatura de 29,1 °C en la base de datos.

Código de Arduino para Arduino Uno R4 WiFi

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-mysql */ #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID (name) const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password (use for WPA, or use as key for WEP) WiFiClient client; int status = WL_IDLE_STATUS; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.0.26"; // change to your PC's IP address String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=29.1"; void setup() { Serial.begin(9600); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // connect to web server on port 80: if (client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header while (client.connected()) { if (client.available()) { // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else { // if not connected: Serial.println("connection failed"); } } void loop() { }

Código de Arduino para Arduino Uno/Mega y Ethernet Shield

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-mysql */ #include <SPI.h> #include <Ethernet.h> // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetClient client; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.0.26"; // change to your PC's IP address String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=29.1"; void setup() { Serial.begin(9600); // initialize the Ethernet shield using DHCP: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to obtaining an IP address using DHCP"); while(true); } // connect to web server on port 80: if(client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header while(client.connected()) { if(client.available()){ // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else {// if not connected: Serial.println("connection failed"); } } void loop() { }

Pasos R\u00e1pidos

  • Si está utilizando el Ethernet Shield, coloque el Ethernet Shield sobre el Arduino Uno.
  • Conecte el cable Ethernet al Ethernet Shield.
  • Conecte el Arduino Uno al PC mediante un cable USB.
  • Modifique la dirección IP en el código para que coincida con la dirección IP de su PC.
  • Compilar y subir el código al Arduino.
  • Abra el Monitor Serial.
  • El resultado en el Monitor Serial.
COM6
Send
Connected to server HTTP/1.1 200 OK Date: Tue, 12 Jan 2021 07:52:22 GMT Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8 X-Powered-By: PHP/7.3.8 Content-Length: 31 Connection: close Content-Type: text/html; charset=UTF-8 New record created successfully disconnected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Verifique si los datos están almacenados en la base de datos escribiendo el siguiente comando en el Símbolo del sistema:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | | 2 | 29.1 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_arduino]>

Como puedes ver, la temperatura 29.1 está almacenada en la base de datos.

Cómo Arduino inserta, actualiza u obtiene datos desde y hacia la base de datos MySQL

En el ejemplo anterior, hemos aprendido a insertar datos en la base de datos MySQL. Para actualizar y obtener datos de la base de datos, es similar. Solo necesitas cambiar las consultas MySQL en el script PHP. Puedes aprender más en W3Schools

Uso avanzado

Para aumentar la seguridad

  • Puedes modificar el código de Arduino para usar HTTPS en lugar de HTTP. Ver Arduino - HTTPS
  • Puedes usar un nombre de usuario y una contraseña para realizar la autenticación entre Arduino y el servidor web. Ver Autenticación básica

※ Nota:

Para crear un sistema completo con el nivel de seguridad más alto, necesitamos hacer más (como prevenir inyecciones de MySQL, convertir HTTPS en una API REST, usar el formato JSON para los datos, ...). Sin embargo, este tutorial está dedicado a principiantes que quieren aprender Arduino. Lo hemos hecho lo más simple posible. Después de aprender este tutorial, los usuarios pueden ampliarlo.

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!