
Cómo conectar un AM2302 (DHT22) a una Heltec ESP32 LoRa V3 para medir temperatura y humedad
Seguimos construyendo paso a paso nuestra estación meteorológica IoT basada en la Heltec WiFi LoRa 32 V3.
En los capítulos anteriores ya habíamos incorporado un sensor de luz (TEMT6000), un sensor de radiación ultravioleta (GUVA-S12SD) y un sensor LM35 para medir la temperatura.
Sin embargo, el LM35 únicamente permite medir la temperatura, por lo que en este tutorial lo sustituimos por un AM2302, totalmente compatible con el conocido DHT22, que además incorpora la medida de la humedad relativa.
¿Por qué cambiar el LM35?
El LM35 es un excelente sensor analógico para comenzar, pero el AM2302 ofrece varias ventajas:
- Medición digital mucho más estable.
- Temperatura.
- Humedad relativa.
- Mayor precisión.
- Menor sensibilidad al ruido eléctrico.
Gracias a ello obtenemos una estación meteorológica mucho más completa.
Material utilizado
- Heltec WiFi LoRa 32 V3 (ESP32-S3)
- Sensor AM2302 (DHT22)
- Sensor TEMT6000
- Sensor GUVA-S12SD
- Arduino IDE
- ThingSpeak
Librerías utilizadas
- DHT sensor library (Adafruit)
- Adafruit Unified Sensor
- HT_SSD1306Wire
- WiFi
- ThingSpeak
Organización del programa
En esta versión hemos aprovechado para reorganizar completamente el código.
En lugar de concentrar todo el trabajo dentro del loop(), el programa queda dividido en funciones independientes:
- Conexión WiFi.
- Lectura de sensores.
- Envío de datos a ThingSpeak.
- Visualización en la pantalla OLED.
- Monitor Serie.
Esta estructura permitirá seguir ampliando la estación meteorológica sin tener que modificar continuamente el programa principal.
Datos enviados a ThingSpeak
Actualmente la estación envía cuatro variables:
- Temperatura.
- Humedad.
- Intensidad luminosa.
- Radiación ultravioleta.
Los siguientes campos quedan reservados para futuros sensores.
Próximos capítulos
Nuestro proyecto continúa creciendo.
En las próximas entregas incorporaremos:
- BMP280 para presión atmosférica y altitud.
- GPS NEO-6M para geolocalizar las medidas.
- Comunicación LoRa entre varias estaciones.
- Alimentación mediante batería.
- Publicación automática de datos ambientales.
El objetivo final es construir una estación meteorológica IoT completamente funcional que pueda utilizarse tanto en proyectos educativos como en iniciativas de ciencia ciudadana.
#include "Arduino.h"
#include <WiFi.h>
#include <ThingSpeak.h>
#include <Wire.h>
#include <DHT.h>
#include "HT_SSD1306Wire.h"
//====================================================
// WIFI
//====================================================
const char* ssid = "";
const char* password = "";
//====================================================
// THINGSPEAK
//====================================================
unsigned long channelID = 3427516;
const char* writeAPIKey = "3V4SYV120EWIIEPQ";
//====================================================
// SENSORES
//====================================================
// AM2302 (DHT22)
#define DHTPIN 1
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// TEMT6000
const int sensorLuz = 2;
// GUVA-S12SD
const int sensorUV = 3;
//====================================================
// OLED
//====================================================
SSD1306Wire factory_display(
0x3c,
500000,
SDA_OLED,
SCL_OLED,
GEOMETRY_128_64,
RST_OLED
);
//====================================================
WiFiClient client;
//====================================================
// VARIABLES GLOBALES
//====================================================
float temperatura = 0;
float humedad = 0;
int luz = 0;
int lecturaUV = 0;
float voltajeUV = 0;
//====================================================
void VextON()
{
pinMode(Vext, OUTPUT);
digitalWrite(Vext, LOW);
}
//====================================================
void conectarWiFi()
{
WiFi.disconnect(true);
delay(100);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
factory_display.clear();
factory_display.drawString(0,0,"Conectando...");
factory_display.display();
Serial.print("Conectando a ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi conectado");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
factory_display.clear();
factory_display.drawString(0,0,"WiFi OK");
factory_display.drawString(0,15,WiFi.localIP().toString());
factory_display.display();
}
//====================================================
void setup()
{
Serial.begin(115200);
// Alimentación de periféricos
VextON();
delay(100);
// OLED
factory_display.init();
factory_display.clear();
factory_display.drawString(0,0,"ESTACION IoT");
factory_display.drawString(0,18,"Iniciando...");
factory_display.display();
// Sensor AM2302
dht.begin();
// Entradas analógicas
pinMode(sensorLuz, INPUT);
pinMode(sensorUV, INPUT);
// WiFi
conectarWiFi();
// ThingSpeak
ThingSpeak.begin(client);
factory_display.clear();
factory_display.drawString(0,0,"Sistema listo");
factory_display.drawString(0,18,"Esperando datos...");
factory_display.display();
delay(1500);
}
//====================================================
// LEER TODOS LOS SENSORES
//====================================================
void leerSensores()
{
//=========================================
// AM2302
//=========================================
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
//=========================================
// SENSOR DE LUZ
//=========================================
luz = analogRead(sensorLuz);
//=========================================
// SENSOR UV
//=========================================
lecturaUV = analogRead(sensorUV);
voltajeUV = lecturaUV * (3.3 / 4095.0);
}
//====================================================
// MONITOR SERIE
//====================================================
void mostrarMonitorSerie()
{
Serial.println();
Serial.println("======================================");
if (isnan(temperatura) || isnan(humedad))
{
Serial.println("ERROR leyendo AM2302");
}
else
{
Serial.print("Temperatura : ");
Serial.print(temperatura,1);
Serial.println(" °C");
Serial.print("Humedad : ");
Serial.print(humedad,1);
Serial.println(" %");
}
Serial.println();
Serial.print("Luz : ");
Serial.println(luz);
Serial.println();
Serial.print("UV : ");
Serial.println(lecturaUV);
Serial.print("Voltaje UV : ");
Serial.print(voltajeUV,3);
Serial.println(" V");
Serial.println("======================================");
}
//====================================================
// ENVIAR A THINGSPEAK
//====================================================
bool enviarThingSpeak()
{
ThingSpeak.setField(1, temperatura);
ThingSpeak.setField(2, humedad);
ThingSpeak.setField(3, luz);
ThingSpeak.setField(4, lecturaUV);
int codigo = ThingSpeak.writeFields(channelID, writeAPIKey);
if(codigo == 200)
{
Serial.println("ThingSpeak OK");
return true;
}
Serial.print("Error ThingSpeak: ");
Serial.println(codigo);
return false;
}
//====================================================
// MOSTRAR OLED
//====================================================
void mostrarOLED(bool envioOK)
{
factory_display.clear();
if(envioOK)
factory_display.drawString(0,0,"ThingSpeak OK");
else
factory_display.drawString(0,0,"Error ThingSpeak");
factory_display.drawString(
0,
14,
"T: " + String(temperatura,1) + " C"
);
factory_display.drawString(
70,
14,
"H:" + String(humedad,0) + "%"
);
factory_display.drawString(
0,
30,
"L:" + String(luz)
);
factory_display.drawString(
70,
30,
"UV:" + String(lecturaUV)
);
//====================================
// Barra de luz
//====================================
int anchoBarra = map(luz,0,4095,0,128);
factory_display.drawRect(0,54,128,10);
factory_display.fillRect(0,54,anchoBarra,10);
factory_display.display();
}
//====================================================
// LOOP PRINCIPAL
//====================================================
void loop()
{
//=========================================
// Comprobar conexión WiFi
//=========================================
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("WiFi desconectado");
conectarWiFi();
}
//=========================================
// Leer sensores
//=========================================
leerSensores();
//=========================================
// Mostrar Monitor Serie
//=========================================
mostrarMonitorSerie();
//=========================================
// Enviar a ThingSpeak
//=========================================
bool envioOK = enviarThingSpeak();
//=========================================
// Actualizar OLED
//=========================================
mostrarOLED(envioOK);
//=========================================
// Esperar (ThingSpeak Free = 15 s mínimo)
//=========================================
delay(20000);
}

Etiqueta:AM2302, arduino, ciencia ciudadana, DHT22, Electrónica, esp32, ESP32-S3, Estación meteorológica, Estación meteorológica IoT, GUVA-S12SD, Heltec, Heltec WiFi LoRa 32 V3, Humedad, Internet de las Cosas, iot, programación, Radiación ultravioleta, Radiación UV, Sensor de humedad, Sensor de luz, Sensor de temperatura, Sensor UV, sensores, stem, temperatura, TEMT6000, ThingSpeak

