#include <Stepper.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <stdlib.h> //Convienrte datos a str
const int sensorGreen = 33;
/*Variables para WiFi*/
const char* ssid= "Wokwi-GUEST"; // Cambiar por la SSID del hogar
const char* clave= ""; // Cambiar por la CLAVE del hogar
/*-------------------*/
/*Variables para MQTT*/
const char* mqttServer="broker.mqttdashboard.com"; //URL del servidor
const int mqttPort=1883; //Puerto para conectarnos al servidor
WiFiClient espClient; //Establece la conexión a una IP y puerto específica
PubSubClient client(espClient); //Recibe los datos de espClient
/*-------------------*/
const int stepsPerRevolutionMotorG = 100;
Stepper motorG(stepsPerRevolutionMotorG, 25, 26, 27, 14);
const int stepsPerRevolutionMotorW = 50;
Stepper waterPump(stepsPerRevolutionMotorW, 4, 0, 2, 15);
void setup() {
motorG.setSpeed(60);
waterPump.setSpeed(30);
pinMode(sensorGreen, INPUT);
Serial.begin(115200);
/*CONEXIÓN A LA RED Wifi*/
Serial.println("");
WiFi.begin(ssid, clave);
while (WiFi.status()!=WL_CONNECTED){
delay(500);
Serial.println("Conectando a la red WiFi...");
}
Serial.println();
Serial.println("ESP32 conectado a la red WiFi :D");
delay(1000);
Serial.println();
/*-------------------*/
/*CONEXIÓN con MQTT*/
client.setServer(mqttServer,mqttPort); //Iniciar conn. SERVIDOR
while(!client.connected()){//Mientras no exista conexión con el servidor
Serial.println("Conectando al Broker MQTT...");
//Usuarios por defecto |client_id| |mqtt user| |passwd|
if(client.connect("","","")){ // Si existe conexión
Serial.println("Estamos conectados al BROKER MQTT");
Serial.println();
}
else{ //No hemos logrado conectarnos
Serial.println("Conexión fallida");
Serial.println(client.state());
delay(2000);
}
/*-------------------*/
}
/*FUNCIÓN PARA LEER LOS MENSAJES RESPECTO A LOS TOPIC SUSCRIPTOS*/
client.setCallback(callback);
}
void loop() {
waterPump.step(stepsPerRevolutionMotorW);
int valueSenGreen = digitalRead(sensorGreen);
//VARIABLE PARA CONVERTIR EL ESTADO BOOLEAN EN CARACTERES
char estado[5];
//FUNCIÓN QUE CONVIERTE NUESTRA VARIABLE a CHAR
dtostrf(valueSenGreen,5,1,estado);
//PUBLICAR VALORES
client.publish("dispensador/comida",estado);
//NOS SUSCRIBIMOS AL TOPIC
client.subscribe("dispensador/config/comida");
client.loop(); //Mantiene viva la conexión con el Broker.
delay(2000);
}
/*CREAR FUNCIÓN callback*/
void callback(char* topic, byte* payload, unsigned int length){
String mensajeC = ""; //Variable para almacenar los mensajes recibidos
/*Desde un bucle for, recorrer toda la longitud del mensaje
y concatenar con la variable |mensaje|*/
for (int i = 0; i < length; i++) {
mensajeC += (char)payload[i]; //Concatenar letra en la variable
}
//Serial.println(mensaje);
Serial.println();
//Condición en caso de estar en el topic: dispensador/config/comida
if (String(topic) == "dispensador/config/comida") {
Serial.println("Estamos en el topic -> dispensador/config/comida");
int valueSenGreen = digitalRead(sensorGreen);
while (valueSenGreen == HIGH) {
// Convertir el mensaje a una cadena de caracteres para comparación
const char* mensajeChar = mensajeC.c_str();
if (strcmp(mensajeChar, "4") == 0) {
motorG.step(stepsPerRevolutionMotorG);
delay(1000);
motorG.step(0);
delay(14400000);
} else if (strcmp(mensajeChar, "5") == 0) {
motorG.step(stepsPerRevolutionMotorG);
delay(1000);
motorG.step(0);
delay(18000000);
} else if (strcmp(mensajeChar, "6") == 0) {
motorG.step(stepsPerRevolutionMotorG);
delay(1000);
motorG.step(0);
delay(21600000);
} else if (strcmp(mensajeChar, "7") == 0) {
motorG.step(stepsPerRevolutionMotorG);
delay(1000);
motorG.step(0);
delay(25200000);
}
}
motorG.step(0);
}
}