class Pulsador{
private:
int pin;
bool activeOn;
bool presionado;
bool presionadoAntes;
int buffer[5];
public:
Pulsador(int pin, bool activeOn){
this->pin = pin;
this->activeOn = activeOn;
pinMode(this->pin, INPUT_PULLUP);
for (int i=0 ; i<5 ; i++){
buffer[i] = 0;
}
}
~Pulsador(){}
// Esto es medio confuso como lo llamé porque depende desde donde lo mires. Desde el punto de vista del botón sí, es descendente
// pero del punto de vista de la variable presionado es ascendente, pues antes no estaba y ahora sí.
// Decidí dejarla así porque se me hizo más entendible a mí (esta parte es básicamente igual al ejemplo que hizo usted).
bool descendente(){
if(!presionadoAntes && this->presionado){
return(true);
} else{
return(false);
}
}
void actualizar(){
this->presionadoAntes = this->presionado;
buffer[0] = buffer[1];
buffer[1] = buffer[2];
buffer[2] = buffer[3];
buffer[3] = buffer[4];
buffer[4] = digitalRead (this->pin);
if (buffer[0] == buffer[1] && buffer[1] == buffer[2] && buffer[2] == buffer[3] && buffer[3] == buffer[4] && buffer[4] == this->activeOn)
this->presionado = true;
if (buffer[0] == buffer[1] && buffer[1] == buffer[2] && buffer[2] == buffer[3] && buffer[3] == buffer[4] && buffer[4] == !this->activeOn)
this->presionado = false;
}
};
enum Estados {
ESTADO_1, ESTADO_2, ESTADO_3, ESTADO_4, ESTADO_5
};
Estados estadoActual = ESTADO_1;
Pulsador pulsador1(3, LOW);
Pulsador pulsador2(4, LOW);
Pulsador pulsador3(5, LOW);
unsigned long tiempoEntrada = 0;
unsigned long tiempoPasado = 0;
void setup() {
Serial.begin(9600);
Serial.println("Empezó en el estado 1. Cuando pasen 10s va a pasar al estado 2.");
}
void loop() {
switch(estadoActual){
case ESTADO_1:
estado1();
break;
case ESTADO_2:
estado2();
break;
case ESTADO_3:
estado3();
break;
case ESTADO_4:
estado4();
break;
case ESTADO_5:
estado5();
break;
}
}
void estado1(){
tiempoEntrada = millis();
if(tiempoEntrada - tiempoPasado >= 10000){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_2;
Serial.println("Se fue del estado 1 al estado 2 porque pasaron 10s.");
}
}
void estado2(){
tiempoEntrada = millis();
pulsador1.actualizar();
if(tiempoEntrada - tiempoPasado >= 20000){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_3;
Serial.println("Se fue del estado 2 al estado 3 porque pasaron 20s.");
} else if (pulsador1.descendente()){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_3;
Serial.println("Se fue del estado 2 al estado 3 porque presionó el pulsador 1.");
}
}
void estado3(){
tiempoEntrada = millis();
pulsador2.actualizar();
pulsador3.actualizar();
if((pulsador2.descendente())){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_4;
Serial.println("Se fue del estado 3 al estado 4 porque presionó el pulsador 2.");
}
if((pulsador3.descendente())){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_5;
Serial.println("Se fue del estado 3 al estado 5 porque presionó el pulsador 3.");
}
}
void estado4(){
tiempoEntrada = millis();
if(tiempoEntrada - tiempoPasado >= 10000){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_1;
Serial.println("Se fue del estado 4 al estado 1 porque pasaron 10s.");
}
}
void estado5(){
tiempoEntrada = millis();
if(tiempoEntrada - tiempoPasado >= 10000){
tiempoPasado = tiempoEntrada;
estadoActual = ESTADO_1;
Serial.println("Se fue del estado 5 al estado 1 porque pasaron 10s.");
}
}