Arduino Nano - MySQL

El Arduino Nano puede recopilar datos de sensores y almacenarlos en una base de datos MySQL. También puede recuperar datos (como comandos) de la base de datos MySQL para controlar dispositivos como LEDs, motores y actuadores.

Este tutorial le mostrará cómo usar el Arduino Nano y el módulo Ethernet para interactuar con la base de datos MySQL. Específicamente, cubriremos:

Arduino MySQL

Hardware Requerido

1×Official Arduino Nano
1×Alternatively, DIYables ATMEGA328P Nano Development Board
1×Cable USB A a Mini-B
1×W5500 Ethernet Module
1×Ethernet Cable
1×Cables Puente
1×Protoboard
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para Arduino Nano
1×(Recomendado) Placa de Expansión Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentación para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Arduino Nano - MySQL

Si eres nuevo en la arquitectura de sistemas, está bien pensar en la base de datos MySQL y en el servidor MySQL como si fueran lo mismo por ahora. A medida que adquieras más conocimientos, entenderás las diferencias entre ellos.

Existen dos métodos para que Arduino Nano se comunique con una base de datos MySQL:

  • Conectarse directamente al servidor MySQL usando una conexión MySQL (el enfoque directo)
  • Comunicarse con el servidor MySQL de forma indirecta a través de una conexión HTTP (el enfoque indirecto)

Vamos a explorar la mejor opción.

Arduino Nano interactúa directamente con el Servidor MySQL

Arduino directamente a MySQL

Esto podría parecer más sencillo, pero tiene varios inconvenientes:

  • Permitir que una cuenta de usuario de MySQL acceda de forma remota a la base de datos MySQL plantea riesgos de seguridad, incluso si la cuenta tiene privilegios limitados.
  • Procesar datos en el Arduino Nano y/o en el servidor MySQL aumenta la complejidad tanto del código del Arduino Nano como de los scripts de MySQL, y consume muchos de los recursos del Arduino Nano (memoria y CPU).
  • En algunos casos, el servidor MySQL puede devolver una gran cantidad de datos al Arduino Nano, lo que podría hacer que el Nano se quede sin memoria.
  • La mayoría de las bibliotecas de MySQL disponibles no admiten SSL/TLS, lo que significa que datos sensibles, como nombres de usuario y contraseñas, se enviarán en texto claro, creando un riesgo de seguridad adicional.

Arduino Nano interactúa indirectamente con un servidor MySQL a través de HTTP/HTTPS

El enfoque indirecto aborda todos los problemas que tiene el método directo. Antes de profundizar en cómo supera las desventajas del método directo, veamos primero cómo funciona.

Cómo funciona

  • Paso 1: Arduino Nano envía una solicitud HTTP al servidor web.
  • Paso 2: El servidor web ejecuta un script PHP.
  • Paso 3: El script PHP obtiene datos de la solicitud HTTP, los procesa e interactúa con la base de datos MySQL.
  • Paso 4: El script PHP procesa el resultado y lo envía de vuelta al Arduino Nano en una respuesta HTTP.
Arduino Nano MySQL HTTP

En este tutorial, tanto el servidor web como el servidor de MySQL se instalarán en una PC.

Puede que parezca complicado, pero no lo es. Así es como el método indirecto resuelve los problemas del enfoque directo:

  • Al instalar MySQL y servidores HTTP en la misma máquina, podemos restringir la cuenta de usuario de MySQL para que acceda únicamente a localhost. Además, el nombre de usuario y la contraseña de MySQL se almacenan de forma segura en el servidor (paso 3), lo que mejora la seguridad.
  • Los datos se procesan mediante un script PHP (pasos 3 y 4), reduciendo la carga de trabajo y la complejidad tanto para Arduino Nano como para el servidor MySQL. Procesar datos con código PHP es mucho más fácil que usar código de Arduino Nano o scripts de MySQL.
  • El script PHP puede filtrar los datos y enviar solo lo necesario al Arduino Nano (paso 4), evitando la sobrecarga de memoria.
  • La mayoría de las bibliotecas Ethernet/WiFi soportan TLS/SSL, lo que nos permite realizar solicitudes HTTPS. Usar HTTPS garantiza que los datos estén cifrados y se intercambien de forma segura en línea.

En el paso 1, podemos usar un nombre de usuario y una contraseña diferentes para la autenticación entre Arduino Nano y el servidor web. Por razones de seguridad, el nombre de usuario y la contraseña HTTP no deben ser las mismas que las credenciales de MySQL.

El siguiente tutorial mostrará cómo usar el método indirecto con Arduino Nano y MySQL, explicando sus numerosas ventajas.

Diagrama de cableado entre Arduino Nano y el módulo Ethernet W5500

Diagrama de cableado del módulo Ethernet de Arduino Nano

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

image source: diyables.io

Arduino Nano - MySQL vía HTTP/HTTPS

Aquí están los pasos que debemos seguir:

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

Lo haremos paso a paso. Vamos a realizar el proceso poco a poco.

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

Afortunadamente, el paquete XAMPP incluye todos estos.

Solo hay que instalarlo una vez:

  • Obtén XAMPP desde este enlace
  • Ejecuta la instalación.

Una vez que haya instalado, observará la carpeta C:\xampp\htdocs en su ordenador. Este es el lugar donde debe colocar su código PHP (como se discutirá más adelante).

2. Habilitar MySQL y el servidor web

  • Abre el Panel de Control de XAMPP.
  • Presiona el botón Iniciar para activar MySQL y el servidor web. (Ver la imagen a continuación.)
Arduino Nano 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 el nombre de usuario y la contraseña quedan expuestos, los atacantes no podrán acceder a la base de datos MySQL a menos que tengan control de la computadora.
  • Como PHP y MySQL están instalados en la misma PC, PHP puede usar este nombre de usuario y esta 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 computadora. Mantén esta ventana abierta hasta que termine el tutorial.
  • Escribe el siguiente comando en el símbolo del sistema:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\YOUR_USER>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Por defecto, MySQL tiene una cuenta root que no tiene contraseña.
  • Se recomienda añadirle una contraseña.

Introduce tu-contraseña-de-root para la cuenta root escribiendo este 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 este comando en el Símbolo del sistema:
mysql.exe -u root -p
  • Introduzca su contraseña de root y pulse la tecla Intro.
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)]>
  • Cree una cuenta de usuario de MySQL con el nombre de usuario Arduino y la contraseña ArduinoGetStarted.com copiando los comandos a continuación 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 una cuenta de usuario de MySQL. Recuerda el nombre de usuario y la contraseña, ya que serán necesarios para el script de PHP.

4. Crear una base de datos MySQL

Vamos a generar una base de datos titulada db_arduino ingresando 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 en MySQL

Vamos a crear una tabla llamada tbl_temp copiando los comandos que se muestran 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. Nómbralo insert_temp.php. Recupera la temperatura de la solicitud HTTP. Inserta la temperatura 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 en el directorio C:\xampp\htdocs.
  • Averigua la dirección IP de tu PC. Si no sabes cómo hacerlo, búscala en Google.
  • Para probar el código PHP, abre un navegador web (por ejemplo, Chrome) y ve a este enlace: http://192.168.0.26/insert_temp.php?temperature=27.5. Recuerda sustituir la dirección IP por la tuya.
  • El navegador debería mostrar "La temperatura 27.5 se ha guardado".
Prueba de MySQL con Arduino Nano
  • Verifique si los datos están almacenados en la base de datos ingresando 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]>

Es evidente que la temperatura de 27,5 se almacena en la base de datos. La siguiente acción es componer un código para Arduino Nano que genere una solicitud HTTP similar a la de tu PC.

7. Escribe código para Arduino Nano

Utilizaremos el Arduino Nano y Ethernet Shield para la prueba.

El código de Arduino Nano a continuación envía una solicitud HTTP a tu PC, con una temperatura de 29.1°C, para ser insertada en la base de datos.

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-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

  • Conecte el Arduino Nano al módulo Ethernet de acuerdo con el diagrama de cableado anterior.
  • Conecte un cable Ethernet al módulo Ethernet.
  • Conecte el Arduino Nano a un PC mediante un cable USB.
  • Abra el IDE de Arduino en su PC.
  • Seleccione la placa Arduino Nano y el puerto COM correspondiente
  • Haga clic en el icono Bibliotecas en la barra izquierda del IDE de Arduino.
  • Busque “Ethernet”, luego encuentre la biblioteca Ethernet por Various
  • Haga clic en el botón Instalar para instalar la biblioteca Ethernet.
Librería Ethernet para Arduino Nano
  • Modifica el código para reflejar la dirección IP del PC.
  • Compila y carga el código al Arduino Nano.
  • Abre el Monitor Serial.
  • La salida del Monitor Serial mostrará la dirección IP del Ethernet Shield.
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 ingresando 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]>

Es evidente que la base de datos contiene la temperatura de 29,1.

Cómo insertar, actualizar u obtener datos con Arduino Nano en la base de datos MySQL

En el ejemplo anterior, aprendimos cómo insertar datos en una base de datos MySQL. Actualizar y recuperar datos de la base de datos funciona de manera similar. Solo necesitas ajustar las consultas MySQL en el script PHP. Para obtener más información, puedes visitar W3Schools.

※ Nota:

Para construir un sistema altamente seguro, tendríamos que tomar medidas adicionales (por ejemplo, prevenir la inyección de MySQL, convertir HTTPS a una API REST, usar el formato JSON para los datos, etc.). Sin embargo, este tutorial está diseñado para que los principiantes aprendan con Arduino Nano, así que lo hemos mantenido lo más simple posible. Una vez que completes este tutorial, podrás ampliarlo para agregar características más avanzadas.

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!