#include "thingProperties.h"
#include <WiFi.h>
#define PIN_RELAY 13 // Define el pin del relay
#define PIN_LDR 34 // Define el pin para el sensor LDR
#define LUX_THRESHOLD 2500 // Umbral de luminosidad para activar el relay
const long delay_interval = 2000; // Intervalo entre lecturas del sensor
void setup() {
pinMode(PIN_RELAY, OUTPUT); // Configura el pin del relay como salida
Serial.begin(115200); // Inicia la comunicación serial
// Connect to Arduino IoT Cloud
initProperties();
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
}
void loop() {
int ldr_current = analogRead(PIN_LDR); // Lee el estado del sensor LDR
// detectar cambio de estado LDR
if (ldr_changed(ldr_current))
{
Serial.print("Estado LDR: ");
Serial.println(ldr_current);
}
// modo manual o automático
if (is_mode_auto() && ldr_changed(ldr_current)) {
Serial.println("Modo Automático");
Serial.println(ldr_current);
if (ldr_current > LUX_THRESHOLD) {
changeRelayState(true, "Nivel de luz BAJO, activando relay.");
} else {
changeRelayState(false, "Nivel de luz SUFICIENTE, desactivando relay.");
}
}
// Modo manual
else if (is_mode_manual() && relay_changed()) {
Serial.println("Modo Manual");
changeRelayState(switch_state, switch_state ? "Relay ENCENDIDO de forma remota." : "Relay APAGADO de forma remota.");
}
ldr_state = ldr_current; // Actualiza el último estado LDR
ArduinoCloud.update(); // Actualiza valores en Arduino Cloud
delay(delay_interval); // Pausa antes de la próxima iteración
}
bool is_mode_auto()
{
return !switch_manual;
}
bool is_mode_manual()
{
return switch_manual && relay_state != switch_state;
}
bool ldr_changed(int ldr_current)
{
return ldr_current != ldr_state;
}
bool relay_changed()
{
return relay_state != switch_state;
}
// Función para cambiar el estado del relay y registrar el cambio
void changeRelayState(bool current_state, const char* comment) {
// cambia el estado del ralay
digitalWrite(PIN_RELAY, current_state ? HIGH : LOW);
Serial.println(comment);
// actualiza el estado del relay
relay_state = current_state;
}
// Maneja el cambio de estado cuando el interruptor manual es activado o desactivado
void onSwitchManualChange() {
Serial.print("El control manual cambió a: ");
Serial.println(switch_manual ? "ON" : "OFF");
}
// Maneja el cambio de estado del relay cuando el interruptor de estado cambia
void onSwitchStateChange() {
Serial.print("El interuptor remoto cambió a: ");
Serial.println(switch_state ? "ON" : "OFF");
}