#include <PubSubClient.h>
#include <WiFi.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "161.132.41.13";
const int mqttPort = 1883;
const char* mqttUser = "";
const char* mqttPassword = "";
WiFiClient espClient;
PubSubClient client(espClient);
const int PotPin = 34;
const int pinLedOk = 26;
const char* sensor1Topic = "lectura/sensor1";
const char* sensor2Topic = "lectura/sensor2";
const char* relay1Topic = "control/relay1";
const char* relay2Topic = "control/relay2";
#define DHTPIN 33
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
setup_wifi();
pinMode(2, OUTPUT);
pinMode(15, OUTPUT);
client.setServer(mqttServer, mqttPort);
dht.begin();
pinMode(pinLedOk, OUTPUT);
setupMQTT();
}
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("Conectado a la red WiFi");
}
void loop() {
int potValue = analogRead(PotPin);
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
Serial.print("Valor del potenciometro: ");
Serial.println(potValue);
Serial.print("Humedad: ");
Serial.print(humidity);
Serial.print("% Temperatura: ");
Serial.print(temperature);
Serial.println("°C");
if (!client.connected()) {
reconnect();
}
client.loop();
sendPotValue(potValue);
sendDHTValues(humidity, temperature);
delay(1000);
}
void sendPotValue(int value) {
char message[50];
snprintf(message, 50, "%d", value);
client.publish(sensor1Topic, message);
}
void sendDHTValues(float humidity, float temperature) {
char humidityMsg[50];
snprintf(humidityMsg, 50, "%.2f", humidity);
char temperatureMsg[50];
snprintf(temperatureMsg, 50, "%.2f", temperature);
client.publish(sensor2Topic, humidityMsg);
client.publish(sensor2Topic, temperatureMsg);
}
void controlRelay(const char* topic, const char* message) {
if (strcmp(topic, relay1Topic) == 0) {
if (strcmp(message, "ON") == 0) {
// Encender relé 1
digitalWrite(2, HIGH);
Serial.println("Relé 1 encendido");
} else if (strcmp(message, "OFF") == 0) {
// Apagar relé 1
digitalWrite(2, LOW);
Serial.println("Relé 1 apagado");
}
} else if (strcmp(topic, relay2Topic) == 0) {
if (strcmp(message, "ON") == 0) {
// Encender relé 2
digitalWrite(15, HIGH);
Serial.println("Relé 2 encendido");
} else if (strcmp(message, "OFF") == 0) {
// Apagar relé 2
digitalWrite(15, LOW);
Serial.println("Relé 2 apagado");
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Intentando conexión MQTT...");
if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
digitalWrite(pinLedOk, HIGH);
Serial.println("conectado");
client.subscribe(relay1Topic);
client.subscribe(relay2Topic);
} else {
Serial.print("falló, rc=");
Serial.print(client.state());
Serial.println(" intentando nuevamente");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensaje recibido [");
Serial.print(topic);
Serial.print("] ");
char receivedMessage[length + 1];
for (int i = 0; i < length; i++) {
receivedMessage[i] = (char)payload[i];
}
receivedMessage[length] = '\0';
Serial.println(receivedMessage);
controlRelay(topic, receivedMessage);
}
void setupMQTT() {
client.setCallback(callback);
}