//NODEMMCU PUBLISHER
//SUSCRIPTOR.http://www.hivemq.com/demos/websocket-client/
#include <WiFi.h>
#include <PubSubClient.h>
void setup_wifi();
void procesar_mensajes(char *topic, byte *mensaje, unsigned int longitud);
void publicar();
//conexion a internet
WiFiClient BoardESP32;
PubSubClient client_mqtt(BoardESP32);
// WiFi network
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker // IP Raspberry Pi// COMPUTADORA
const char *broker = "broker.mqtt-dashboard.com";
int puerto = 1883;
const char *id_cliente = "clientId-IcOCV9V75m";//Escribe tu nombre. #el identificador tiene que ser único
//variables
const char *topico1 = "LED_NEW"; //topico al que me suscribo
const char *topico2 = "Publish_LED"; //topico en el que voy a publicar
long now = millis();
int DatoRecibido = 0;
const int H = 4;
const int T = 16;
const int C = 17;
const int U = 5;
const int R = 12;
const int V = 14;
const int A = 27;
int HU, TEM, CO, UV, riego, ventilacion, alarma;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(R, OUTPUT);
pinMode(V, OUTPUT);
pinMode(A, OUTPUT);
pinMode(H, INPUT);
pinMode(T, INPUT);
pinMode(C, INPUT);
pinMode(U, INPUT);
setup_wifi();
//Conexion al broker
client_mqtt.setServer(broker, puerto);
if (client_mqtt.connect(id_cliente)) {
Serial.println("Connected to MQTT Broker!");
}
else {
Serial.println("Connected to MQTT failed...");
}
if (client_mqtt.connect(id_cliente)) {
Serial.print("Conectado con broker ");
Serial.println(broker);
}
else {
Serial.print("No se pudo conectar con broker");
}
//Activar la rutina para recibir mensajes
client_mqtt.setCallback(procesar_mensajes);
//Suscribirse a un tópico
if (client_mqtt.subscribe(topico1)) {
Serial.printf("Suscrito a topico %s\n", topico1);
}
}
void publicar()
{
int EdoSensor=riego;
char EdoSensorString [5];
itoa(EdoSensor,EdoSensorString,10);
client_mqtt.publish(topico2, EdoSensorString);
}
void setup_wifi() {
Serial.begin(115200);
Serial.print("Connecting to WiFi");
//funcion wifi que se conecta a la red (inicializa la red)
WiFi.begin(ssid, password);
//condicion cuando se esta conectando
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.print(" Connected: ");
//extrae su ip
Serial.println(WiFi.localIP());
}
void procesar_mensajes(char *topic, byte *mensaje, unsigned int longitud) {
char mensaje_local[100] = {0};
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Mensaje recibido: ");
for (int i = 0; i < longitud; i++) {
Serial.write(mensaje[i]);
mensaje_local[i] = mensaje[i];
}
Serial.println();
DatoRecibido = strtol(mensaje_local, 0, 10);
Serial.print("Dato recibido tipo long: ");
Serial.println(DatoRecibido);
}
void loop(){
HU = digitalRead(H);
TEM = digitalRead(T);
CO = digitalRead(C);
UV = digitalRead(U);
riego = ((!HU) && TEM);
ventilacion = (HU && TEM) || (HU && CO) || (TEM && CO) || (CO && UV) || (TEM && (!UV));
alarma = ((!HU) && (!TEM) && CO) || (HU && TEM && CO) || (TEM && (!CO) && UV);
Serial.print("R");
Serial.println(riego);
Serial.print("V");
Serial.println(ventilacion);
Serial.print("A");
Serial.println(alarma);
Serial.print("H: ");
Serial.print(HU);
Serial.print(", T: ");
Serial.print(TEM);
Serial.print(", C: ");
Serial.print(CO);
Serial.print(", U: ");
Serial.println(UV);
delay(3000);
if (riego == 1){
digitalWrite(R, HIGH);
//delay(1000);
//digitalWrite(R, LOW);
}
if (ventilacion == 1){
digitalWrite(V, HIGH);
//delay(1000);
//digitalWrite(V, LOW);
}
if (alarma == 1){
digitalWrite(A, HIGH);
//delay(1000);
//digitalWrite(A, LOW);
}
delay(3000);
digitalWrite(A, LOW);
digitalWrite(R, LOW);
digitalWrite(V, LOW);
publicar();
now = millis();
//Esta funcion se debe llamar para mantener activa la conexion con el broker
client_mqtt.loop();
Serial.println(DatoRecibido);
}
//int port = 1833;