#include <WiFi.h>
#include <PubSubClient.h>
#include <AccelStepper.h> // Librería para el motor paso a paso
const int LDR_PIN = 34;
const int rainSensorPin = 35;
const int openLimitSwitchPin = 32;
const int closeLimitSwitchPin = 33;
//Conexion de WiFi.
const char* ssid = "GabiFacu";
const char* password = "19562506";
//Conexion al Broker MQTT
const char* mqtt_server = "192.168.100.9";
const int mqtt_port = 1883;
const char* mqtt_user = "";
const char* mqtt_password = "";
// Configuración del motor paso a paso
const int stepPin = 25; // Pin para los pasos
const int dirPin = 26; // Pin para la dirección
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
WiFiClient espClient;
PubSubClient client(espClient);
bool abrirTecho = false;
bool cerrarTecho = false;
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Mensaje recibido en el tema: ");
Serial.print(topic);
Serial.print(". Mensaje: ");
String messageString;
for (int i = 0; i < length; i++) {
messageString += (char)message[i];
}
Serial.println(messageString);
if (String(topic) == "ComandoTecho") {
if (messageString == "abrir") {
abrirTecho = true;
cerrarTecho = false;
Serial.println("Comando recibido: Abrir Techo");
} else if (messageString == "cerrar") {
cerrarTecho = true;
abrirTecho = false;
Serial.println("Comando recibido: Cerrar Techo");
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(rainSensorPin, INPUT);
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
// Configuración de los finales de carrera como entrada
pinMode(openLimitSwitchPin, INPUT_PULLUP);
pinMode(closeLimitSwitchPin, INPUT_PULLUP);
WiFi.begin(ssid, password);
Serial.println("Conectando al WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("...");
}
Serial.println("¡Conectado al WiFi!");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
reconnect();
// Configuración inicial del motor paso a paso
stepper.setMaxSpeed(1000); // Ajusta la velocidad máxima
stepper.setAcceleration(500); // Ajusta la aceleración
}
void reconnect() {
while (!client.connected()) {
Serial.print("Intentando conexión MQTT...");
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println("conectado");
client.subscribe("Test1");
client.subscribe("ComandoTecho");
} else {
Serial.print("Error de conexión, rc=");
Serial.print(client.state());
Serial.println(" intenta nuevamente en 5 segundos");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
static unsigned long lastMsg = 0;
unsigned long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
String message = "Hola desde ESP32";
Serial.print("Publicando mensaje: ");
Serial.println(message);
client.publish("Test1", message.c_str());
}
digitalWrite(dirPin, LOW);
int ldrValue = analogRead(LDR_PIN);
int rainValue = analogRead(rainSensorPin);
Serial.print("Valor del sensor de lluvia: ");
Serial.println(rainValue);
Serial.print("Valor LDR: ");
Serial.println(ldrValue);
String mensajeLDR = "Luz: ";
client.publish("SensorLuz", mensajeLDR.c_str());
String mensajeLluvia = "Lluvia: ";
if (rainValue > 1500) {
Serial.println("¡Lluvia detectada!");
mensajeLluvia += "Esta lloviendo";
cerrarTecho = true;
} else {
Serial.println("No hay lluvia.");
mensajeLluvia += "No esta lloviendo";
if (ldrValue < 1000){
Serial.println(" ¡Mucha luz!");
mensajeLDR += "Mucha luz";
client.publish("SensorLuz", mensajeLDR.c_str());
abrirTecho = true;
}
else{
Serial.println("¡Poca Luz!");
mensajeLDR += "Poca luz";
client.publish("SensorLuz", mensajeLDR.c_str());
cerrarTecho = true;
}
}
client.publish("SensorLluvia", mensajeLluvia.c_str());
if (digitalRead(openLimitSwitchPin) == HIGH) {
Serial.println("El techo está completamente abierto.");
client.publish("EstadoTecho", "Techo abierto");
stepper.stop(); // Detiene el motor si se alcanzó el final de carrera de apertura
}
else if (digitalRead(closeLimitSwitchPin) == HIGH) {
Serial.println("El techo está completamente cerrado.");
client.publish("EstadoTecho", "Techo cerrado");
stepper.stop(); // Detiene el motor si se alcanzó el final de carrera de cierre
}
else {
// Si no está en los finales de carrera, decide el movimiento
if (abrirTecho && !cerrarTecho) {
if (digitalRead(openLimitSwitchPin) == LOW) { // Si el techo no está completamente abierto
stepper.moveTo(500); // Mueve el motor hacia la apertura
Serial.println("Abriendo el techo...");
}
} else if (cerrarTecho && !abrirTecho) {
if (digitalRead(closeLimitSwitchPin) == LOW) { // Si el techo no está completamente cerrado
stepper.moveTo(0); // Mueve el motor hacia el cierre
Serial.println("Cerrando el techo...");
}
}
}
for (int i = 0; i < 50; i++){
digitalWrite(stepPin, LOW);
delay(10);
digitalWrite(stepPin, HIGH);
delay(10);
}
delay(500);
}