Hoy crearemos una garita meteorológica WiFi que mide la temperatura y la humedad utilizando el Arduino ESP32.
Este contenido está basado en el guión de clases 16+1 que se llevará a cabo en la escuela.
1. Materiales necesarios
Los materiales son simples.
ESP32, DHT-22, 3 cables
Primero, expliquemos brevemente el ESP32: es un Arduino con módulo WiFi integrado.
Sin embargo, es mucho más pequeño que el Arduino convencional.
2. Mapa de pines del ESP32

¿Eh? ¿Los números de los pines son un poco extraños?
Como expliqué en el artículo anterior, los mapeos de pines cambiaron debido a la inclusión del módulo WiFi.
Abajo se proporciona el mapeo de pines del Arduino ESP32.
Parece que este dispositivo tiene sus números de GPIO y nombres de pines casi iguales.
Utilizaremos el seguro pin D4 entre estos pines para operar el DHT-22.

Pin D de Arduino | Número de GPIO | Precauciones | Función y Descripción |
|---|---|---|---|
D0 | GPIO0 | strapping: requiere LOW o flotante al arrancar | Influencia en el modo flash ([randomnerdtutorials.com][1]) |
D1 | GPIO1 (TX0) | Precaución: conflicto de serie USB | UART0 TX para carga y depuración |
D2 | GPIO2 | strapping: requiere LOW/flotante al arrancar | LED a bordo → tiene influencia en el arranque |
D3 | GPIO3 (RX0) | Precaución: conflicto de serie USB | UART0 RX, HIGH al arrancar |
D4 | GPIO4 | ★ Seguro | I/O digital, ADC2_CH0, compatible con touch |
D5 | GPIO5 | strapping: requiere HIGH al arrancar | PWM posible durante el arranque |
D6–D11 | GPIO6–11 | Absolutamente no usar | Pines de flash SPI internos |
D12 | GPIO12 | strapping: requiere LOW al arrancar | ADC2_CH5, touch, influye en el arranque |
D13 | GPIO13 | Seguro | ADC2_CH4, compatible con touch |
D14 | GPIO14 | PWM sale al arrancar, strapping de arranque posible | ADC2_CH6, compatible con touch |
D15 | GPIO15 | strapping: requiere HIGH al arrancar, PWM | ADC2_CH3, compatible con touch |
D16 | GPIO16 | Precaución con PSRAM al usar módulo Wrover | UART2 TX/RX predeterminado (17/16) |
D17 | GPIO17 | Precaución con módulo Wrover | UART2 TX/RX predeterminado (17/16) |
D18, D19, D21–D23, D25–D27, D32–D33 | Omitir | Seguro | Compatibles con digital, PWM, I2C, SPI, ADC/DAC |
D34, D35, D36(VP), D39(VN) | 34,35,36,39 | Solo entrada, sin pull-up/pull-down | Canales ADC1 (sin funciones adicionales) |
3. DHT-11 vs DHT-22
Normalmente, el termómetro de temperatura y humedad que viene con un Arduino es un DHT-11.
Es el de color azul, con un margen de error de hasta 2 grados.
Abajo he resumido el rendimiento del DHT-11 y el DHT-22 en una tabla.
Ítem | DHT-11 | DHT-22 (AM2302) |
|---|---|---|
Apariencia | ![]() | ![]() |
Rango de medición de temperatura | 0 ~ 50°C | -40 ~ +80°C |
Precisión de temperatura | ±2°C | ±0.5°C |
Rango de medición de humedad | 20 ~ 80% RH | 0 ~ 100% RH |
Precisión de humedad | ±5% RH | ±2~3% RH |
Resolución de medición | Temperatura: 1°C, Humedad: 1% RH | Temperatura: 0.1°C, Humedad: 0.1% RH |
Frecuencia de medición (intervalo de muestreo) | Mínimo 1 segundo | Mínimo 2 segundos |
Velocidad de transferencia de datos | Baja | Baja |
Tamaño | Pequeño | Un poco más grande |
Precio | Barato | Más caro que el DHT-11 |
Voltaje de operación | 3 ~ 5V | 3 ~ 5V |
Como el margen de error es demasiado grande, he decidido usar el DHT-22, que tiene un error menor.
Si quisiera obtener temperaturas aún más precisas, usaría el termómetro PT-100, pero creo que no es necesario.
4. Instalación del controlador CH340

En la foto de arriba, dentro del círculo rojo, hay un chip.
Este es un chipset llamado CH340, fabricado en China, que puedes imaginar como la CPU de una computadora.
Dejo el enlace al sitio oficial que proporciona el controlador de chip CH340.
Descárgalo y sigue el proceso de instalación haciendo clic en siguiente sin pensar.
El archivo cubre los controladores de todos los chips mencionados a continuación.
Para MacBook, no es necesario instalar este controlador ya que lo proporciona de manera predeterminada.
CH340G,CH340T,CH340C,CH340N, CH340K, CH340E,CH340B,CH341A,CH341F, CH341T,CH341B,CH341C,CH341U5. Configuración del administrador de placas en Arduino IDE
Ahora configuremos el administrador de placas en el IDE de Arduino.
En Arduino IDE, vaya a Archivo > Preferencias.

Y copie e ingrese la URL a continuación en el Administrador de URL adicionales de tarjetas.
https://espressif.github.io/arduino-esp32/package_esp32_index.json

Luego, en el administrador de placas, busque ESP32 y asegúrese de que el que ofrece sea Espressif Systems para instalarlo.

Conecte el Arduino al puerto USB y el puerto se detectará automáticamente.
Solo necesita seleccionar la placa de Arduino correspondiente a ese puerto.

6. Conexión WiFi
Subamos un ejemplo simple.
Vaya a Archivo -> Ejemplo -> HttpClient -> BasicHttpsClient para ver un ejemplo de solicitud Http.

Cambie solo las partes de SSID y PASSWORD en este ejemplo.
void setup() {
USE_SERIAL.begin(115200);
USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();
for (uint8_t t = 4; t > 0; t--) {
USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
USE_SERIAL.flush();
delay(1000);
}
// Ingrese el nombre de WiFi en SSID y la contraseña en PASSWORD
wifiMulti.addAP("SSID", "PASSWORD");
}Si falla la carga, intente ajustar la velocidad.
Vaya a Herramientas -> Velocidad de carga y elija un valor más bajo para obtener una carga estable.

Si continúa según el código del ejemplo, podrá ver los resultados en el monitor de serie.
Si llega hasta aquí, habrá completado aproximadamente un tercio del trabajo.

7. Conectando el sensor DHT-22
Ahora conectaremos el sensor DHT-22 al Arduino para obtener los valores de temperatura y humedad.
Primero, busque e instale la biblioteca.
Busque 'dht sensor library' y obtenga la creada por adafruit.

Ahora en Archivo->Ejemplo, verá un ejemplo de termómetro de temperatura y humedad.
Intentemos una prueba de sensor con uno de estos ejemplos.
Sin comentarios, lo esencial es lo siguiente.

#include "DHT.h"
#define DHTPIN 4 // Especificar número de pin
#define DHTTYPE DHT22 // DHT 22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200); // Velocidad de comunicación en serie. Cambie a 115200
Serial.println(F("¡Prueba de DHTxx!"));
dht.begin();
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true); // Se convierte a Fahrenheit si es verdadero
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("¡Error al leer el sensor DHT!"));
return;
}
float hif = dht.computeHeatIndex(f, h); // Esto es el índice de calor
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humedad: "));
Serial.print(h);
Serial.print(F("% Temperatura: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Índice de calor: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
}Una vez subido al Arduino, puede verificar la salida de temperatura en el monitor de serie.
Soplé una vez y la humedad se disparó hasta el 100%.

Ahora que tenemos solucionadas la conexión WiFi del Arduino y el sensor, vayamos a la configuración de Google Sheets.
8. Configuración de Google Sheets
Traté de escribir el artículo yo mismo, pero temo que la explicación de Google Sheets haga que el artículo sea demasiado largo, así que he adjuntado un artículo que escribí anteriormente.
Le recomiendo que lo revise en el enlace a continuación.
9. Enviar solicitudes GET con Arduino
Ahora que la configuración de Google Sheets está lista, es hora de enviar una solicitud GET desde el Arduino.
Usaremos el ejemplo de conexión WiFi de arriba.
Cambiaremos solo la URL de solicitud a script de Google.
A continuación, se omite la parte del medio.
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <NetworkClientSecure.h>
...
String host = "https://script.google.com/";
String googleScriptID = "mi ID de script de Google";
String scriptUrl = "macros/s/"+googleScriptID+"/exec";
String queryString = "?value1='Hola'&value2='¡Probando!'";
String getReqUrl = host + scriptUrl + queryString;
void setup() {
...
WiFiMulti.addAP("Nombre de WiFi", "Contraseña de WiFi");
...
}
void loop() {
NetworkClientSecure *client = new NetworkClientSecure;
if (client) {
client->setCACert(rootCACertificate);
{
HTTPClient https;
Serial.print("[HTTPS] comenzando...\n");
if (https.begin(*client, getReqUrl)) { // <--- Solo se modifica esta parte
...
}
}}
}Al ejecutar esto verá los datos fluyendo hacia Google Sheets.
La última etapa es recibir datos del DHT-22 y enviarlos.

10. Combinación de códigos

Ahora combinemos los dos códigos.
Si es difícil, también puede dejarlo en manos de una IA.
Primero, cambié el código del loop del DHT-22 para que devuelva una estructura llamada Weather.
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
struct WeatherData {
float humi;
float temp;
float heat;
bool valid;
};
WeatherData getWeather() {
WeatherData data;
data.humi = dht.readHumidity();
data.temp = dht.readTemperature();
if (isnan(data.humi) || isnan(data.temp)) {
Serial.println(F("¡Error al leer el sensor DHT!"));
data.valid = false;
return data;
}
data.valid = true;
data.heat = dht.computeHeatIndex(data.temp, data.humi, false);
Serial.print(F("Humedad: "));
Serial.print(data.humi);
Serial.print(F("% Temperatura: "));
Serial.print(data.temp);
Serial.print(F("°C "));
Serial.print(F("°Índice de calor: "));
Serial.print(data.heat);
Serial.print(F("°C "));
return data;
}Ahora, puede distribuir esto de manera adecuada en el código de cliente https.
¡Combinemos!
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <NetworkClientSecure.h>
#include "DHT.h"
...
Certificado omitido
...
void setClock() {
...
}
#define DHTPIN 4
#define DHTTYPE DHT22
WiFiMulti WiFiMulti;
DHT dht(DHTPIN, DHTTYPE);
char* SSID = "Nombre del WiFi";
char* PASSWORD = "Contraseña del WiFi";
String host = "https://script.google.com/";
String googleScriptID = "mi ID de script de Google";
String scriptUrl = "macros/s/"+googleScriptID+"/exec";
struct WeatherData {
...
};
WeatherData getWeather(); //Declara para evitar errores
void setup() {
dht.begin();
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFiMulti.addAP(SSID, PASSWORD);
Serial.print(F("Esperando conexión WiFi..."));
while ((WiFiMulti.run() != WL_CONNECTED)) {
Serial.print(F("."));
}
Serial.println(F(" conectado"));
setClock();
}
WeatherData getWeather() {
...
}
void loop() {
NetworkClientSecure *client = new NetworkClientSecure;
if (client) {
client->setCACert(rootCACertificate);
{
HTTPClient https;
WeatherData data = getWeather();
if (!data.valid){
Serial.println(F("No se puede obtener información climatológica."));
Serial.println("Esperando 10s antes de la siguiente ronda...");
delay(10000);
return;
};
Serial.print("[HTTPS] comenzando...\n");
String queryString = "?value1=" + String(data.humi) + "&value2=" + String(data.temp) ;
String getReqUrl = host + scriptUrl + queryString;
if (https.begin(*client, getReqUrl)) { // HTTPS
Serial.print("[HTTPS] GET...\n");
int httpCode = https.GET();
if (httpCode > 0) {
Serial.printf("[HTTPS] GET... código: %d\n", httpCode);
} else {
Serial.printf("[HTTPS] GET... falló, error: %s\n", https.errorToString(httpCode).c_str());
}
https.end();
} else {
Serial.printf("[HTTPS] No se puede conectar\n");
}
}
delete client;
} else {
Serial.println("No se puede crear cliente");
}
Serial.println();
Serial.println("Esperando 10s antes de la siguiente ronda...");
delay(10000);
}
Una vez hecho esto, verá el código 200 de la respuesta GET en el monitor de serie junto con los valores de temperatura y humedad.
Simplemente verifique Google Sheets.

11. Tareas adicionales
Si desea registrar la temperatura percibida, modifique el script de Google.
Puedes agregar una variable o cambiar el nombre de una existente al analizar parámetros.
...
for (var param in e.parameter) {
Logger.log('In for loop, param=' + param);
var value = stripQuotes(e.parameter[param]);
Logger.log(param + ':' + e.parameter[param]);
switch (param) {
case 'humi':
rowData[2] = value; // value1 in column C
result = 'Logged humidity';
break;
case 'temp':
rowData[3] = value; // Humidity in column D
result += ', Logged temperature';
break;
case 'heat':
rowData[4] = value;
result += ", Logged heat index";
break
default:
result = "Unsupported parameter.";
}
...Por supuesto, también debe cambiar el código de consulta en el código de Arduino.
Todo esto es para el mantenimiento futuro o el gusto personal, ya que es un proyecto personal.
12. Reflexión
En el pasado, cuando experimenté con estudiantes, obtuvimos datos como estos.
La brecha de datos se debió al apagado durante la noche...
Pero si crea un dispositivo simple como este que recopila datos automáticamente, solo tiene que analizarlos, lo cual me parece excelente.

Mirando el producto terminado, parece que no hay mucho contenido, pero al escribir se hizo extremadamente largo.
En la clase 16+1, planeo que las primeras 3 horas sean sobre C, las siguientes 2 horas sobre el medidor de temperatura y humedad Arduino, y el resto del tiempo para proyectos personales, pero me preocupa que no tengamos suficiente tiempo.
Espero sinceramente que las clases que hemos preparado arduamente finalicen bien y que lleguemos a las vacaciones de verano.




댓글을 불러오는 중...