#include <stdint.h>
#include <Servo.h>
#include <LiquidCrystal.h>
typedef enum estados {SA, S2, S3, S4, SC} estados;
estados estadoInicial = SA;
estados estadoFinal = SA;
LiquidCrystal pantalla(A0, A1, A2, A3, A4, A5);
Servo puerta;
const uint8_t LED0 = 2;
const uint8_t LED1 = 3;
const uint8_t LED2 = 4;
const uint8_t LED3 = 5;
const uint8_t sensor1 = 6;
const uint8_t sensor2 = 7;
const uint8_t sensor3 = 8;
const uint8_t alarma = 9;
const long interval = 1000;
unsigned long previousMillis = 0;
void setup() {
pinMode(sensor1, INPUT_PULLUP);
pinMode(sensor2, INPUT_PULLUP);
pinMode(sensor3, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(alarma, OUTPUT);
pantalla.begin(16, 2);
Serial.begin(9600);
puerta.attach(10);
}
void loop() {
bool estadoS2 = digitalRead(sensor1);
bool estadoS3 = digitalRead(sensor2);
bool estadoS4 = digitalRead(sensor3);
switch (estadoInicial){
case SA:
puerta.write(0);
pantalla.clear();
pantalla.print("Sistema");
pantalla.setCursor(0,1);
pantalla.print("Desactivado");
delay(2000);
pantalla.clear();
if(estadoS2 == LOW)
estadoFinal = S2;
else
estadoFinal = SA;
break;
case S2:
if(estadoS3 == LOW)
estadoFinal = S3;
else
estadoFinal = S2;
break;
case S3:
if(estadoS4 == LOW)
estadoFinal = S4;
else
estadoFinal = S3;
break;
case S4:
if(estadoS4 == LOW) {
delay(2000);
puerta.write(90);
estadoFinal = S4; }
else
estadoFinal = SC;
break;
case SC:
estadoFinal = SA;
break;
}
switch (estadoInicial){
case SA:
digitalWrite(LED0, HIGH);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
break;
case S2:
digitalWrite(LED0, LOW);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
break;
case S3:
digitalWrite(LED0, LOW);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(alarma, HIGH);
break;
case S4:
digitalWrite(LED0, LOW);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(alarma, HIGH);
break;
case SC:
digitalWrite(LED0, LOW);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
break;
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
estadoInicial = estadoFinal;
previousMillis = currentMillis;
}
delay(1);
}