#define PWM_FREQ 50
#define PWM_RESOLUTION 16
class Acceso {
private:
int pinPIR;
int pinLED;
int pinServo;
bool abierto = false;
unsigned long tiempoApertura = 0;
uint32_t dutyCerrado = 3277; // 1 ms
uint32_t dutyAbierto = 6554; // 2 ms
public:
Acceso(int pir, int led, int servo) {
pinPIR = pir;
pinLED = led;
pinServo = servo;
}
void iniciar() {
pinMode(pinPIR, INPUT_PULLDOWN);
pinMode(pinLED, OUTPUT);
ledcAttach(pinServo, PWM_FREQ, PWM_RESOLUTION);
ledcWrite(pinServo, dutyCerrado);
Serial.print("Acceso iniciado en servo ");
Serial.println(pinServo);
}
void detectar() {
if (digitalRead(pinPIR) == HIGH) {
digitalWrite(pinLED, HIGH);
Serial.println("Movimiento detectado");
} else if (!abierto) {
digitalWrite(pinLED, LOW);
}
}
void abrir() {
Serial.println("ABRIENDO");
ledcWrite(pinServo, dutyAbierto);
abierto = true;
tiempoApertura = millis();
digitalWrite(pinLED, HIGH);
}
void cerrar() {
Serial.println("CERRANDO");
ledcWrite(pinServo, dutyCerrado);
abierto = false;
digitalWrite(pinLED, LOW);
}
void cierreAutomatico(unsigned long tiempoMax) {
if (abierto && millis() - tiempoApertura >= tiempoMax) {
cerrar();
}
}
};
// ===== OBJETOS =====
Acceso entradaPrincipal(32, 25, 18);
Acceso patio(33, 26, 19);
// ===== SETUP =====
void setup() {
Serial.begin(115200);
delay(500);
entradaPrincipal.iniciar();
patio.iniciar();
Serial.println("Modulo ACCESOS listo");
Serial.println("E = Abrir Entrada | P = Abrir Patio | C = Cerrar");
}
// ===== LOOP =====
void loop() {
entradaPrincipal.detectar();
patio.detectar();
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd == "E") entradaPrincipal.abrir();
else if (cmd == "P") patio.abrir();
else if (cmd == "C") {
entradaPrincipal.cerrar();
patio.cerrar();
}
}
entradaPrincipal.cierreAutomatico(5000);
patio.cierreAutomatico(5000);
delay(100);
}
CUARTOS
BAÑO
COCINA
SALA/COMEDOR
PATIO
MASTER
ACCESOS