Recopilación de datos de temperatura y humedad con Arduino ESP32

힘센캥거루
2025년 7월 7일(수정됨)
1
85
arduino

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
Recopilación de datos de temperatura y humedad con Arduino ESP32-1

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

Recopilación de datos de temperatura y humedad con Arduino ESP32-2

¿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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-4

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

D6D11

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

Recopilación de datos de temperatura y humedad con Arduino ESP32-5Recopilación de datos de temperatura y humedad con Arduino ESP32-6

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

Recopilación de datos de temperatura y humedad con Arduino ESP32-7

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,CH341U

5. 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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-8

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
Recopilación de datos de temperatura y humedad con Arduino ESP32-9Recopilación de datos de temperatura y humedad con Arduino ESP32-10

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

Recopilación de datos de temperatura y humedad con Arduino ESP32-11

Conecte el Arduino al puerto USB y el puerto se detectará automáticamente.

Solo necesita seleccionar la placa de Arduino correspondiente a ese puerto.

Recopilación de datos de temperatura y humedad con Arduino ESP32-12

6. Conexión WiFi

Subamos un ejemplo simple.

Vaya a Archivo -> Ejemplo -> HttpClient -> BasicHttpsClient para ver un ejemplo de solicitud Http.

Recopilación de datos de temperatura y humedad con Arduino ESP32-13

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-14

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-15

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-16

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-17
#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%.

Recopilación de datos de temperatura y humedad con Arduino ESP32-18

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-20

10. Combinación de códigos

Recopilación de datos de temperatura y humedad con Arduino ESP32-21

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-22

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.

Recopilación de datos de temperatura y humedad con Arduino ESP32-23

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.

댓글을 불러오는 중...