¿Alguna vez te has preguntado cómo puedes guardar datos de tus dispositivos ESP32/ESP8266 en una base de datos MySQL? En este artículo, te enseñaremos paso a paso cómo lograrlo utilizando PHP y Arduino IDE. ¡Sigue leyendo para descubrir cómo integrar tus datos de manera eficiente y segura!
En este proyecto, creará un cliente ESP32 o ESP8266 que envía una solicitud HTTP POST a un script PHP para insertar datos (valores del sensor) en una base de datos MySQL.
Actualizado el 26 de marzo de 2023
También obtiene una página web que muestra las lecturas del sensor, las marcas de tiempo y otra información de la base de datos. Podrás visualizar tus datos desde cualquier parte del mundo accediendo a tu propio servidor.
Como ejemplo usaremos un sensor BME280 conectado a una placa ESP32 o ESP8266. Puede modificar el código proporcionado para enviar lecturas desde otro sensor o utilizar varias placas.
Para crear y construir este proyecto, utilice estas tecnologías:
- ESP32 o ESP8266 programado con Arduino IDE
- Servidor de hosting y nombre de dominio
- Script PHP para insertar datos en MySQL y mostrarlos en una página web
- Base de datos MySQL para almacenar mediciones.
Tabla de contenido
El proyecto se divide en las siguientes secciones principales:
- Alojamiento de su aplicación PHP y base de datos MySQL
- Preparando su base de datos MySQL
- Script PHP HTTP POST: insertar datos en la base de datos MySQL
- Script PHP: muestra el contenido de la base de datos
- Configurando el ESP32 o ESP8266
1. Alojamiento de su aplicación PHP y base de datos MySQL
El objetivo de este proyecto es tener su propio nombre de dominio y cuenta de hosting que le permita almacenar los valores de los sensores del ESP32 o ESP8266. Podrás visualizar los valores desde cualquier parte del mundo accediendo a tu propio dominio de servidor. Aquí hay una descripción general de alto nivel:
Recomiendo utilizar uno de los siguientes servicios de hosting que pueden satisfacer todas las necesidades del proyecto:
- Bluehost (fácil de usar con cPanel): nombre de dominio gratis al comprar el plan de 3 años. Recomiendo la opción “Sitios ilimitados”;
- Océano digital: servidor Linux que administra desde una línea de comando. Recomiendo esta opción sólo para usuarios avanzados.
Estos son dos servicios que uso y recomiendo personalmente, pero puedes utilizar cualquier otro servicio de hosting. Cualquier servicio de hosting que ofrezca PHP y MySQL funcionará con este tutorial. Si no tiene una cuenta de alojamiento, le recomiendo registrarse en Bluehost.
Obtenga alojamiento y nombres de dominio en Bluehost »
Al comprar una cuenta de hosting, también necesitarás comprar un nombre de dominio. Esto es lo que hace que este proyecto sea interesante: puede ir a su nombre de dominio (https://example-domain.com) y ver los valores del sensor del ESP32 o ESP8266.
Si le gustan nuestros proyectos, puede considerar suscribirse a uno de los servicios de alojamiento recomendados, ya que esto le ayudará a respaldar nuestro trabajo.
Nota: También puedes ejecutar un servidor LAMP (Linux, Apache, MySQL, PHP) en una Raspberry Pi para acceder a los datos de tu red local. Sin embargo, el propósito de este tutorial es publicar métricas en su propio nombre de dominio al que pueda acceder desde cualquier parte del mundo. Esto le permite acceder fácilmente a sus lecturas de ESP sin depender de una plataforma IoT de terceros.
2. Preparando tu base de datos MySQL
Después de registrarse para obtener una cuenta de alojamiento y configurar un nombre de dominio, puede iniciar sesión en su cPanel o panel similar. Luego siga los siguientes pasos para crear su base de datos, nombre de usuario, contraseña y tabla SQL.
Creando una base de datos y un usuario
1. Escriba «base de datos» en la barra de búsqueda y seleccione «Asistente de base de datos MySQL».
2. Ingrese el nombre de la base de datos deseada. En mi caso el nombre de la base de datos es esp_data. Luego haga clic en el botón «Siguiente paso»:
Nota: luego debe usar el nombre de la base de datos con el prefijo que le proporciona su host (el prefijo de mi base de datos en la captura de pantalla anterior está borroso). lo usaré como Ejemplo_ESP_Data de aquí en adelante.
3. Ingrese el nombre de usuario de su base de datos y establezca una contraseña. Deberá guardar toda esta información, ya que la necesitará más adelante para crear una conexión a la base de datos utilizando su código PHP.
¡Eso es todo! Su nueva base de datos y usuario se han creado exitosamente. Ahora guarda toda tu información ya que la necesitarás más adelante:
- Nombre de la base de datos: Ejemplo_ESP_Data
- Nombre de usuario: Ejemplo_ESP_Board
- contraseña: Tu contraseña
Creando una tabla SQL
Después de crear su base de datos y su usuario, regrese al panel de cPanel y busque «phpMyAdmin».
Seleccione el nombre de su base de datos en la barra lateral izquierda Ejemplo_ESP_Data y abra la pestaña SQL.
Importante: Asegúrate de tener el Ejemplo_ESP_Data Base de datos. Luego haga clic en la pestaña SQL. Si no sigue estos pasos cuidadosamente y ejecuta la consulta SQL, puede crear una tabla en la base de datos incorrecta.
Copie la consulta SQL en el siguiente fragmento:
CREATE TABLE SensorData (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sensor VARCHAR(30) NOT NULL,
location VARCHAR(30) NOT NULL,
value1 VARCHAR(10),
value2 VARCHAR(10),
value3 VARCHAR(10),
reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
Péguelo en el cuadro de consulta SQL (resaltado por un rectángulo rojo) y haga clic en el botón Ir para crear su tabla:
Luego deberías ver tu tabla recién creada con el nombre Datos del sensor en el Ejemplo_ESP_Data Base de datos como se muestra en la siguiente figura:
3. Script PHP HTTP POST: insertar datos en la base de datos MySQL
En esta sección, crearemos un script PHP que se encarga de recibir solicitudes entrantes del ESP32 o ESP8266 e insertar los datos en una base de datos MySQL.
Si utiliza un proveedor de hosting con cPanel, puede buscar «administrador de archivos»:
Luego seleccione el público_html y haga clic en el botón “+Archivo” para crear uno nuevo .php Archivo.
Nota: Si está siguiendo este tutorial y no está familiarizado con PHP o MySQL, le recomiendo crear exactamente estos archivos. De lo contrario, deberá modificar el boceto ESP proporcionado con diferentes rutas URL.
Crear un nuevo archivo en /público_html con exactamente este nombre y esta extensión: post-esp-data.php
Edite el archivo recién creado (post-esp-data.php) y copie el siguiente extracto:
<?php
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
$servername = "localhost";
// REPLACE with your Database name
$dbname = "REPLACE_WITH_YOUR_DATABASE_NAME";
// REPLACE with Database user
$username = "REPLACE_WITH_YOUR_USERNAME";
// REPLACE with Database user password
$password = "REPLACE_WITH_YOUR_PASSWORD";
// Keep this API Key value to be compatible with the ESP32 code provided in the project page.
// If you change this value, the ESP32 sketch needs to match
$api_key_value = "tPmAT5Ab3j7F9";
$api_key= $sensor = $location = $value1 = $value2 = $value3 = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$api_key = test_input($_POST["api_key"]);
if($api_key == $api_key_value) {
$sensor = test_input($_POST["sensor"]);
$location = test_input($_POST["location"]);
$value1 = test_input($_POST["value1"]);
$value2 = test_input($_POST["value2"]);
$value3 = test_input($_POST["value3"]);
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO SensorData (sensor, location, value1, value2, value3)
VALUES ('" . $sensor . "', '" . $location . "', '" . $value1 . "', '" . $value2 . "', '" . $value3 . "')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}
else {
echo "Wrong API Key provided.";
}
}
else {
echo "No data posted with HTTP POST.";
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
Antes de guardar el archivo, debe $ nombre de base de datos, $nombre de usuario Y $contraseña Variables con sus datos individuales:
// Your Database name
$dbname = "example_esp_data";
// Your Database user
$username = "example_esp_board";
// Your Database user password
$password = "YOUR_USER_PASSWORD";
Después de agregar el nombre de la base de datos, el nombre de usuario y la contraseña, guarde el archivo y continúe con este tutorial. Cuando intentas acceder a tu nombre de dominio en la siguiente ruta URL, obtienes lo siguiente:
https://example-domain.com/post-esp-data.php
4. Script PHP: muestra el contenido de la base de datos
Crea otro archivo PHP en /público_html Directorio en el que se muestra todo el contenido de la base de datos en una página web. Nombra tu nuevo archivo: esp-data.php
Edite el archivo recién creado (esp-data.php) y copie el siguiente código:
<!DOCTYPE html>
<html><body>
<?php
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
$servername = "localhost";
// REPLACE with your Database name
$dbname = "REPLACE_WITH_YOUR_DATABASE_NAME";
// REPLACE with Database user
$username = "REPLACE_WITH_YOUR_USERNAME";
// REPLACE with Database user password
$password = "REPLACE_WITH_YOUR_PASSWORD";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, sensor, location, value1, value2, value3, reading_time FROM SensorData ORDER BY id DESC";
echo '<table cellspacing="5" cellpadding="5">
<tr>
<td>ID</td>
<td>Sensor</td>
<td>Location</td>
<td>Value 1</td>
<td>Value 2</td>
<td>Value 3</td>
<td>Timestamp</td>
</tr>';
if ($result = $conn->query($sql)) {
while ($row = $result->fetch_assoc()) {
$row_id = $row["id"];
$row_sensor = $row["sensor"];
$row_location = $row["location"];
$row_value1 = $row["value1"];
$row_value2 = $row["value2"];
$row_value3 = $row["value3"];
$row_reading_time = $row["reading_time"];
// Uncomment to set timezone to - 1 hour (you can change 1 to any number)
//$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time - 1 hours"));
// Uncomment to set timezone to + 4 hours (you can change 4 to any number)
//$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time + 4 hours"));
echo '<tr>
<td>' . $row_id . '</td>
<td>' . $row_sensor . '</td>
<td>' . $row_location . '</td>
<td>' . $row_value1 . '</td>
<td>' . $row_value2 . '</td>
<td>' . $row_value3 . '</td>
<td>' . $row_reading_time . '</td>
</tr>';
}
$result->free();
}
$conn->close();
?>
</table>
</body>
</html>
Después de agregar el $ nombre de base de datos, $nombre de usuario, Y $contraseña Guarde el archivo y continúe con este proyecto.
// Your Database name
$dbname = "example_esp_data";
// Your Database user
$username = "example_esp_board";
// Your Database user password
$password = "YOUR_USER_PASSWORD";
Si intenta acceder a su nombre de dominio en la siguiente ruta URL, verá lo siguiente:
https://example-domain.com/esp-data.php
¡Eso es todo! Si ve la tabla vacía en su navegador, significa que todo está listo. En la siguiente sección aprenderá cómo insertar datos de su ESP32 o ESP8266 en la base de datos.
5. Configurando el ESP32 o ESP8266
Este proyecto es compatible con placas ESP32 y ESP8266. Todo lo que necesita hacer es ensamblar un circuito simple y cargar el boceto proporcionado para agregar temperatura, humedad, presión y más a su base de datos cada 30 segundos. El boceto es ligeramente diferente para cada tablero.
Piezas requeridas
Para este ejemplo, obtenemos los valores del sensor BME280. Aquí hay una lista de las piezas que necesitará para construir el circuito para este proyecto:
- placa ESP32 (leer Las mejores placas de desarrollo ESP32)
- Alternativa – ESP8266 Brett (leer Las mejores placas de desarrollo ESP8266)
- Sensor BME280
- Cables de puente
- tablero de circuitos
Puedes utilizar los enlaces anteriores o ir directamente MakerAdvisor.com/tools ¡Para encontrar todas las piezas para tus proyectos al mejor precio!
Esquema
El módulo de sensor BME280 que utilizamos se comunica a través del protocolo de comunicación I2C, por lo que debe conectarlo a los pines I2C del ESP32 o ESP8266.
Cableado BME280 con ESP32
Los pines ESP32 I2C son:
- GPIO 22: SCL (SCK)
- GPIO 21: SDA (IDE)
Así que monte su circuito como se muestra en el siguiente diagrama de circuito (lea las instrucciones completas para ESP32 con BME280).
Recomendaciones de literatura: Guía de referencia de asignación de pines ESP32
Cableado BME280 con ESP8266
Los pines ESP8266 I2C son:
- GPIO5 (D1): SCL (SCK)
- GPIO4 (D2): SDA (SDI)
Ensamble su circuito como en el siguiente esquema si está utilizando una placa ESP8266 (lea las instrucciones completas para ESP8266 con BME280).
Recomendaciones de literatura: Guía de referencia de distribución de pines ESP8266
Instalación de bibliotecas
Programamos el ESP32/ESP8266 usando Arduino IDE, por lo que el complemento ESP32/ESP8266 debe estar instalado en su Arduino IDE. Dependiendo de la placa que estés utilizando, sigue uno de los siguientes tutoriales:
- Instale la placa ESP32 en el IDE de Arduino. También necesita instalar la biblioteca BME280 y la biblioteca Adafruit_Sensor.
- Instale la placa ESP8266 en Arduino IDE: también necesita instalar la biblioteca BME280 y la biblioteca Adafruit_Sensor
código ESP32
Siga esta sección si está utilizando un ESP32. Para un ESP8266 haga clic aquí.
Después de instalar las bibliotecas y complementos de la placa necesarios, copie el siguiente código en su IDE de Arduino, pero no lo cargue todavía. Deberá realizar algunos cambios para que funcione para usted.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// REPLACE with your Domain name and URL path or IP address with path
const char* serverName = "https://example.com/post-esp-data.php";
// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /post-esp-data.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";
String sensorName = "BME280";
String sensorLocation = "Office";
/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, 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());
// (you can also pass in a Wire library object like &Wire2)
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
while (1);
}
}
void loop() {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
WiFiClientSecure *client = new WiFiClientSecure;
client->setInsecure(); //don't use SSL certificate
HTTPClient https;
// Your Domain name with URL path or IP address with path
https.begin(*client, serverName);
// Specify content-type header
https.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
+ "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
// You can comment the httpRequestData variable above
// then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
//String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";
// Send HTTP POST request
int httpResponseCode = https.POST(httpRequestData);
// If you need an HTTP request with a content type: text/plain
//https.addHeader("Content-Type", "text/plain");
//int httpResponseCode = https.POST("Hello, World!");
// If you need an HTTP request with a content type: application/json, use the following:
//https.addHeader("Content-Type", "application/json");
//int httpResponseCode = https.POST("{"value1":"19","value2":"67","value3":"78"}");
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
https.end();
}
else {
Serial.println("WiFi Disconnected");
}
//Send an HTTP POST request every 30 seconds
delay(30000);
}
Configuración de sus credenciales de red
Debe cambiar las siguientes líneas con sus credenciales de red: SSID y Contraseña. El código contiene comentarios detallados sobre dónde debe realizar los cambios.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Configurando el nombre de su servidor
También deberá ingresar su nombre de dominio para que ESP publique las métricas en su propio servidor.
const char* serverName = "https://example-domain.com/post-esp-data.php";
Ahora puedes subir el código a tu tablero.
Nota: La mayoría de los servidores requieren solicitudes HTTPS. El código anterior garantiza que las solicitudes HTTPS cumplan con los requisitos de la mayoría de los servidores en la nube actuales.
¿Su servidor no soporta HTTPS? Utilice este código en su lugar.
Si desea aprender cómo funciona el código, lea la siguiente sección.
Así es como funciona el código
Dado que este proyecto ya es bastante extenso, no entraremos en detalles sobre cómo funciona el código. Sin embargo, aquí hay un breve resumen:
- Importe todas las bibliotecas para que funcione.
- Establezca las variables que quizás desee cambiar (Valor de clave API, Nombre del sensor, Ubicación del sensor);
- El Valor de clave API es solo una cadena aleatoria que puedes cambiar. Se utiliza por razones de seguridad para que sólo alguien que conozca su clave API pueda publicar datos en su base de datos;
- Inicialice las comunicaciones en serie para fines de depuración.
- Conéctese a su enrutador a través de Wi-Fi;
- Inicialice el BME280 para obtener lecturas.
- Inicialice un cliente WiFi seguro.
Entonces, en Cinta() Aquí realiza la solicitud HTTP POST cada 30 segundos con las últimas lecturas de BME280:
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature()) + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
int httpResponseCode = http.POST(httpRequestData);
Puedes comentar sobre el httpSolicitudDatos Variable anterior que vincula todas las lecturas del BME280 y utiliza el httpSolicitudDatos Variable a continuación para fines de prueba:
String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";
Obtenga más información sobre las solicitudes HTTPS con ESP32: Solicitudes HTTPS ESP32 (Arduino IDE).
código ESP8266
Siga esta sección si está utilizando un ESP8266. Para obtener información sobre un ESP32, consulte la sección anterior..
Después de instalar las bibliotecas y complementos de la placa necesarios, copie el siguiente código en su IDE de Arduino, pero no lo cargue todavía. Deberá realizar algunos cambios para que funcione para usted.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// REPLACE with your Domain name and URL path or IP address with path
const char* serverName = "https://example.com/post-esp-data.php";
// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /post-esp-data.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";
String sensorName = "BME280";
String sensorLocation = "Office";
/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, 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());
// (you can also pass in a Wire library object like &Wire2)
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
while (1);
}
}
void loop() {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
// Ignore SSL certificate validation
client->setInsecure();
//create an HTTPClient instance
HTTPClient https;
// Your Domain name with URL path or IP address with path
https.begin(*client, serverName);
// Specify content-type header
https.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
+ "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
// You can comment the httpRequestData variable above
// then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
//String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";
// Send HTTP POST request
int httpResponseCode = https.POST(httpRequestData);
// If you need an HTTP request with a content type: text/plain
//http.addHeader("Content-Type", "text/plain");
//int httpResponseCode = https.POST("Hello, World!");
// If you need an HTTP request with a content type: application/json, use the following:
//http.addHeader("Content-Type", "application/json");
//int httpResponseCode = https.POST("{"value1":"19","value2":"67","value3":"78"}");
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
https.end();
}
else {
Serial.println("WiFi Disconnected");
}
//Send an HTTP POST request every 30 seconds
delay(30000);
}
Configuración de sus credenciales de red
Debe cambiar las siguientes líneas con sus credenciales de red: SSID y Contraseña. El código contiene comentarios detallados sobre dónde debe realizar los cambios.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Configurando el nombre de su servidor
También deberá ingresar su nombre de dominio para que ESP publique las métricas en su propio servidor.
const char* serverName = "https://example-domain.com/post-esp-data.php";
Ahora puedes subir el código a tu tablero.
Nota: La mayoría de los servidores requieren solicitudes HTTPS. El código anterior garantiza que las solicitudes HTTPS cumplan con los requisitos de la mayoría de los servidores en la nube actuales.
¿Su servidor no soporta HTTPS? Utilice este código en su lugar.
Obtenga más información sobre las solicitudes HTTPS con ESP8266: Solicitudes HTTPS ESP8266 NodeMCU (Arduino IDE).
demostración
Después de completar todos los pasos, deje que su placa ESP recopile algunas métricas y las publique en su servidor.
Si todo está correcto, deberías ver lo siguiente en tu Arduino IDE Serial Monitor:
Si abre su nombre de dominio en esta ruta URL:
https://example-domain.com/esp-data.php
Debería ver todas las métricas almacenadas en su base de datos. Actualice la página web para ver las métricas más recientes:
También puedes ir a phpMyAdmin para ver el en tu Datos del sensor Tabla. Puedes borrarlos, editarlos, etc.
Envolver
En este tutorial, aprendió cómo publicar datos de sensores en una base de datos en su propio dominio de servidor al que puede acceder desde cualquier parte del mundo. Para hacer esto necesitas tu propio servidor y nombre de dominio (para acceso local puedes usar una Raspberry Pi).
El ejemplo proporcionado es lo más simple posible para ayudarlo a comprender cómo funciona todo. Después de comprender este ejemplo, puede cambiar la apariencia de la tabla, publicar diferentes valores de sensores, publicar desde múltiples placas ESP y más.
Usted también puede estar interesado en:
- Visualiza los valores de tus sensores desde cualquier parte del mundo (ESP32/ESP8266 + MySQL + PHP)
- Estación meteorológica en la nube de bricolaje con ESP32/ESP8266 (base de datos MySQL y PHP)
- ESP32 publica valores de sensores en Google Sheets (compatible con ESP8266)
Obtenga más información sobre el ESP32 con nuestros recursos:
- Aprenda ESP32 con Arduino IDE
- Construya servidores web con ESP32 y ESP8266
- Aplicación web Firebase con ESP32 y ESP8266
- HOGAR INTELIGENTE con Raspberry Pi, ESP32 y ESP8266
- Proyectos y tutoriales ESP32 gratuitos…
Gracias por leer.
Inserción de datos ESP32/ESP8266 en la base de datos MySQL usando PHP y Arduino IDE
En este proyecto, construirás un cliente ESP32 o ESP8266 que realiza una solicitud HTTP POST a un script PHP para insertar datos (lecturas de sensores) en una base de datos MySQL.
Actualizado el 26 de marzo de 2023
También tendrás una página web que muestra las lecturas del sensor, marcas de tiempo y otra información de la base de datos. Podrás visualizar tus datos desde cualquier lugar del mundo accediendo a tu propio servidor.
Como ejemplo, utilizaremos un sensor BME280 conectado a una placa ESP32 o ESP8266. Puedes modificar el código proporcionado para enviar lecturas de un sensor diferente o usar múltiples placas.
Para crear y construir este proyecto, utilizarás las siguientes tecnologías:
– ESP32 o ESP8266 programado con Arduino IDE
– Servidor de hosting y nombre de dominio
– Script PHP para insertar datos en MySQL y mostrarlos en una página web
– Base de datos MySQL para almacenar las lecturas
Tabla de contenidos:
El proyecto se divide en las siguientes secciones principales:
1. Alojamiento de tu aplicación PHP y base de datos MySQL
2. Preparación de tu base de datos MySQL
3. Script PHP HTTP POST – Insertar datos en la base de datos MySQL
4. Script PHP – Mostrar el contenido de la base de datos
5. Configuración del ESP32 o ESP8266
1. Alojamiento de tu aplicación PHP y base de datos MySQL
El objetivo de este proyecto es tener tu propio nombre de dominio y cuenta de hosting que te permita almacenar lecturas de sensores desde ESP32 o ESP8266. Puedes visualizar las lecturas desde cualquier lugar del mundo accediendo a tu propio dominio. Aquí tienes un resumen general:
Recomiendo utilizar uno de los siguientes servicios de hosting que puede manejar todos los requisitos del proyecto:
– Bluehost (fácil de usar con cPanel): nombre de dominio gratuito al registrarte en el plan de 3 años. Recomiendo elegir la opción de sitios web ilimitados.
– Digital Ocean: servidor Linux que administra a través de una línea de comandos. Solo recomiendo esta opción para usuarios avanzados.
Si no tienes una cuenta de hosting, te recomiendo registrarte en Bluehost.
Obtén Hosting y Nombre de Dominio con Bluehost
Al comprar una cuenta de hosting, también tendrás que adquirir un nombre de dominio. Esto es lo que hace interesante este proyecto: podrás ir a tu nombre de dominio (https://ejemplo-dominio.com) y ver las lecturas del sensor desde ESP32 o ESP8266.
Si te gustan nuestros proyectos, podrías considerar registrarte en uno de los servicios de hosting recomendados, ya que estarás apoyando nuestro trabajo.
Nota: también puedes ejecutar un servidor LAMP (Linux, Apache, MySQL, PHP) en una Raspberry Pi para acceder a los datos en tu red local. Sin embargo, el propósito de este tutorial es publicar lecturas en tu propio nombre de dominio al que puedes acceder desde cualquier lugar del mundo. Esto te permite acceder fácilmente a las lecturas de ESP sin depender de una plataforma IoT de terceros.
2. Preparación de tu base de datos MySQL
Después de registrarte en una cuenta de hosting y configurar un nombre de dominio, puedes iniciar sesión en tu cPanel o panel de control similar. Luego, sigue los siguientes pasos para crear tu base de datos, usuario, contraseña y tabla SQL.
Crear una base de datos y un usuario
1. Escribe «base de datos» en la barra de búsqueda y selecciona «Asistente de base de datos MySQL».
2. Ingresa el nombre de la base de datos deseado. En mi caso, el nombre de la base de datos es esp_data. Luego, presiona el botón «Siguiente paso».
Nota: más adelante deberás usar el nombre de la base de datos con el prefijo que te da tu host (mi prefijo de base de datos en la captura de pantalla anterior está borroso). Lo llamaré ejemplo_esp_data a partir de ahora.
3. Escribe tu nombre de usuario de la base de datos y establece una contraseña. Debes guardar todos esos detalles, ya que los necesitarás más adelante para establecer una conexión de base de datos con tu código PHP.
¡Eso es todo! Tu nueva base de datos y usuario se han creado correctamente. Ahora, guarda todos tus detalles, ya que los necesitarás más adelante:
Nombre de la base de datos: ejemplo_esp_data
Usuario: ejemplo_esp_board
Contraseña: tu contraseña
Crear una tabla SQL
Después de crear tu base de datos y usuario, vuelve al panel de cPanel y busca «phpMyAdmin».
En la barra lateral izquierda, selecciona el nombre de tu base de datos ejemplo_esp_data y abre la pestaña «SQL».
Importante: asegúrate de haber abierto la base de datos example_esp_data. Luego, haz clic en la pestaña SQL. Si no sigues estos pasos exactamente y ejecutas la consulta SQL, podrías crear una tabla en la base de datos incorrecta.
Copia la consulta SQL en el siguiente fragmento:
CREATE TABLE SensorData (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sensor VARCHAR(30) NOT NULL,
location VARCHAR(30) NOT NULL,
value1 VARCHAR(10),
value2 VARCHAR(10),
value3 VARCHAR(10),
reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
Pégala en el campo de consulta SQL (destacado con un rectángulo rojo) y presiona el botón «Ejecutar» para crear tu tabla:
Luego, deberías ver tu tabla recién creada llamada SensorData en la base de datos ejemplo_esp_data, como se muestra en la siguiente imagen:
3. Script PHP HTTP POST – Insertar datos en la base de datos MySQL
En esta sección, vamos a crear un script PHP que se encarga de recibir las solicitudes entrantes de ESP32 o ESP8266 e insertar los datos en una base de datos MySQL.
Si estás utilizando un proveedor de hosting con cPanel, puedes buscar «Administrador de archivos»:
Luego, selecciona la opción public_html y haz clic en el botón «+ Archivo» para crear un nuevo archivo .php.
Nota: si estás siguiendo este tutorial y no estás familiarizado con PHP o MySQL, te recomiendo crear estos archivos exactos. De lo contrario, deberás modificar el esquema ESP proporcionado con diferentes rutas URL.
Crea un nuevo archivo en /public_html con este nombre y extensión exactos: post-esp-data.php
Edita el archivo recién creado (post-esp-data.php) y copia el siguiente fragmento:
connect_error) {
die(«Fallo de conexión: » . $conn->connect_error);
}
$sql = «INSERT INTO SensorData (sensor, location, value1, value2, value3)
VALUES (‘» . $sensor . «‘, ‘» . $location . «‘, ‘» . $value1 . «‘, ‘» . $value2 . «‘, ‘» . $value3 . «‘)»;
if ($conn->query($sql) === TRUE) {
echo «Nuevo registro creado exitosamente»;
}
else {
echo «Error: » . $sql . «
» . $conn->error;
}
$conn->close();
}
else {
echo «Se proporcionó una clave API incorrecta.»;
}
}
else {
echo «No se ha enviado ningún dato con la solicitud HTTP POST.»;
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Antes de guardar el archivo, debes modificar las variables $dbname, $username y $password con tus detalles únicos:
// Tu nombre de base de datos
$dbname = «ejemplo_esp_data»;
// Tu usuario de base de datos
$username = «ejemplo_esp_board»;
// Tu contraseña de usuario de base de datos
$password = «TU_CONTRASEÑA_DE_USUARIO»;
Después de agregar el nombre de la base de datos, el nombre de usuario y la contraseña, guarda el archivo y continúa con este tutorial. Si intentas acceder a tu nombre de dominio en la siguiente ruta URL, verás lo siguiente:
https://ejemplo-dominio.com/post-esp-data.php
4. Script PHP – Mostrar el contenido de la base de datos
Crea otro archivo PHP en el directorio /public_html que mostrará todo el contenido de la base de datos en una página web. Nombre tu nuevo archivo: esp-data.php
Edita el archivo recién creado (esp-data.php) y copia el siguiente código:
connect_error) {
die(«Fallo de conexión: » . $conn->connect_error);
}
$sql = «SELECT id, sensor, location, value1, value2, value3, reading_time FROM SensorData ORDER BY id DESC»;
echo ‘
‘;
if ($result = $conn->query($sql)) {
while ($row = $result->fetch_assoc()) {
$row_id = $row[«id»];
$row_sensor = $row[«sensor»];
$row_location = $row[«location»];
$row_value1 = $row[«value1»];
$row_value2 = $row[«value2»];
$row_value3 = $row[«value3»];
$row_reading_time = $row[«reading_time»];
echo ‘
‘;
}
$result->free();
}
$conn->close();
?>
ID | Sensor | Location | Value 1 | Value 2 | Value 3 | Timestamp |
‘ . $row_id . ‘ | ‘ . $row_sensor . ‘ | ‘ . $row_location . ‘ | ‘ . $row_value1 . ‘ | ‘ . $row_value2 . ‘ | ‘ . $row_value3 . ‘ | ‘ . $row_reading_time . ‘ |
Después de agregar el $dbname, $username y $password, guarda el archivo y continúa con este proyecto.
// Tu nombre de base de datos
$dbname = «ejemplo_esp_data»;
// Tu usuario de base de datos
$username = «ejemplo_esp_board»;
// Tu contraseña de usuario de base de datos
$password = «TU_CONTRASEÑA_DE_USUARIO»;
Si intentas acceder a tu nombre de dominio en la siguiente ruta URL, verás lo siguiente:
https://ejemplo-dominio.com/esp-data.php
¡Eso es todo! Si ves esa tabla vacía impresa en tu navegador, significa que todo está listo. En la siguiente sección, aprenderás cómo insertar datos desde tu ESP32 o ESP8266 en la base de datos.
5. Configuración del ESP32 o ESP8266
Este proyecto es compatible con las placas ESP32 y ESP8266. Solo necesitas ensamblar un circuito sencillo y cargar el boceto proporcionado para insertar temperatura, humedad, presión y más en tu base de datos cada 30 segundos. El boceto es ligeramente diferente para cada placa.
Piezas necesarias:
Para este ejemplo, obtendremos lecturas de sensores del sensor BME280. Aquí tienes una lista de las partes que necesitas para construir el circuito de este proyecto:
– Placa ESP32 (lee los mejores tableros de desarrollo ESP32)
– Alternativa: placa ESP8266 (lee los mejores tableros de desarrollo ESP8266)
– Sensor BME280
– Cables puente
– Protoboard
Esquemáticos:
El módulo del sensor BME280 con el que estamos trabajando se comunica a través del protocolo de comunicación I2C, por lo que debes conectarlo a los pines I2C del ESP32 o ESP8266.
Conexión del BME280 al ESP32:
Los pines I2C del ESP32 son:
– GPIO 22: SCL (SCK)
– GPIO 21: SDA (SDI)
Por lo tanto, ensambla tu circuito como se muestra en el diagrama esquemático siguiente (lee la guía completa para ESP32 con BME280).
Referencia de clavijas ESP32
Conexión del BME280 al ESP8266:
Los pines I2C del ESP8266 son:
– GPIO 5 (D1): SCL (SCK)
– GPIO 4 (D2): SDA (SDI)
Ensambla tu circuito según el diagrama esquemático siguiente si estás utilizando una placa ESP8266 (lee la guía completa para ESP8266 con BME280).
Referencia de clavijas ESP8266
Instalación de bibliotecas:
Programaremos el ESP32/ESP8266 usando Arduino IDE, por lo que debes tener el complemento ESP32/ESP8266 instalado en tu Arduino IDE. Sigue uno de los siguientes tutoriales dependiendo de la placa que estés utilizando:
– Instalar la Placa ESP32 en Arduino IDE: también debes instalar la biblioteca BME280 y la biblioteca Adafruit_Sensor
– Instalar la Placa ESP8266 en Arduino IDE: también debes instalar la biblioteca BME280 y la biblioteca Adafruit_Sensor
Código ESP32:
Sigue esta sección si estás utilizando un ESP32. Para un ESP8266, haz clic aquí.
Después de instalar los complementos y bibliotecas necesarios, copia el siguiente código a tu Arduino IDE, pero no lo cargues todavía. Debes hacer algunos cambios para que funcione para ti.
Este código enviará las lecturas BME280 más recientes mediante una solicitud HTTP POST cada 30 segundos:
Ingresa las credenciales de tu red en las líneas correspondientes del código:
const char* ssid = «REEMPLAZA_CON_TU_SSID»;
const char* password = «REEMPLAZA_CON_TU_CONTRASEÑA»;
También debes configurar el nombre de tu servidor para que la ESP envíe las lecturas a tu propio servidor:
const char* serverName = «https://ejemplo.com/post-esp-data.php»;
Ahora, puedes cargar el código en tu placa.
¡Eso es todo! Si tienes éxito, deberías ver los datos del sensor almacenados en tu base de datos.
Código ESP8266:
Sigue esta sección si estás utilizando un ESP8266. Para un ESP32, revisa la sección anterior.
Después de instalar los complementos y bibliotecas necesarios, copia el siguiente código a tu Arduino IDE, pero no lo cargues todavía. Debes hacer algunos cambios para que funcione para ti.
Este código enviará las lecturas BME280 más recientes mediante una solicitud HTTP POST cada 30 segundos:
Ingresa las credenciales de tu red en las líneas correspondientes del código:
const char* ssid =
¡Interesante forma de integrar tecnologías para la recolección de datos! Me encantaría probarlo en un proyecto propio. ¡Gracias por compartir!
¡Increíble tutorial! Definitivamente voy a intentarlo en mi próximo proyecto. ¡Gracias por las instrucciones claras y concisas!