#include "DHTesp.h"
// Incluimos las librerías necesarias
#include <Wire.h> // Comunicación I2C
#include <Adafruit_BMP085.h> // Librería para el sensor BMP180 (compatible con BMP085)
#include "Paquete.h"
// CONECTAR SDA PIN 21 Y SCL PIN 22
#include <WiFi.h>
#include "ThingSpeak.h"
// Configuración WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//SENSOR DE TEMPERATURA PIN
const int DHT_PIN = 17;
//SENSOR DE GAS MQ2 PIN 35
const int MQ2_PIN = 35;
//LED ROJO AL 5
const int RED_PIN = 5;
// LED AMARILLO 18
const int YEL_PIN = 18;
//LED VERDE 19
const int GR_PIN = 19;
// ID y APY KEY de ThingSpeak
const long int channelID = 3288197;
const char* apiKey = "YI7ETDQ204EZRRBT";
// TEMPERATURA LIMITE
#define TEMP_LIMIT 45
// HUMEDAD MINIMA
#define HUMEDAD_MIN 20
// HUMEDAD MAXIMA
#define HUMEDAD_MAX 65
// LIMITE GAS
#define GAS_LIMITE 1800
#define ADC_RESOLUTION 4095
Paquete package("ESP32_EST_001");
//Instancias de sensores
// Creamos una instancia del sensor de presión
Adafruit_BMP085 bmp;
DHTesp dhtSensor; // Instancia del sensor de temperatura
// Variables para millis
// Variables para millis
unsigned long tiempoAnterior = 0;
const long intervalo = 2000;
// Declaracion del objeto de la clase WiFiClient
WiFiClient client;
void setup() {
// Conectar a WiFi
conectarWiFi();
//Inicializar ThingSpeak
ThingSpeak.begin(client);
// Inicializamos el sensor BMP180
if (!bmp.begin()) {
// Si el sensor no se encuentra, se muestra un mensaje de error
Serial.println("¡ERROR! No se encontró el sensor BMP180.");
Serial.println("Verifica las conexiones I2C (SDA a GPIO21, SCL a GPIO22).");
} else {
Serial.println("¡Sensor BMP180 encontrado!");
}
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(RED_PIN,OUTPUT);
pinMode(YEL_PIN, OUTPUT);
pinMode(GR_PIN, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Configuracion del Pin y el tipo de sensor
}
/*
int lecturaActual = millis();
int ultimalectura;
if(lecturaActual - ultimalectura > INTERVALO)
{
LeerDHT22();
LeerQM2();
LeerBMP180();
ultimalectura = lecturaActual;
}*/
void loop() {
// Verificar conexión WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi desconectado, reconectando...");
conectarWiFi();
}
unsigned long tiempoActual = millis();
if (tiempoActual - tiempoAnterior > intervalo) {
tiempoAnterior = tiempoActual;
// LIMPIAR paquete anterior
package.Limpiar();
// Leer sensores
TempAndHumidity lectura = dhtSensor.getTempAndHumidity();
int gasValor = analogRead(MQ2_PIN);
float presion = bmp.readPressure() / 100.0;
//Envio de datos a ThingSpeak
ThingSpeak.setField(1,lectura.temperature);
ThingSpeak.setField(2, gasValor);
ThingSpeak.setField(3, presion);
ThingSpeak.writeFields(channelID, apiKey);
delay(20000);
// AGREGAR DATOS usando la clase
package.AgregarDato("temperatura", LeerDHT22(),"°C");
package.AgregarDato("humedad", lectura.humidity,"%");
package.AgregarDato("gas", LeerQM2(),"PPM");
package.AgregarDato("presion", LeerBMP180(),"hPa");
// Actualizar timestamp
package.ActualizarTimestamp();
// IMPRIMIR usando la clase
Serial.print("Lectura: ");
package.ImprimirCadena();
/*
// Crear y mostrar el JSON
Serial.println("\n--- Enviando paquete de datos ---");
String jsonData = package.CrearJSON();
Serial.println(jsonData);
// Aquí podrías enviar los datos a un servidor
// enviarAWebServer(jsonData);
Serial.println("--- Paquete enviado ---\n");
*/
}
}
float LeerDHT22()
{
// Estructura que contiene dos valores: temperatura y humedad
// dhtSensor.getTempAndHumidity() Llama a la función del sensor DHT para obtener la lectura actual
TempAndHumidity datos = dhtSensor.getTempAndHumidity();
encenderLedRed(1);
return datos.temperature;
}
int LeerQM2()
{
//Lee el valor analogico(medicion en la variacion) del sensor MQ2
int gasValor = analogRead(MQ2_PIN);
encenderLedYel(1);
return gasValor;
}
float LeerBMP180()
{
// Lee la presión en Pascales
float presion = bmp.readPressure()/100;
encenderLedGrn(1);
return presion;
}
void encenderLedRed(int i)
{
if(i==1)
{
digitalWrite(RED_PIN, HIGH);
delay(2000);
digitalWrite(RED_PIN, LOW);
}
else{
digitalWrite(RED_PIN,LOW);
}
}
void encenderLedYel(int i)
{
if(i==1)
{
digitalWrite(YEL_PIN, HIGH);
delay(2000);
digitalWrite(YEL_PIN, LOW);
}
else{
digitalWrite(YEL_PIN,LOW);
}
}
void encenderLedGrn(int i)
{
if(i==1)
{
digitalWrite(GR_PIN, HIGH);
delay(2000);
digitalWrite(GR_PIN, LOW);
}
else{
digitalWrite(GR_PIN,LOW);
}
}
void conectarWiFi() {
Serial.print("Conectando a WiFi");
WiFi.begin(ssid, password);
int intentos = 0;
while (WiFi.status() != WL_CONNECTED && intentos < 20) {
delay(500);
Serial.print(".");
intentos++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\n¡Conectado a WiFi!");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nError: No se pudo conectar a WiFi");
}
}
Loading
bmp180
bmp180