#include <ArduinoJson.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
Servo myservo;
StaticJsonDocument<200> doc2;
StaticJsonDocument<200> doc;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.mqttdashboard.com";
WiFiClient espClient;
PubSubClient client(espClient);
const int DHT_PIN = 15;
DHTesp dhtSensor;
String m_luces = "";
char buffer2[300];
int status = WL_IDLE_STATUS;
String sr2 = "";
char rec[50];
String inputString = "";
float gf = 0.0, vel = 0.0;
int gi = 0;
String alarma = "";
const int trigPin = 4; // Debes asignar el número correcto de pin
const int echoPin = 5; // Debes asignar el número correcto de pin
const int pinLedTemperatura = 12; // Pin para el LED de temperatura
const int pinLedNivel = 14; // Pin para el LED de nivel
const int pinLedAmbos = 18; // Pin para el LED de ambas alarmas
unsigned long duration;
float distanceCm;
const float SOUND_SPEED = 0.0343; // Velocidad del sonido en cm/μs
void setup() {
pinMode(2, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pinLedTemperatura, OUTPUT);
pinMode(pinLedNivel, OUTPUT);
pinMode(pinLedAmbos, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
myservo.setPeriodHertz(50);
myservo.attach(13, 500, 2400);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("dirección IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Esperando Conexión MQTT...");
if (client.connect("Natalia")) {
Serial.println("connectada");
client.subscribe("NataliaActuador");
} else {
Serial.print("falla, rc=");
Serial.print(client.state());
Serial.println("Intento de nuevo en 5 segundos");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * SOUND_SPEED / 2;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Verifica si se supera el límite de temperatura y enciende el LED correspondiente
if (data.temperature > 50) {
digitalWrite(pinLedTemperatura, HIGH);
} else {
digitalWrite(pinLedTemperatura, LOW);
}
// Verifica si se supera el límite de nivel y enciende el LED correspondiente
if (distanceCm > 300) {
digitalWrite(pinLedNivel, HIGH);
} else {
digitalWrite(pinLedNivel, LOW);
}
// Verifica si se superan ambos límites y enciende el LED correspondiente
if (data.temperature > 50 && distanceCm > 300) {
digitalWrite(pinLedAmbos, HIGH);
} else {
digitalWrite(pinLedAmbos, LOW);
}
// Publica los datos en el MQTT
if (data.temperature > 30) alarma = "ON";
if (data.temperature < 30) alarma = "OFF";
doc["Temp"] = data.temperature;
doc["Hum"] = data.humidity;
doc["Niv"] = distanceCm;
doc["Alarm"] = alarma;
char buffer[300];
serializeJson(doc, buffer);
client.publish("NataliaSensor", buffer);
delay(2000);
}
void callback(char* topic, byte* payload, unsigned int length) {
sr2 = "";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
rec[i] = payload[i];
sr2 += rec[i];
inputString = sr2;
}
char msg2[inputString.length()];
inputString.toCharArray(msg2, inputString.length() + 1);
StaticJsonDocument<200> doc2;
DeserializationError error = deserializeJson(doc2, msg2);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
int Pos = doc2["SetServo"];
String Led = doc2["SetLed"];
String Pos2 = doc2["SetValvula"];
if (Led.equals("false")) {
digitalWrite(2, LOW);
}
if (Led.equals("true")) {
digitalWrite(2, HIGH);
}
int pos_esc = map(Pos, 0, 100, 0, 180);
myservo.write(pos_esc);
if (Pos2.equals("false")) {
myservo.write(0);
}
if (Pos2.equals("true")) {
myservo.write(180);
}
}