ESP32 / ESP8266 Escribir en una Base de datos MySQL usando PHP y Arduino IDE

Este artículo pretende explicar cómo conectar un módulo con un ESP32/ESP8266 a un servidor WEB que reciba los datos.

El microcontrolador será el cliente de una «página WEB», accederá con información a un vínculo para insertar información en una Base de Datos

Actualizado: 2/7/2025

CONTEXTO

Insertar datos directamente en una base MySQL desde un microcontrolador resulta sencillo, pero puede presentar riesgos de seguridad y escalabilidad. Como alternativa, se puede usar una API REST o un broker MQTT. Este artículo muestra un enfoque con PHP y HTTP, con medidas básicas de protección.

A) Configurar la Base de Datos MySql y Hostear la página PHP para recibir datos por el métido POST

Este cliente realizará una solicitud HTTP POST a un script PHP para insertar datos en una base de datos MySQL

Luego se podrá ver o procesar la información que ha sido enviada

 

 

1. En el servicio de hosting, el Cpanel o en el phpMyAdmin, crear una base de datos

 

2. Escoge un nombre para la base de datos

 

3. Define nombre de usuario y contraseña

¡Listo!

Ha creado con éxito un usuario de MySQL llamado «huecat_placaESP8266»

Usuario: huecat_placaESP8266
Base de datos: huecat_mqtt_Arduin0
Contraseña: huecat2020

 

4. Creando tabla en MySql

5. En la pestaña de SQL y pegando y ejecutando estas líneas se creará la tabla:

CREATE TABLE lectura_sensor(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
id_sensor INT(6) NOT NULL,
nombre_sensor VARCHAR(40) NOT NULL,
lugar VARCHAR(60) NOT NULL,
hora_lectura TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) 

El campo hora_lectura con la etiqueta TIMESTAMP DEFAULT guardará el tiempo actual (CURRENT_TIMESTAMP) que se actualizará automáticamente con la fecha y hora (ON UPDATE CURRENT_TIMESTAMP)

Enhorabuena! Ya está creada la tabla

Ya hay un lugar donde dejar los datos que lee el Arduino.

Post Script – El Script que postea en la Base de datos

Debe haber un archivo en el servidor que se conecte con la base de datos. Para esto aprovecharé las ventajas del PHP, que permite ejecutar código en el servidor con una sintaxis muy familiar para quienes programan en C

Crearé una carpeta en mi servidor que contenga el archivo. Cada vez que envíe a ese archivo información desde el sensor podré almacenarla en la BD

Programación del ESP8266/ESP32 utilizando Arduino IDE

El microcontrolador se conectará a Internet, accederá a esta página y este archivo se encargará de registrar los valores en la BD.

 

B) Con el servidor y la base de datos creada, podemos pasar a implementar la conexión: 

2.2 Configuración de PHP

  1. Instalar y habilitar la extensión mysqli o pdo_mysql en php.ini.
  2. Colocar el archivo de configuración fuera de la carpeta pública (por ejemplo, en /var/www/config/).
<?php
// /var/www/config/db.php
return [
  'host' => 'localhost',
  'user' => 'usuario_db',
  'pass' => 'contraseña_segura',
  'db'   => 'sensores',
];

3. Script PHP seguro

<?php
// public_html/api/insertar.php
header('Content-Type: application/json; charset=utf-8');

$config = require __DIR__ . '/../config/db.php';
$input  = json_decode(file_get_contents('php://input'), true);

// Validar datos
if (
  empty($input['sensor']) ||
  !isset($input['valor']) ||
  !is_numeric($input['valor'])
) {
  http_response_code(400);
  echo json_encode(['error' => 'Parámetros inválidos']);
  exit;
}

try {
  // Conexión con PDO y manejo de excepciones
  $dsn = "mysql:host={$config['host']};dbname={$config['db']};charset=utf8mb4";
  $pdo = new PDO($dsn, $config['user'], $config['pass'], [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  ]);

  // Prepared statement para evitar inyección SQL
  $sql = 'INSERT INTO lecturas (fecha, sensor, valor) VALUES (NOW(), :sensor, :valor)';
  $stmt = $pdo->prepare($sql);
  $stmt->execute([
    ':sensor' => $input['sensor'],
    ':valor'  => (float) $input['valor']
  ]);

  http_response_code(201);
  echo json_encode(['status' => 'ok', 'id' => $pdo->lastInsertId()]);
} catch (PDOException $e) {
  http_response_code(500);
  echo json_encode(['error' => 'Error de base de datos']);
}

4. Sketch Arduino

4.1 Conexión Wi-Fi y librerías

#include <WiFi.h>               // Para ESP32
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Reemplazar con credenciales propias
const char* ssid     = "TU_SSID";
const char* password = "TU_PASS";

const char* endpoint = "https://tudominio.com/api/insertar.php";
const char* token    = "TU_TOKEN_SIMPLE";  // Para autenticación básica

4.2 Función para enviar datos

void enviarLectura(const char* sensor, float valor) {
  HTTPClient http;
  http.begin(endpoint);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("X-Auth-Token", token);

  StaticJsonDocument<200> doc;
  doc["sensor"] = sensor;
  doc["valor"]  = valor;
  String payload;
  serializeJson(doc, payload);

  int code = http.POST(payload);
  if (code == HTTP_CODE_CREATED) {
    // Procesar respuesta JSON si se desea
    String respuesta = http.getString();
    Serial.println(respuesta);
  } else {
    Serial.printf("Error HTTP: %dn", code);
  }
  http.end();
}

4.3 Bucle principal

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("nConectado a Wi-Fi");
}

void loop() {
  float valorSensor = analogRead(34) * (3.3 / 4095.0);  // Ejemplo pin 34
  enviarLectura("temperatura", valorSensor);
  delay(60000);  // Esperar 1 minuto
}

5. Pruebas y depuración

  • Comprobar respuestas del servidor con Serial.println(respuesta);.
  • Verificar códigos HTTP distintos de 201 para detectar errores.
  • Probar el script PHP desde la consola:
    curl -X POST https://tudominio.com/api/insertar.php
    -H 'Content-Type: application/json'
    -d '{"sensor":"demo","valor":42.7}'

6. Recomendaciones de seguridad y escalabilidad

  • HTTPS: usar certificado Let’s Encrypt para cifrar la conexión.
  • Tokens: validar X-Auth-Token antes de procesar la petición.
  • CORS: configurar cabeceras si se accede desde varios orígenes.
  • Alternativa MQTT: para gran volumen de datos, emplear Mosquitto + Node-RED y almacenar en MySQL desde un backend.

Te puede interesar...

Placa de Circuito Impreso (PCB) Diseño y fabricación

Una vez diseñado el circuito que hará funcionar nuestro invento, prototipo o ejercicio, podemos pasar a diseñar la placa que lo va a contener The Printed Circuit Board, o la placa de circuito...

El bus I2C en Arduino

Esta tecnología desarrollada por Philips, actualmente abierta, permite conectar entre sí no solo placas sino también componentes individuales dentro de las mismas. Por ejemplo un microcontrolador con el regulador de carga de batería...

El microcontrolador

Un microcontrolador μC, UC o MCU) es un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria. Incluye en su interior las tres principales unidades funcionales de una computadora: unidad...

Conectar placa SIM GSM900 con Arduino

El módulo «GPRS Shield Arduino Uno» cuenta con un microcontrolador SIM900 en una placa de desarrollo, Al igual que el Arduino que es otra placa de desarrollo. Tener un dispositivo con una tarjeta...

La placa de desarrollo

Son PCB con componentes electrónicos que ayudan a hacer circuitos, prototipos, inventos o experimentos. Incluso productos vendidos comercialmente tienen una placa de desarrollo dentro, pues es más económico así que desarrollar una placa...

Proyectos:

guest
3 Comentarios
Más antiguo
Más nuevo Más votado
Inline Feedbacks
View all comments
xacarnaca
xacarnaca
2 years ago

Para realizar este tutorial y dejar al personal que empieza con arduino y transmisión de datos a medias, mejor no hacer nada ni llenar de basura internet, donde está el programa para arduino ide y su explicación para la placa ESP8266?.
Cambia el título página web o termina el tutorial, también se puede colocar un enlace. Sino la gente pierde el tiempo y se desanima.

Hue
Admin
Hue
2 years ago
Responder to  xacarnaca

Hola Xacarnaca. Se ha actualizado el tutorial, espero ahora te sirva. También está el link a github.

Guillermo
Guillermo
8 hours ago

Muy completo. Igual estaría bien añadir algún tip para depurar cuando falla la conexión HTTPS, que a mí me dio un poco de guerra.

GDPR