#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
typedef enum estados {s0, s1, s2,s3, m2, m3, m4, m5, m6, mma, mmb, mmc, mmd, mme } estados;
estados estadoActual = s0;
estados estadoFuturo = s0;
const uint8_t botonMenu = 13;
const uint8_t botonRegreso = 12;
const uint8_t botonB = 11; //mecanico
const uint8_t botonA = 10; // manual
const uint8_t botonSubir = 9;
const uint8_t botonBajar = 8;
const uint8_t botonSelec = 7; //mecanico
const long interval = 2000; // interval at which to blink (milliseconds)
unsigned long previousMillis = 0;
void setup() {
// put your setup code here, to run once:
lcd.init();
lcd.backlight();
pinMode(botonMenu, INPUT);
pinMode(botonRegreso, INPUT);
pinMode(botonB, INPUT); //AUTOMATICO
pinMode(botonA, INPUT);//MANUAL
pinMode(botonSubir, INPUT);//Subir
pinMode(botonBajar, INPUT);//Bajar
pinMode(botonSelec, INPUT);//Seleccionar
}
void loop() {
// lectura de las entradas
bool estadoMenu = digitalRead(botonMenu);
bool estadoRegreso = digitalRead(botonRegreso);
bool estadoBB = digitalRead(botonB);
bool estadoBA = digitalRead(botonA);
bool estadoSub = digitalRead(botonSubir);
bool estadoBajar= digitalRead(botonBajar);
bool estadoSelec = digitalRead(botonSelec);
// transiciones de estado
switch (estadoActual){
case s0:
if(estadoMenu == LOW){
estadoFuturo = s1;
}
else
estadoFuturo = s0;
break;
//Modo
case s1:
if(estadoRegreso == LOW){
estadoFuturo = s0;
}
else if(estadoBB == LOW){
estadoFuturo = s2;
}
else if(estadoBA == LOW){
estadoFuturo = s3;
}
break;
//Menú Automatico
case s2:
if(estadoSub == LOW){
estadoFuturo = s2;
}
else if(estadoBajar == LOW){
estadoFuturo = m2;
}
else if(estadoSelec== LOW){
estadoFuturo = mma;
break;}
case m2:
if(estadoSub == LOW){
estadoFuturo = s2;
}
else if(estadoBajar == LOW){
estadoFuturo = m3;
}
else if(estadoSelec== LOW){
estadoFuturo = mmb;
break;}
case m6:
if(estadoSub == LOW){
estadoFuturo = m5;
}
else if(estadoBajar == LOW){
estadoFuturo = m6;
}
else if(estadoSelec== LOW){
estadoFuturo = s1;
break;}
}
// Salidas
switch (estadoActual){
case s0: // apagado
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ventilador");
lcd.setCursor(0,1);
lcd.print("Mecanico");
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Vent. Mecanico");
lcd.setCursor(0,1);
lcd.print(" A) Menu");
delay(2000);
delay(2000);
break;
case s1: // Menu de Modo
lcd.clear();
lcd.print(" A) Manual ");
lcd.setCursor(0,1);
lcd.print(" B) Automatico");
delay(2000);
lcd.clear();
lcd.print(" B) Automatico ");
lcd.setCursor(0,1);
lcd.print(" C) Regresar");
delay(2000);
break;
case s3: //Modo Manual
lcd.clear();
lcd.print(" Modo Manual ");
lcd.setCursor(0,1);
lcd.print(" Activado ");
delay(2000);
lcd.clear();
lcd.print(" Presionar Para generar Respiración");
lcd.setCursor(0,1);
lcd.print(" Activado ");
delay(2000);
break;
case mma:
lcd.clear();
lcd.print(" conejo");
lcd.setCursor(0,1);
lcd.print(" B)pelo");
delay(2000);
break;
case s2: // Menu Automatico
lcd.clear();
lcd.print(" A)FIO2 <<");
lcd.setCursor(0,1);
lcd.print(" B)Frec. Resp");
delay(2000);
break;
case m2: // Menu Automatico
lcd.clear();
lcd.print(" A)FIO2 ");
lcd.setCursor(0,1);
lcd.print(" B)Frec. Resp <<");
delay(2000);
break;
case m3: // Menu Automatico
lcd.clear();
lcd.print(" C)T.Insp <<");
lcd.setCursor(0,1);
lcd.print(" D)Vol.Corr");
delay(2000);
break;
case m4: // Menu Automatico
lcd.clear();
lcd.print(" E)Iniciar<<");
lcd.setCursor(0,1);
lcd.print(" F)Regreso<<");
delay(2000);
break;
case m5: // Menu Automatico
lcd.clear();
lcd.print(" E)Iniciar");
lcd.setCursor(0,1);
lcd.print(" F)Regreso <<");
delay(2000);
break;
}
// actualización de estado
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
estadoActual = estadoFuturo;
previousMillis = currentMillis;
}
delay(1);
}