ESP32 - MySQL

Este tutorial explica cómo usar ESP32 para insertar o actualizar datos en una base de datos MySQL, o leer los datos de una base de datos MySQL.

ESP32 MySQL

Hardware Requerido

1×Módulo de Desarrollo ESP32 ESP-WROOM-32
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×(Opcional) Conector de Alimentación DC
1×Protoboard
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP32
1×(Recomendado) Breakout Expansion Board for ESP32
1×(Recomendado) Divisor de Alimentación para ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
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.

ESP32 - MySQL

Hay dos términos en MySQL con los que los principiantes suelen confundirse: Base de datos de MySQL y servidor de MySQL. Son diferentes. Sin embargo, si eres principiante, puedes suponer que son lo mismo. Más tarde, encontrarás las diferencias en tu proceso de aprendizaje.

El ESP32 puede interactuar con la base de datos MySQL de dos maneras:

  • Directamente: ESP32 se conecta directamente al servidor MySQL y interactúa con el servidor MySQL utilizando el protocolo MySQL
  • Indirectamente: ESP32 se conecta indirectamente al servidor MySQL a través de un servidor web utilizando el protocolo HTTP/HTTPS

¿Cuál es el mejor para el ESP32? ¡Vamos a averiguarlo!

ESP32 interactúa directamente con el Servidor MySQL

ESP32 directamente a MySQL

Interactuar directamente con MySQL parece sencillo, pero hay muchos inconvenientes:

  • Tenemos que otorgar permisos de acceso remoto a una cuenta de usuario de MySQL ⇒ Esto es arriesgado desde el punto de vista de la seguridad, incluso si otorgamos privilegios limitados a la cuenta de usuario.
  • ESP32 DEBE almacenar y enviar consultas MySQL al servidor MySQL ⇒ Es necesario escribir mucho código para ESP32, y también agotar los recursos del ESP32 (memoria y uso de la CPU).
  • ESP32 DEBE procesar una respuesta MySQL compleja (muy grande en algunos casos) ⇒ Esto puede hacer que el ESP32 se quede sin memoria.
  • El servidor MySQL debe procesar los datos en bruto ⇒ lo que aumenta la complejidad del script de MySQL.
  • La mayoría de las bibliotecas de MySQL para ESP32 no admiten SSL/TLS ⇒ Los datos y las credenciales de usuario se envían sin cifrado ⇒ otro problema de seguridad.

ESP32 interactúa indirectamente con el servidor MySQL a través de HTTP/HTTPS

Interactuar con MySQL indirectamente a través de HTTP/HTTPS soluciona todos los problemas del acceso directo.

Cómo funciona

  • Step 1: ESP32 incluye los datos para la solicitud HTTP/HTTPS y envía la solicitud al servidor web
  • Step 2: El servidor web ejecuta un script PHP que maneja la solicitud del ESP32
  • Step 3: El script PHP extrae los datos de la solicitud HTTP, procesa los datos y luego interactúa con la base de datos MySQL
  • Step 4: El script PHP procesa el resultado y devuelve solo el resultado necesario al ESP32 a través de la respuesta HTTP
ESP32 MySQL HTTP

Vamos a instalar el servidor MySQL, el servidor web y PHP en la PC. De hecho, podemos instalarlo en un servidor dedicado o en un servicio en la nube como AWS EC2.

A continuación se muestra cómo la vía indirecta resuelve los problemas de la vía directa.

  • Podemos instalar el servidor HTTP y el servidor MySQL en el mismo servidor físico. Podemos otorgar acceso limitado a una cuenta de usuario de MySQL (p. ej. acceso localhost SOLAMENTE) ⇒ seguro
  • El nombre de usuario y la contraseña de la cuenta de MySQL se almacenan en el servidor ⇒ seguro.
  • Los datos son procesados por un script PHP ⇒ Esto reduce la carga y la complejidad para el ESP32 y el servidor MySQL.
  • El script PHP puede procesar los datos mucho más fácilmente que el código ESP32 y el script MySQL ⇒ Simplificar el código ESP32 y el script MySQL.
  • El script PHP puede procesar los datos y enviar solo los datos necesarios al ESP32 (Paso 4) para evitar que el ESP32 se quede sin memoria.
  • ESP32 puede realizar solicitudes HTTPS fácilmente ⇒ los datos están encriptados.

Nota: la autenticación entre el ESP32 y el servidor web debe ser independiente de la autenticación de MySQL. Por ejemplo, el nombre de usuario y la contraseña de HTTP deberían ser diferentes de las de MySQL.

Debido a esas ventajas, este tutorial utilizará la vía indirecta.

ESP32 a MySQL a través de HTTP/HTTPS

A continuación se presentan los pasos que debemos seguir:

  • Instalar el paquete XAMPP que incluye el servidor MySQL, el servidor web y PHP en tu PC
  • Crear una cuenta de usuario de MySQL
  • Crear una base de datos MySQL
  • Crear una tabla MySQL
  • Escribir uno o más archivos de scripts PHP
  • Escribir código para ESP32

1. Instalación del servidor MySQL, del servidor web y de PHP en tu PC

  • Descargue e instale XAMPP desde este enlace. Después de la instalación, verifique la carpeta C:\xampp\htdocs en su PC. Aquí es donde coloca el código PHP (ver más adelante).
  • Abra el Panel de Control de XAMPP
  • Haga clic en los botones Start para habilitar MySQL y el servidor web (como se muestra en la imagen de abajo)
ESP32 XAMPP

2. Crear una cuenta de usuario de MySQL

Crearemos una cuenta de MySQL con permisos de acceso únicamente desde localhost.

  • Aunque los atacantes conozcan el nombre de usuario y la contraseña, no podrán acceder a tu base de datos MySQL a menos que tomen el control de tu PC.
  • Este nombre de usuario y su contraseña serán utilizados por PHP para conectarse a la base de datos MySQL.

Este tutorial crea una cuenta de usuario de MySQL cuyo nombre de usuario y contraseña son ESP32 y newbiely.com, respectivamente:

  • Abra el Símbolo del sistema en su PC. No lo cierre hasta el final del tutorial.
  • Escriba 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 la cuenta root sin contraseña. Se recomienda encarecidamente establecer la contraseña para la cuenta root (p. ej. YOUR_ROOT_PASSWORD) por motivos de seguridad. Escribe 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 para iniciar sesión en el servidor MySQL:
mysql.exe -u root -p
  • Escribe TU CONTRASEÑA DE ROOT y pulsa 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)]>
  • Vamos a crear una cuenta de usuario de MySQL con el nombre de usuario y la contraseña, que son ESP32 y newbiely.com, respectivamente, copiando los comandos a continuación y pegándolos en el Símbolo del sistema:
CREATE USER 'ESP32'@'localhost' IDENTIFIED BY 'newbiely.com'; GRANT ALL PRIVILEGES ON *.* TO 'ESP32'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'ESP32'@'localhost' IDENTIFIED BY 'newbiely.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'ESP32'@'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)]>

Has creado con éxito una cuenta de usuario de MySQL. Anota el nombre de usuario y la contraseña. Se utilizará en un script de PHP.

3. Creación de una base de datos MySQL

Crea una base de datos db_esp32 escribiendo el siguiente comando en el Símbolo del sistema:

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

4. Creación de una tabla de MySQL

Crea una tabla tbl_temp copiando los comandos que se muestran a continuación y pégalos en el Símbolo del sistema:

USE db_esp32; 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_esp32; Database changed MariaDB [db_esp32]> MariaDB [db_esp32]> 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_esp32]>

6. Escribe archivos de scripts PHP

Crea un insert_temp.php usando cualquier editor de texto (p. ej. Notepad/Notepad++). Escribiremos el script en este archivo para extraer el valor de temperatura de la solicitud HTTP e insertar el valor de temperatura en la base de datos.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "ESP32"; $password = "newbiely.com"; $database_name = "db_esp32"; // Create MySQL connection fom PHP to MySQL server $connection = new mysqli($servername, $username, $password, $database_name); // Check connection if ($connection->connect_error) { die("MySQL connection failed: " . $connection->connect_error); } $sql = "INSERT INTO tbl_temp (temp_value) VALUES ($temperature)"; if ($connection->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " => " . $connection->error; } $connection->close(); } else { echo "temperature is not set in the HTTP request"; } ?>
  • Coloque este archivo dentro de la carpeta C:\xampp\htdocs.
  • Obtenga la dirección IP de su PC. Si no sabe cómo hacerlo, búsquelo en Google.
  • Pruebe el código PHP abriendo un navegador web (p. ej., Chrome) y acceda a este enlace: http://192.168.0.19/insert_temp.php?temperature=26.2. Tenga en cuenta que debe reemplazar la dirección IP anterior por la de su PC.
  • El navegador web se muestra a continuación:
Prueba de MySQL
  • 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_esp32]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 26.2 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_esp32]>

Como puedes ver, la temperatura de 26,2 está almacenada en la base de datos. El siguiente paso es escribir código para ESP32 que haga una solicitud HTTP al servidor web en tu PC.

7. Escribe código ESP32

El código ESP32 que se muestra a continuación realiza una petición HTTP a tu PC para insertar una temperatura de 30,5 °C en la base de datos.

/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp32/esp32-mysql */ #include <WiFi.h> #include <HTTPClient.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; String HOST_NAME = "http://192.168.0.19"; // change to your PC's IP address String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=30.5"; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Connecting"); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); HTTPClient http; http.begin(HOST_NAME + PATH_NAME + queryString); //HTTP int httpCode = http.GET(); // httpCode will be negative on error if(httpCode > 0) { // file found at server if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); Serial.println(payload); } else { // HTTP header has been send and Server response header has been handled Serial.printf("[HTTP] GET... code: %d\n", httpCode); } } else { Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } void loop() { }

Pasos R\u00e1pidos

  • Si es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.
  • Realiza el cableado como en la imagen anterior.
  • Conecta la placa ESP32 a tu PC mediante un cable micro USB.
  • Cambia la dirección IP en el código por la dirección IP de tu PC.
  • Compila y carga el código en ESP32.
  • Abre el Monitor Serial en Arduino IDE.
Cómo abrir el monitor serie en el IDE de Arduino
  • El resultado en el monitor serie
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  
  • Comprueba si los datos están almacenados en la base de datos utilizando el siguiente comando en el símbolo del sistema:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_esp32]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 26.2 | | 2 | 30.5 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_esp32]>

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

Cómo el ESP32 inserta, actualiza u obtiene datos en una base de datos MySQL

El ejemplo anterior muestra cómo insertar datos en la base de datos MySQL. Es similar para actualizar y leer datos de la base de datos. Solo necesitas modificar la consulta de MySQL en el código PHP. Puedes aprender más en W3Schools.com

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!