¿Quieres tener tu propia estación meteorológica en la nube? En este artículo te enseñaremos cómo construir una estación meteorológica de bricolaje utilizando ESP32 o ESP8266, y cómo conectarla a una base de datos MySQL y PHP. ¡Descubre cómo puedes monitorear y analizar datos meteorológicos desde la comodidad de tu hogar con este proyecto de alta tecnología!
Cree un panel de estación meteorológica en la nube para visualizar las lecturas de sus sensores ESP32 o ESP8266 desde cualquier parte del mundo. Visualiza los datos de tus sensores en dispositivos de medición y en una tabla. ESP32 o ESP8266 envía una solicitud HTTP POST a un script PHP para insertar sus datos en una base de datos MySQL.
Actualizado el 27 de marzo de 2023
Hasta ahora hemos almacenado los valores de los sensores en una base de datos y los hemos mostrado en tablas o gráficos a los que puede acceder desde cualquier lugar a través de su propio servidor. Ahora he decidido dar unos pasos más y agregar más información al sitio web.
Agregué dos medidores para mostrar las últimas lecturas de temperatura y humedad, así como algunas estadísticas sobre los valores mínimo, máximo y promedio de una serie de valores que usted define. También puede visualizar todos los valores más recientes en una tabla y elegir cuántos valores desea mostrar.
Para crear este proyecto utilizarás 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: recibir datos e insertarlos en la base de datos MySQL
- Script PHP para funciones de base de datos
- Script PHP: muestra los valores de la base de datos en medidores y en tablas
- Configurando el ESP32 o ESP8266
Mira el vídeo de demostración
Para ver cómo funciona el proyecto, puedes ver el siguiente vídeo demostrativo:
0. Descargar el código fuente
Para este proyecto necesitará estos archivos:
- Consulta SQL para crear su tabla: SensorData_Table.sql
- Insertar y acceder a los valores de la base de datos: esp-base de datos.php
- Procesamiento de solicitudes de publicación HTTP: esp-post-data.php
- Archivo CSS para diseñar su sitio web: estilo-esp.css
- Vea las lecturas de sus sensores: esp-wetterstation.php
- Bosquejo de Arduino para ESP32: HTTPS_ESP32_Cloud_Weather_Station.ino
- Bosquejo de Arduino para ESP8266: HTTPS_ESP8266_Cloud_Weather_Station.ino
- Si su servidor no admite HTTPS, use este Arduino Sketch (compatible con ESP32 y ESP8266): ESP_HTTP_POST_MySQL.ino
- Descargar todos los archivos del proyecto
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 cómo funciona el proyecto:
- Tienes un ESP32 o ESP8266 enviando valores de sensores a tu propio servidor. Para hacer esto, necesita conectar su placa a su enrutador.
- Hay un script PHP en su servidor que le permite guardar sus métricas en una base de datos MySQL.
- Luego, otro script PHP muestra la página web con los anuncios, la tabla y toda la demás información.
- Finalmente, podrás visualizar las métricas desde cualquier parte del mundo accediendo a tu propio nombre de dominio.
Servicios de alojamiento
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 »
Cuando compras una cuenta de hosting, también necesitas comprar un nombre de dominio. Esto es lo que hace que este proyecto sea interesante: puede ir a su nombre de dominio (https://example.com) y ver sus valores de ESP.
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
Abre el «Progresivo«Pestaña»:
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: recibir datos e insertarlos 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: esp-post-data.php
Edite el archivo recién creado (esp-post-data.php) y copie el siguiente extracto:
<!--
Rui Santos
Complete project details at https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/
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.
-->
<?php
include_once('esp-database.php');
// Keep this API Key value to be compatible with the ESP code provided in the project page. If you change this value, the ESP 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"]);
$result = insertReading($sensor, $location, $value1, $value2, $value3);
echo $result;
}
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;
}
4. Script PHP para funciones de base de datos
Crear un nuevo archivo en /público_html que se encarga de insertar y acceder a los datos en su base de datos. Nombra tu archivo: esp-base de datos.php
Copie el script PHP:
<!--
Rui Santos
Complete project details at https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/
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.
-->
<?php
$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";
function insertReading($sensor, $location, $value1, $value2, $value3) {
global $servername, $username, $password, $dbname;
// 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) {
return "New record created successfully";
}
else {
return "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}
function getAllReadings($limit) {
global $servername, $username, $password, $dbname;
// 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 reading_time desc limit " . $limit;
if ($result = $conn->query($sql)) {
return $result;
}
else {
return false;
}
$conn->close();
}
function getLastReadings() {
global $servername, $username, $password, $dbname;
// 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 reading_time desc limit 1" ;
if ($result = $conn->query($sql)) {
return $result->fetch_assoc();
}
else {
return false;
}
$conn->close();
}
function minReading($limit, $value) {
global $servername, $username, $password, $dbname;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT MIN(" . $value . ") AS min_amount FROM (SELECT " . $value . " FROM SensorData order by reading_time desc limit " . $limit . ") AS min";
if ($result = $conn->query($sql)) {
return $result->fetch_assoc();
}
else {
return false;
}
$conn->close();
}
function maxReading($limit, $value) {
global $servername, $username, $password, $dbname;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT MAX(" . $value . ") AS max_amount FROM (SELECT " . $value . " FROM SensorData order by reading_time desc limit " . $limit . ") AS max";
if ($result = $conn->query($sql)) {
return $result->fetch_assoc();
}
else {
return false;
}
$conn->close();
}
function avgReading($limit, $value) {
global $servername, $username, $password, $dbname;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT AVG(" . $value . ") AS avg_amount FROM (SELECT " . $value . " FROM SensorData order by reading_time desc limit " . $limit . ") AS avg";
if ($result = $conn->query($sql)) {
return $result->fetch_assoc();
}
else {
return false;
}
$conn->close();
}
?>
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.com/esp-post-data.php
5. Script PHP: muestra los valores de la base de datos en medidores y en tablas
También necesitarás agregar un archivo CSS para darle estilo a tu panel. Nómbralos: estilo-esp.css:
Copie este CSS a su archivo y guárdelo:
/**
Rui Santos
Complete project details at https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/
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.
**/
body {
width: 60%;
margin: auto;
text-align: center;
font-family: Arial;
top: 50%;
left: 50%;
}
@media screen and (max-width: 800px) {
body {
width: 100%;
}
}
table {
margin-left: auto;
margin-right: auto;
}
div {
margin-left: auto;
margin-right: auto;
}
h2 { font-size: 2.5rem; }
.header {
padding: 1rem;
margin: 0 0 2rem 0;
background: #f2f2f2;
}
h1 {
font-size: 2rem;
font-family: Arial, sans-serif;
text-align: center;
text-transform: uppercase;
}
.content {
display: flex;
}
@media screen and (max-width: 500px) /* Mobile */ {
.content {
flex-direction: column;
}
}
.mask {
position: relative;
overflow: hidden;
display: block;
width: 12.5rem;
height: 6.25rem;
margin: 1.25rem;
}
.semi-circle {
position: relative;
display: block;
width: 12.5rem;
height: 6.25rem;
background: linear-gradient(to right, #3498db 0%, #05b027 33%, #f1c40f 70%, #c0392b 100%);
border-radius: 50% 50% 50% 50% / 100% 100% 0% 0%;
}
.semi-circle::before {
content: "";
position: absolute;
bottom: 0;
left: 50%;
z-index: 2;
display: block;
width: 8.75rem;
height: 4.375rem;
margin-left: -4.375rem;
background: #fff;
border-radius: 50% 50% 50% 50% / 100% 100% 0% 0%;
}
.semi-circle--mask {
position: absolute;
top: 0;
left: 0;
width: 12.5rem;
height: 12.5rem;
background: transparent;
transform: rotate(120deg) translate3d(0, 0, 0);
transform-origin: center center;
backface-visibility: hidden;
transition: all 0.3s ease-in-out;
}
.semi-circle--mask::before {
content: "";
position: absolute;
top: 0;
left: 0%;
z-index: 2;
display: block;
width: 12.625rem;
height: 6.375rem;
margin: -1px 0 0 -1px;
background: #f2f2f2;
border-radius: 50% 50% 50% 50% / 100% 100% 0% 0%;
}
.gauge--2 .semi-circle { background: #3498db; }
.gauge--2 .semi-circle--mask { transform: rotate(20deg) translate3d(0, 0, 0); }
#tableReadings { border-collapse: collapse; }
#tableReadings td, #tableReadings th {
border: 1px solid #ddd;
padding: 10px;
}
#tableReadings tr:nth-child(even){ background-color: #f2f2f2; }
#tableReadings tr:hover { background-color: #ddd; }
#tableReadings th {
padding: 10px;
background-color: #2f4468;
color: white;
}
Finalmente, cree 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-wetterstation.php
Edite el archivo recién creado (esp-wetterstation.php) y copie el siguiente código:
<!--
Rui Santos
Complete project details at https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/
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.
-->
<?php
include_once('esp-database.php');
if (isset($_GET["readingsCount"])){
$data = $_GET["readingsCount"];
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
$readings_count = $_GET["readingsCount"];
}
// default readings count set to 20
else {
$readings_count = 20;
}
$last_reading = getLastReadings();
$last_reading_temp = $last_reading["value1"];
$last_reading_humi = $last_reading["value2"];
$last_reading_time = $last_reading["reading_time"];
// Uncomment to set timezone to - 1 hour (you can change 1 to any number)
//$last_reading_time = date("Y-m-d H:i:s", strtotime("$last_reading_time - 1 hours"));
// Uncomment to set timezone to + 7 hours (you can change 7 to any number)
//$last_reading_time = date("Y-m-d H:i:s", strtotime("$last_reading_time + 7 hours"));
$min_temp = minReading($readings_count, 'value1');
$max_temp = maxReading($readings_count, 'value1');
$avg_temp = avgReading($readings_count, 'value1');
$min_humi = minReading($readings_count, 'value2');
$max_humi = maxReading($readings_count, 'value2');
$avg_humi = avgReading($readings_count, 'value2');
?>
<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="esp-style.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<header class="header">
<h1>📊 ESP Weather Station</h1>
<form method="get">
<input type="number" name="readingsCount" min="1" placeholder="Number of readings (<?php echo $readings_count; ?>)">
<input type="submit" value="UPDATE">
</form>
</header>
<body>
<p>Last reading: <?php echo $last_reading_time; ?></p>
<section class="content">
<div class="box gauge--1">
<h3>TEMPERATURE</h3>
<div class="mask">
<div class="semi-circle"></div>
<div class="semi-circle--mask"></div>
</div>
<p style="font-size: 30px;" id="temp">--</p>
<table cellspacing="5" cellpadding="5">
<tr>
<th colspan="3">Temperature <?php echo $readings_count; ?> readings</th>
</tr>
<tr>
<td>Min</td>
<td>Max</td>
<td>Average</td>
</tr>
<tr>
<td><?php echo $min_temp['min_amount']; ?> °C</td>
<td><?php echo $max_temp['max_amount']; ?> °C</td>
<td><?php echo round($avg_temp['avg_amount'], 2); ?> °C</td>
</tr>
</table>
</div>
<div class="box gauge--2">
<h3>HUMIDITY</h3>
<div class="mask">
<div class="semi-circle"></div>
<div class="semi-circle--mask"></div>
</div>
<p style="font-size: 30px;" id="humi">--</p>
<table cellspacing="5" cellpadding="5">
<tr>
<th colspan="3">Humidity <?php echo $readings_count; ?> readings</th>
</tr>
<tr>
<td>Min</td>
<td>Max</td>
<td>Average</td>
</tr>
<tr>
<td><?php echo $min_humi['min_amount']; ?> %</td>
<td><?php echo $max_humi['max_amount']; ?> %</td>
<td><?php echo round($avg_humi['avg_amount'], 2); ?> %</td>
</tr>
</table>
</div>
</section>
<?php
echo '<h2> View Latest ' . $readings_count . ' Readings</h2>
<table cellspacing="5" cellpadding="5" id="tableReadings">
<tr>
<th>ID</th>
<th>Sensor</th>
<th>Location</th>
<th>Value 1</th>
<th>Value 2</th>
<th>Value 3</th>
<th>Timestamp</th>
</tr>';
$result = getAllReadings($readings_count);
if ($result) {
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 + 7 hours (you can change 7 to any number)
//$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time + 7 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>';
}
echo '</table>';
$result->free();
}
?>
<script>
var value1 = <?php echo $last_reading_temp; ?>;
var value2 = <?php echo $last_reading_humi; ?>;
setTemperature(value1);
setHumidity(value2);
function setTemperature(curVal){
//set range for Temperature in Celsius -5 Celsius to 38 Celsius
var minTemp = -5.0;
var maxTemp = 38.0;
//set range for Temperature in Fahrenheit 23 Fahrenheit to 100 Fahrenheit
//var minTemp = 23;
//var maxTemp = 100;
var newVal = scaleValue(curVal, [minTemp, maxTemp], [0, 180]);
$('.gauge--1 .semi-circle--mask').attr({
style: '-webkit-transform: rotate(' + newVal + 'deg);' +
'-moz-transform: rotate(' + newVal + 'deg);' +
'transform: rotate(' + newVal + 'deg);'
});
$("#temp").text(curVal + ' ºC');
}
function setHumidity(curVal){
//set range for Humidity percentage 0 % to 100 %
var minHumi = 0;
var maxHumi = 100;
var newVal = scaleValue(curVal, [minHumi, maxHumi], [0, 180]);
$('.gauge--2 .semi-circle--mask').attr({
style: '-webkit-transform: rotate(' + newVal + 'deg);' +
'-moz-transform: rotate(' + newVal + 'deg);' +
'transform: rotate(' + newVal + 'deg);'
});
$("#humi").text(curVal + ' %');
}
function scaleValue(value, from, to) {
var scale = (to[1] - to[0]) / (from[1] - from[0]);
var capped = Math.min(from[1], Math.max(from[0], value)) - from[0];
return ~~(capped * scale + to[0]);
}
</script>
</body>
</html>
Si intenta acceder a su nombre de dominio en la siguiente ruta URL, verá lo siguiente:
https://example.com/esp-weather-station.php
¡Eso es todo! Si ves esta página web con valores en blanco en tu 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.
6. 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 10 minutos. 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 ensamble su circuito como se muestra en el siguiente diagrama de circuito (Instrucciones para ESP32 con BME280 y ESP32 BME280 Web Server).
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 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 ESP 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 los complementos de 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/esp-post-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.com/esp-post-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.
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 10 minutos con las últimas lecturas de BME280:
// Your Domain name with URL path or IP address with path
http.begin(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/esp-post-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.com/esp-post-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.com/esp-weather-station.php
Debería ver las últimas 20 lecturas almacenadas en su base de datos. Hay dos pantallas que muestran las últimas lecturas de temperatura y humedad, así como una marca de tiempo.
Actualice la página web para ver las métricas más recientes:
Hay un campo donde puede ingresar la cantidad de métricas a mostrar, así como la cantidad de métricas para esas estadísticas: mínima, máxima y promedio. Por defecto el valor está establecido en 20. Por ejemplo, si ingresa 30 y hace clic en el botón actualizar, verá que su sitio web actualiza y recalcula todos los valores.
El sitio web también es compatible con dispositivos móviles, por lo que puedes acceder a él desde cualquier dispositivo:
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. Esto requiere que tengas tu propio servidor y nombre de dominio (alternativamente, puedes usar un servidor Raspberry Pi LAMP para acceso local).
Le recomiendo que cambie la apariencia del sitio web, agregue más funciones (como notificaciones por correo electrónico), publique datos de diferentes sensores, use múltiples placas ESP y más.
Usted también puede estar interesado en:
- ESP32/ESP8266 Enviar notificación por correo electrónico usando un script PHP
- Visualice los valores de sus sensores desde cualquier parte del mundo (ESP32/ESP8266 + MySQL + PHP) usando gráficos
- Servidor web del módulo de relé ESP32
Obtenga más información sobre ESP32 y ESP8266 con nuestros recursos:
- Aprenda ESP32 con Arduino IDE
- Domótica con ESP8266
- 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…
- Proyectos y tutoriales gratuitos de ESP8266…
Gracias por leer.
Estación meteorológica en la nube de bricolaje con ESP32/ESP8266 (base de datos MySQL y PHP)
Construye un panel de estación meteorológica en la nube para visualizar las lecturas de tus sensores ESP32 o ESP8266 desde cualquier lugar del mundo. Podrás visualizar los datos de tus sensores en indicadores y en una tabla. El ESP32 o ESP8266 hará una solicitud HTTP POST a un script PHP para insertar tus datos en una base de datos MySQL.
Actualizado el 27 de marzo de 2023
Anteriormente, almacenábamos las lecturas de los sensores en una base de datos y las mostrábamos en una tabla o gráficos a los que podías acceder desde cualquier lugar utilizando tu propio servidor. Ahora, he decidido dar algunos pasos más y añadir más información a la página web.
He añadido dos indicadores para mostrar las últimas lecturas de temperatura y humedad, así como algunas estadísticas sobre las lecturas mínimas, máximas y promedio de un número de lecturas que tú puedes definir. También puedes visualizar todas las últimas lecturas en una tabla y seleccionar cuántas lecturas quieres mostrar.
Para construir este proyecto, utilizarás estas tecnologías:
- ESP32 o ESP8266 programado con el IDE de Arduino
- 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
Este proyecto se divide en las siguientes secciones principales:
- Alojamiento de tu aplicación PHP y base de datos MySQL
- Preparación de tu base de datos MySQL
- Script PHP HTTP POST – Recibir e insertar datos en la base de datos MySQL
- Script PHP para funciones de base de datos
- Script PHP – Mostrar las lecturas de la base de datos en los indicadores y la tabla
- Configuración del ESP32 o ESP8266
- Ver la Demostración en Video
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 del ESP32 o ESP8266. Puedes visualizar las lecturas desde cualquier lugar del mundo accediendo a tu propio dominio de servidor.
Recomiendo utilizar uno de los siguientes servicios de alojamiento que pueden 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 se gestiona a través de una línea de comandos. Solo recomiendo esta opción para usuarios avanzados.
Estos dos servicios son los que utilizo y recomiendo personalmente, pero puedes utilizar cualquier otro servicio de alojamiento. Cualquier servicio de hosting que ofrezca PHP y MySQL funcionará con este tutorial. Si no tienes una cuenta de hosting, te recomiendo registrarte en Bluehost.
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 usuario
- Abre la pestaña "Avanzado"
- Escribe "base de datos" en la barra de búsqueda y selecciona "Asistente de base de datos MySQL".
- Ingresa el nombre deseado de la base de datos, por ejemplo, esp_data. Luego, presiona el botón "Siguiente".
- Escribe tu nombre de usuario de la base de datos y establece una contraseña. Debes guardar todos estos detalles, ya que los necesitarás más adelante para establecer una conexión con tu código PHP.
Después de crear tu base de datos y usuario, vuelve al panel de cPanel y busca "phpMyAdmin". Luego, en la barra lateral izquierda, selecciona el nombre de tu base de datos esp_data y abre la pestaña "SQL". Copia la consulta SQL en el siguiente fragmento y pégala en el campo de consulta SQL para crear tu tabla:
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
)
3. Script PHP HTTP POST – Recibir e insertar datos en la base de datos MySQL
En esta sección, vamos a crear un script PHP que se encargará de recibir las solicitudes entrantes del ESP32 o ESP8266 e insertar los datos en una base de datos MySQL.
Si estás utilizando un proveedor de hospedaje con cPanel, puedes buscar "Administrador de archivos". Luego, selecciona la opción public_html y presiona el botón "+ Archivo" para crear un nuevo archivo .php.
Crea un nuevo archivo en /public_html con este nombre y extensión exactos: esp-post-data.php
Edita el archivo recién creado (esp-post-data.php) y copia el siguiente fragmento de código:
<!-- Rui Santos
Detalles completos del proyecto en https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/
Se concede el permiso, de forma gratuita, a cualquier persona que obtenga una copia
de este software y los archivos de documentación asociados.
El aviso de derechos de autor anterior y este aviso de permiso deben incluirse en todas las
copias o porciones sustanciales del Software.
-->
<?php
include_once('esp-database.php');
// Mantén este valor de clave API para que sea compatible con el código ESP proporcionado en la página del proyecto. Si cambias este valor, el boceto ESP debe coincidir.
$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"]);
$result = insertReading($sensor, $location, $value1, $value2, $value3);
echo $result;
}
else {
echo "Clave API incorrecta.";
}
}
else {
echo "No hay datos publicados con HTTP POST.";
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
4. Script PHP para funciones de base de datos
Crea un nuevo archivo en /public_html que se encargará de insertar y acceder a los datos en tu base de datos. Nombre tu archivo: esp-database.php
Copia el siguiente script PHP:
<!-- Rui Santos
Detalles completos del proyecto en https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/
Se concede el permiso, de forma gratuita, a cualquier persona que obtenga una copia
de este software y los archivos de documentación asociados.
El aviso de derechos de autor anterior y este aviso de permiso deben incluirse en todas las
copias o porciones sustanciales del Software.
-->
<?php
$servername = "localhost";
// SUSTITUIR con el nombre de tu base de datos
$dbname = "SUSTITUIR_CON_NOMBRE_DE_TU_BASE_DE_DATOS";
// SUSTITUIR con el usuario de la base de datos
$username = "SUSTITUIR_CON_TU_USUARIO";
// SUSTITUIR con la contraseña del usuario de la base de datos
$password = "SUSTITUIR_CON_TU_CONTRASEÑA";
function insertReading($sensor, $location, $value1, $value2, $value3) {
global $servername, $username, $password, $dbname;
// Crear conexión
$conn = new mysqli($servername, $username, $password, $dbname);
// Verificar conexión
if ($conn->connect_error) {
die("Error 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) {
return "Nuevo registro creado exitosamente";
}
else {
return "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}
Por favor, sigue este mismo proceso para agregar los scripts restantes (esp-post-data.php, esp-style.css, esp-weather-station.php) y completar la implementación del panel de control de la estación meteorológica en la nube con ESP32/ESP8266.
Si tienes alguna pregunta o necesitas ayuda adicional con la configuración, ¡no dudes en hacerla! ¡Disfruta construyendo tu propia estación meteorológica en la nube!