/*
Implementación de un sistema IoT para un sistema De monitoreo de Temp y Hum
*/
#include <ArduinoJson.h> // Biblioteca para el formato JSON
#include <WiFi.h> //Biblioteca para el manejo de WIFI del esp8266
#include <PubSubClient.h> //Biblioteca para el manejo del protocolo MQTT
StaticJsonDocument<200> doc;
const char* ssid = "Wokwi-GUEST"; //Escribe la identificación de tu red
const char* password = ""; //Escribe el password de tu red
const char* mqtt_server = "broker.mqttdashboard.com"; // Escribe la dirección de tu PC asignada por tu red
WiFiClient espClient; // Crea una instancia tipo WifiCliente llamado espClient
PubSubClient client(espClient); //Gestiona la Biblioteca de publicación-subscripción para el cliente creado
String Nivel="";
long lastMsg = 0; // Declaración de variable para conteo de tiempo de transmisión de mensaje
char msg[50]; // Decalaración de buffer para guardar el mensaje recibido
String sr2 = ""; //Declaración de la variable sr2 para guardar la cadena de caracteres recibidos
String inputString = ""; //Declaración de variable auxiliares para datos recibidos
static char buffer2[6]; //Declaración de variables para almacenar caracteres
char rec[50]; //Declaración de varible auxiliar para la recepción de mensajes
void setup() {
pinMode(14,INPUT);
pinMode(13,INPUT);
pinMode(12,INPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(18,OUTPUT);
pinMode(2,OUTPUT);
Serial.begin(115200); //Inicializa la comunicación serial a una velocidad de 115200
setup_wifi(); //Inicializa la Biblioteca WIFI
client.setServer(mqtt_server, 1883); //Inicializa el servidor con las dirección descrita en el encabezado y el puerto que usa
client.setCallback(callback); //Inicializa la función que se activa cuando llegan mensajes
}
void setup_wifi() {
delay(10); // espera 10 milisegundos
Serial.println(); // Imprime un espacio de linea
Serial.print("Conectando a "); // Imprime la leyenda "Conectando a"
Serial.println(ssid); // Imprime la identificación de la red a al que se conecta
WiFi.begin(ssid, password); // Realiza la conexión a la red configurada usando el password configurado en el encabezado
while (WiFi.status() != WL_CONNECTED) { // Espera mientras se establece la conexión
delay(500); // Espera 500 milisegundos
Serial.print("."); // Imprime en la terminal "." hasta que se logre la conexión
}
Serial.println(""); //Imprime en la terminal un espacio
Serial.println("WiFi connectada"); //Imprime en la terminal un espacio
Serial.println("dirección IP: "); //Imprime en la terminal "dirección IP: "
Serial.println(WiFi.localIP()); //Imprime en la terminal "dirección IP asignada al microcontrolador
}
void reconnect() { //función para la reconexión
while (!client.connected()) { //Espera hasta que se establezca la reconexión
Serial.print("Esperando Conexión MQTT...");
if (client.connect("ESPCliente")) { //Se conecta como cliente con el nombre ESP8266Cliente
Serial.println("connectada"); //Imprime en la terminal conectado con el cliente
client.subscribe("Actuadores/CTM"); //se suscribe al tópico invernadero/actuadores
} else { // si no logra conectarse
Serial.print("falla, rc="); //Imprime en la terminal "falla, rc="
Serial.print(client.state()); //Imprime en la terminal el tipo de falla de conexión (un múmero)
Serial.println("Intento de nuevo en 5 segundos"); //Imprime en la terminal "Intento de nuevo en 5 segundos"
delay(5000); //Espera 5 segundos
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if(digitalRead(13))Nivel="Bajo";
if(digitalRead(13) && digitalRead(12) )Nivel="Medio";
if(digitalRead(13) && digitalRead(12) && digitalRead(14))Nivel="Alto";
doc["Nivel"] =Nivel;
char buffer[300];
serializeJson(doc, buffer);
client.publish("Sensores/CTM",buffer);
delay(2000);
}
void callback(char* topic, byte* payload, unsigned int length) {
sr2 = ""; //Limpio la variable donde se guardan los mensajes recibidos
for (int i = 0; i < length; i++) { //Recorre el mensaje recibido de acuerdo a su longitud
Serial.print((char)payload[i]); //Imprime en la terminal serial el mensaje recibido
rec[i] = payload[i]; // guardo lo recibido en una variable auxiliar
sr2 += rec[i]; // Concatena los mensajes enviados en la varible sr2
inputString = sr2; // guardo todo el mensaje en la variable inputString
}
char msg2[inputString.length()]; // Se crea una variable con el tamaño del valor de longitud del mensaje
Serial.println(msg2);
inputString.toCharArray(msg2, inputString.length() + 1);
StaticJsonDocument<200> doc2;
DeserializationError error = deserializeJson(doc2, msg2);
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
String L1 = doc2["L1"];
String L2 = doc2["L2"];
String L3 = doc2["L3"];
String EV = doc2["EV"];
if (L1.equals("true")) {
digitalWrite(5, HIGH);
}
if (L1.equals("false")) {
digitalWrite(5,LOW);
}
if (L2.equals("false")) {
digitalWrite(4,LOW);
}
if (L2.equals("true")) {
digitalWrite(4, HIGH);
}
if (L3.equals("false")) {
digitalWrite(18, LOW);
}
if (L3.equals("true")) {
digitalWrite(18, HIGH);
}
}