En este tutorial se pretende mostrar el paso en el desarrollo de una aplicación de telemetría que permitirá tomar los datos entregados por un sensor de temperatura y humedad relativa DHT11 y reportarlos a una base de datos ubicada en un HOST remoto a través de una tarjeta de desarrollo ESP-01 con ESP8266. Esta aplicación puede extrapolarse fácilmente a múltiples sensores y puede lograrse a un muy bajo costo.
Materiales utilizados
- ESP-01 (tarjeta de desarrollo para módulo ESP8266)
- Sensor de temperatura y humedad relativa DHT11 (también puede utilizarse un DHT22)
- Computador con IDE de Arduino
- Hosting con base de datos y phpMyAdmin
Introducción y estructura general del proyecto
En primer lugar, hay que definir algunos conceptos clave que van a permitir comprender a fondo el funcionamiento de cada uno de los módulos del proyecto. Por ejemplo, términos como HOST, PHP, WEB SERVICE, GET, POST, etc.
A grandes rasgos, muchas tecnologías (hardware y software) se combinan para alcanzar el objetivo. En la siguiente imagen se pueden identificar los 4 pasos que componen este videotutorial.

En el Paso 1, se explicará la configuración de la base de datos, el HOST y el servicio WEB. En el Paso 2, se explicará la configuración y programación entre el módulo ESP-01 y el sensor DHT11. En el Paso 3 se explicará la configuración y programación para hacer el reporte de la información a través de una petición GET desde el módulo ESP-01 hacia el HOST. Finalmente, en el Paso 4, se explicará una sencilla manera para visualizar los datos insertados en la base de datos desde un navegador WEB.
Este tutorial explica el paso paso para hacer el reporte a una base de datos remota (NO LOCAL), así que asume se asume que ya cuentas con un alojamiento WEB y un dominio; y que en ese alojamiento WEB puedes crear bases da datos MySQL y administrarlas con phpMyAdmin.
Si aún no cuentas con lo mencionado anteriormente, te recomiendo mirar primero la lista de videotutoriales de este enlace, en donde te explico como hacerte a un HOST con dominio gratuito y además comparto unos principios básicos de php, bases de datos y WEB SERVICES.
Si llegaste hasta este punto y estás desarrollando proyectos de este tipo (telemetría), te recomiendo adquirir un alojamiento pago que te permita hacer múltiples pruebas con diferentes bases de datos. A mi me ha funcionado Hostinger Argentina. Si deseas comprar tu host, puedes hacerlo a través de este enlace y probablemente te den un pequeño descuento.
Bueno, sin más preámbulo, vamos a comenzar.
Paso 1: Configuración de HOST, base de datos y servicio WEB
Base de datos
Lo primero que abordaremos será la creación de la base de datos. En mi caso, yo me apoyo del gestor phpMyAdmin que ya viene disponible y configurado por mi proveedor de HOST.
La base de datos que cree para este videotutorial se llama “prue” y cuenta con una tabla llamada “reportes” y 4 columnas que son “id“, “temp“, “hum” y “date_time” en las que se van a almacenar un número serial que identifique el sistema que está haciendo el reporte, un dato de temperatura, un dato de humedad y la fecha y hora en que se ingresa el reporte respectivamente.

Servicio WEB
El servicio WEB que vamos a utilizar, será un archivo .php que se va a encargar de recibir la petición GET que se hace desde el módulo ESP8266 y extraer de esta petición la información que el módulo reporta. Además de extraer la información, este archivo tiene el deber de introducir la información a la base de datos.
El siguiente código es el que está depositado en el archivo “reportesget.php“
<?php
include ("conexion.php");
if (isset($_GET["SERIE"]) && !empty($_GET["SERIE"]))
{
$serie = $_GET["SERIE"];
$temp = $_GET["TEMP"];
$hum = $_GET["HUM"];
$mysqli = new mysqli($host, $user, $pw, $db);
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$query = "INSERT INTO reportes VALUES ('$serie','$temp','$hum',current_timestamp())";
$mysqli->query($query);
#$con = mysql_connect ($host, $user, $pw)
#or die ("Pro_server");
#3mysql_select_db ($db,$con)
#or die ("pro_select_db");
#mysql_query("INSERT INTO reportes (id,temp,hum,date_time) VALUES ('$serie','$temp','$hum',current_timestamp())", $con) #or die ("pro_insert_db");
echo "Registro Correcto";
}
else {echo "datosIncorrectos";}
?>
Las líneas de código comentadas con el símbolo “#” corresponden al código que se debería utilizar si se está trabajando por debajo de php 5.0. En este caso, el proyecto se desarrolló sobre php 7.3, por lo que se utiliza “mysqli”
La segunda línea de este código hace referencia al archivo “conexion.php” que contiene los datos de conexión a la base de datos y se muestra a continuación.
<?php
$host = "localhost";
$user = "mi_usuario";
$pw = "mi_clave";
$db = "nombre_de_la_base_de_datos";
?>
Estos dod documentos deben crearse correctamente y subirse a una carpeta en nuestro HOST. Hay que garantizar que la carpeta cuente coc los permisos necesarios para hacer operaciones en base de datos, ingresar y extraer información.

Las direcciones URL, los nombres y contraseñas utilizadas en este tutorial, se crearon exclusivamente para el desarrollo del mismo, así que no traten de consultar mi base de datos o de utilizar los datos que aquí se depositan. Será tiempo perdido.
Luego de tener los archivos subidos en el HOST, para probarlos basta con teclear en la barra del navegador la URL de la ubicación de los archivos y agregar las variables en la estructura de una petiión GET. En mi caso, la URL con las variables para prueba quedó así:
“http://jolumartinez.com/tutorials/reportesget.php?SERIE=456&TEMP=789&HUM=012“.

Al hacer una visita a esta URL, la respuesta de la página es “Registro Correcto“, lo que indica, que la información que se envió en la URL quedó debidamente guardada en la base de datos. Así que el paso siguiente es comprobar en phpMyAdmin si ha habido ingresos a la base de datos.

Paso 2: comunicación de sensor DHT11 con ESP8266
Este paso debe ser el más sencillo y rápido de todos, pues para establecer la comunicación se utilizó la librería para Arduino DHT22, que se encuentra adjunta en los documentos de este tutorial. Además, para la programación del módulo ESP-01, se utilizó un Arduino UNO al que se le retiró el microcontrolador; y la librería para el ESP8266 también se encuentra disponible en los documentos adjuntos.
El código completo se encuentra en el siguiente paso: Paso 3.
Conexiones de Arduino UNO y ESP-01 para programación
En este punto voy a explicar el proceso de programación del módulo ESP-01 con una tarjeta Arduino UNO, pues en muchas páginas no se encuentra muy claro.
Lo primero es establecer la conexión. Es importante recordar que la tarjeta Arduino UNO no debe tener el microcontrolador.

También se debe garantizar que para la programación se encuentre conectado a VCC el pin CHPD y a GND el pin GPIO0.
ESP8266 | Arduino |
GND | GND |
GPIO-2 | No conectar (abierto) |
GPIO-0 | GND |
RXD | RX |
TXD | TX |
CHPD | 3.3V |
RST | No conectar (abierto) *(Leer instrucciones siguientes a la tabla) |
VCC | 3.3V |
*En ocasiones se presentan problemas al momento de cargar el programa y suele ser de ayuda llevar el pin RESET a tierra durante la compilación y retirarlo en el momento de la carga.
Después de cargar el programa, se debe suprimir la conexión de los pines GPIO-0 y RESET, dejándolos abiertos, como se muestra en la siguiente imagen.

Paso 3: Comunicación de ESP-01 con servicio WEB PHP
Para la programación del módulo ESP se utilizó la librería “ESP8266WiFi”, que se encuentra disponible en los archivos adjuntos de este proyecto.
#include <ESP8266WiFi.h>
#include <DHT.h>
const char* ssid = "nombre_red_wifi";
const char* password = "contrasena_red_wifi";
// se cargan los datos del host
const char* host = "jolumartinez.com";
//Se declaran variables de trabajo para ller los datos que llegan del microcontrolador
char otroChar;
String otroString="";
String trabajo="";
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// Se inicializa la comunicacion serial con el microcontrolador
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
// Serial.println();
// Serial.println();
// Serial.print("Connecting to ");
// Serial.println(ssid);
// Se inicializa el modulo ESP y se verifica que exista conexion antes de continuar
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Serial.println("");
// Serial.println("WiFi connected");
// Serial.println("IP address: ");
// Serial.println(WiFi.localIP());
}
int value = 0;
// esta funcion lee la cadena enviada desde el microcontrolador con los datos que se desean reportar
String readDHTTemperature() {
while (trabajo == "esperar")
{
Serial.println(trabajo);
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
delay(2000);
Serial.println(t);
// Read temperature as Fahrenheit (isFahrenheit = true)
//float t = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
//return "--";
}
else {
Serial.println(t);
return String(t);
trabajo = "salir";
Serial.println(trabajo);
}
}
}
String readDHTHumidity() {
while (trabajo == "esperar")
{
Serial.println(trabajo);
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
delay(2000);
Serial.println(h);
if (isnan(h)) {
Serial.println("Failed to read from DHT sensor!");
//return "--";
}
else {
Serial.println(h);
return String(h);
trabajo = "salir";
Serial.println(trabajo);
}
}
}
// Funcion principal
void loop() {
delay(10000);
++value;
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
trabajo = "esperar";
String temp = readDHTTemperature();
trabajo = "esperar";
String hum = readDHTHumidity();
String url = "/tutorials/reportesget.php?SERIE=tuto1&TEMP=" + temp + "&HUM=" + hum;
Serial.println(url);
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(10);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
}
}
Si todo está bien conectado, lo único que habría que modificar del código anterior sería el nombre y la contraseña de la red WiFi a la que nos vamos a conectar. Por otro lado, el código se encuentra comentado para facilitar la comprensión y seguimiento del mismo; sin embargo, si se presentan errores o dudas, por favor comentarlas en este post para solucionarlas a todos los interesados.
En caso de que se presenten problemas, se pueden agregar líneas de impresión en puerto serial para hacer un seguimiento al desarrollo del código.
Paso 4: visualización de la información
Para visualizar la información vamos a hacer un despliegue sencillo, en forma de lista, de los datos almacenados en la base de datos. Si lo que se desea es obtener gráficas rápidamente, se pueden descargar los reportes y manipularlos con EXCEL para hacer análisis básicos o con cualquier otro software que permita leer archivos .csv
Creando el archivo .php para visualización
Este archivo se va a ejecutar una única vez cada que abramos su ubicación, por lo cual, si queremos estar viedo las actualizaciones, pues será necesario actualizar la página.
<?php
include ("conexion.php");
$mysqli = new mysqli($host, $user, $pw, $db);
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$mysqli->real_query("SELECT * FROM reportes ORDER BY date_time ASC");
$res = $mysqli->use_result();
echo "Result set order...<br />";
while ($row = $res->fetch_assoc()) {
echo " id= " . $row['id'] . "; Temperatura = " . $row['temp'] . "; Humedad = " . $row['hum'] . "; Marca Temporal = " . $row['date_time'] . '<br />';
echo "\n";
}
?>
El código anterior (visual.php) hace una petición de consulta a la base de datos y organiza la información en forma de lista para mostrarla. Si se desea limitar la cantidad de datos devueltos, se puede agregar la condición en la sentencia WHILE.
El archivo “visual.php” debe estar almacenado en el HOST, en la misma carpeta donde se encuentre “conexion.php”. En mi caso, lo he depositado en la misma carpeta con todos los demás archivos. Además, también hay que habilitar los permisos necesarios del archivo como en el Paso 1.

Al ejecutar la URL que apunta al archivo de visualización, en mi caso “http:{//jolumartinez.com/tutorials/visual.php”, se entrega en pantalla la lista de los datos reportados, como se aprecia en la siguiente imagen. Cabe anotar que este código fue desarrollado para PHP 7.3, así que probablemente no funcione con versiones anteriores.

Documentos y archivos
Ya en este punto puede darse por terminado el tutorial. Recuerden que los archivos y documentos deben ser modificados con los datos que ustedes van a utilizar. Si tienen alguna duda, por favor comentarla y trataré de darle respuesta lo más pronto posible.
Los documentos pueden ser descargados aquí.
El desarrollo de este tipo de tutoriales no es posible sin la ayuda de ustedes, por lo tanto, si quieres hacer una donación para apoyar nuestro trabajo, puedes hacerlo a través del siguiente enlace con PayPal.