// ---------------------------- LIBRARIES: ESP32 ---------------------------- //
#include <DHT.h> // Biblioteca para manejar el sensor DHT-22.
#include <WiFi.h> // Biblioteca para manejar la conexión WiFi.
#include <PubSubClient.h> // Biblioteca para manejar el protocolo MQTT.
// CONFIGURACIÓN INICIAL: --------------------------------------------------- //
// Configuración del DHT-22:
const int DHT_PIN = 15;
DHT dht22(DHT_PIN, DHT22);
// Configuración del sensor de humedad de suelo (Potenciómetro).
const int MoisturePin = 34;
// Configuración del sensor de intensidad de luz (Potenciómetro).
const int LightPin = 32;
// Configuración del WIFI.
const char* ssid = "Wokwi-GUEST"; // Nombre de la red.
const char* password = ""; // Contraseña de la red.
WiFiClient espClient;
PubSubClient client(espClient);
// Configuración del Broker.
const char* mqtt_broker = "broker.hivemq.com";
const int mqtt_port = 1883;
// VARIABLES: --------------------------------------------------------------- //
unsigned long lastPublish = 0; // Variable para controlar el intervalo de publicación.
const long publishInterval = 5000; // Intervalo de publicación en milisegundos.
char OutTopic[] = "/UTT/smartGarden/";
char InTopic[] = "UTT/smartGarden/cntrl";
char onevalueTopic[] = "UTT/smartGarden/send/onevalue";
float temperature = 0; // Inicialización de la variable de temperatura.
float moisture = 0; // Inicialización de la variable de humedad.
float light = 0; // Inicialización de la variable de luz.
// SETUP: WIFI -------------------------------------------------------------- //
void setupConnection() {
delay(10);
Serial.println();
Serial.print("Conectando a: "); Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Conectado a Internet.");
Serial.println("Dirección IP: "); Serial.println(WiFi.localIP());
}
// CALLBACK: MQTT------------------------------------------------------------ //
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println();
Serial.print("Mensaje recibido: ["); Serial.print(topic); Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
// RECONNECT: MQTT ---------------------------------------------------------- //
void reconnect() {
while (!client.connected()) {
Serial.println(); Serial.print("Intentando conexión MKTT...");
// Genera un ID único para evitar colisiones.
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// Intento de conexión:
if (client.connect(clientId.c_str())) {
Serial.println(); Serial.println("Conectado.");
client.subscribe(InTopic);
} else {
Serial.println(); Serial.print("Fallo en la conexión, rc="); Serial.println(client.state());
Serial.println("Intentando nuevamente en dos segundos.");
delay(2000); // Demora de dos segundos.
}
}
}
// OBTENER LECTURAS --------------------------------------------------------- //
void getSensorValues() {
temperature = dht22.readTemperature();
moisture = (analogRead(MoisturePin) * 100.0) / 4095.0;
light = (analogRead(LightPin) * 100.0) / 4095.0;
if (isnan(temperature)) {
Serial.println("ERROR: Fallo en las lecturas del sensor DHT-22");
}
if (isnan(moisture)) {
Serial.println("ERROR: Fallo en las lecturas del sensor de humedad de suelo.");
}
if (isnan(light)) {
Serial.println("ERROR: Fallo en las lecturas del sensor de luz.");
}
}
// SETUP: MAIN -------------------------------------------------------------- //
void setup() {
Serial.begin(115200);
delay(2000); // Retardo para permitir la inicialización de los sensores.
setupConnection();
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
}
// LOOP: MAIN --------------------------------------------------------------- //
void loop() {
delay(10);
unsigned long now = millis();
if (!client.connected()) {
reconnect();
} else {
client.loop();
}
// ------------------------------------------------------------------------ //
if (now - lastPublish > publishInterval) {
lastPublish = now;
getSensorValues();
if (isnan(temperature) || isnan(moisture) || isnan(light)) {
return; // Si ocurre un error en la lectura de los datos, estos no son enviados.
}
String JSON_msg = "{\"node\":\"smartGarden\", \"temperature\":" + String(temperature, 2) + ", \"moisture\":" + String(moisture, 2) + ", \"light\":" + String(light, 2) + "}";
Serial.print("Publish message: "); Serial.println(JSON_msg); Serial.println();
char JSON_msg_array[200];
JSON_msg.toCharArray(JSON_msg_array, 200);
Serial.println(JSON_msg_array);
if (client.connected()) {
client.publish(OutTopic, JSON_msg_array);
Serial.print("Published to topic: "); Serial.println(OutTopic);
} else {
Serial.print("ERROR: No se ha podido conectar con el Broker.");
}
}
}
// -------------------------------------------------------------------------- //