//1 ImportarLibrerias
#include <Wire.h>
#include "WiFi.h" // Librería para la conexión WiFi (especial para ESP32)
#include "PubSubClient.h" // Librería para la configuración de comunicación MQTT (especial para ESP32)
#include "DHT.h" // librería para que funcione correctamente el sensor
//-------------------VARIABLES GLOBALES--------------------------
//2 configuración de Red
const char* ssid = "Wokwi-GUEST"; //Usuario red WIFI.
const char* password = ""; //Contraseña de la red wifi
//Direccion del Broker.
const char* mqtt_server = "34.203.1.178"; //Broker MQTT de prueba gratuito
//3 variables y valores iniciales para el cliente WIFI.
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastSend;
int status = WL_IDLE_STATUS;
//4 configuración de los sensores
#define DHT1PIN 2 // Pin fisico ESP32 para el sensor 1
#define DHT2PIN 3 // Pin fisico ESP32 para el sensor 2
#define DHTTYPE DHT22 // Tipo de sensor
DHT dht1(DHT1PIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);
float h1,t1,h2,t2;//variables temperatura y humedad
int RefOn, DoorOpen; //Variable que indica si el refrigerador está encendido
//5 configuración de indicadores de alertas
#define LED1PIN 4 // Pin fisico ESP32 para el sensor 1
#define LED2PIN 5 // Pin fisico ESP32 para el sensor 2
#define BUZZERPIN 6 // Pin fisico ESP32 para el buzzer
#define REFPIN 46 // Pin fisico ESP32 para verificar el estado del refrigerador
#define DOORPIN 45 // Pin fisico ESP32 para verificar el estado de la puerta del refrigerador
bool SensorOneOk = true;
bool SensorTwoOk = true;
//6 definición de la variable para publicar el mensaje
String payload;
//Esta función reconecta su ESP32 al Broker (MQTT)
void reconnect() {
while (!client.connected()) {
if (client.connect("URRefrigerator")) {
//Serial.println("Canectado");
} else {
Serial.print("Fallo, rc=");
Serial.print(client.state());
Serial.println(" Intentando de nuevamente en 5 segundos");
delay(1000);
}
}
}
//7 configuración de Red
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("");
Serial.print("Conexión WiFi - Dirección IP De La ESP32: ");
Serial.println(WiFi.localIP());
}
//8 configuración de la función (setup)
void setup()
{
pinMode(LED1PIN, OUTPUT);
pinMode(LED2PIN, OUTPUT);
pinMode(BUZZERPIN, OUTPUT);
pinMode(REFPIN, INPUT);
pinMode(DOORPIN, INPUT);
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server,1883);
Serial.println("hola");
dht1.begin();
lastSend = 0;
delay(3000);
}
//Función Loop
void loop()
{
if ( !client.connected() ) { //Si no se encuentra el cluiente conectado
reconnect(); //Se reconectan al Broker MQTT.
}
if ( millis() - lastSend > 1000 ) { // Actializa la lectura y envio cada segundo
GetSensor(); // se adquiere y publica en el broker los datos adquiridos por el sensor cada segundo.
CrearJson();
PublicarMensaje();
//Serial.println(payload|);
//CrearJson(datos);
lastSend = millis();
}
client.loop(); //Mantiene la conexion permanent con el Broker.
}
void GetSensor() {
//----Sensor 1----
// Lee la temperatura o humedad aproximadamente cada 250 milisegundos!
h1 = dht1.readHumidity();
// Lee la temperatura en grados Celsius.
t1 = dht1.readTemperature();
//----Sensor 2----
// Lee la temperatura o humedad aproximadamente cada 250 milisegundos!
h2 = dht2.readHumidity();
// Lee la temperatura en grados Celsius.
t2 = dht2.readTemperature();
//----Encendido refrigerador----
RefOn = digitalRead(REFPIN);
DoorOpen = digitalRead(DOORPIN);
// Verifica que no existe un error al leer el sensor.
if (isnan(h1) || isnan(t1)) {
Serial.println("fallo al leer el sensor DHT 1!");
return;
}
if (isnan(h2) || isnan(t2)) {
Serial.println("fallo al leer el sensor DHT 2!");
return;
}
// Verifica que la temperatura y la humedad estén en los rangos definidos
if (t1 < 2 || t1 > 8 || h1 < 50 || h1 > 70) {
digitalWrite(LED1PIN, HIGH);
SensorOneOk = false;
}
else{
digitalWrite(LED1PIN, LOW);
SensorOneOk = true;
}
if (t2 < 2 || t2 > 8 || h2 < 50 || h2 > 70) {
digitalWrite(LED2PIN, HIGH);
SensorTwoOk = false;
}
else{
digitalWrite(LED2PIN, LOW);
SensorTwoOk = true;
}
// Revisar si alguno de los dos sensores genera alerta para encender el buzzer
if(SensorOneOk && SensorTwoOk){
noTone(BUZZERPIN);
}
else{
tone(BUZZERPIN, 1000);
}
}
//configuración formato Json
void CrearJson(){
String temperatura1 = String(t1);
String humedad1 = String(h1);
String temperatura2 = String(t2);
String humedad2 = String(h2);
payload = "{";
payload += "\"temp1\":"; payload += temperatura1; payload += ",";
payload += "\"hum1\":"; payload += humedad1; payload += ",";
payload += "\"temp2\":"; payload += temperatura2; payload += ",";
payload += "\"hum2\":"; payload += humedad2; payload += ",";
payload += "\"RefIsOn\":"; payload += String(RefOn); payload += ",";
payload += "\"DoorIsClosed\":"; payload += String(DoorOpen);
payload += "}";
}
void PublicarMensaje(){
char attributes[100];
payload.toCharArray( attributes, 100);
client.publish( "RefrigeratorMonitor", attributes ); // Por favor cambiar el topico "URSensorTemperatura" por otro diferente
Serial.println( attributes );
}