Buen día
espero me puedan ayudar a resolver un problema que me he encontrado, les comento el proyecto que estoy realizando:
estoy con un control de acceso, el cual tiene un boton de entrada, dos electroimanes, dos botones para acceso manual y dos chapas electricas.
El funcionamiento es que, al pulsar el boton 1 de entrada 1 vez, se abre la primer puerta (la cual cuenta con un electroiman y una chapa electrica), al pulsar de nuevo el boton 1 por segunda vez se abre la siguiente puerta ( se realiza un conteo para asi saber cuantas veces se ha pulsado el boton y asi mismo saber que puerta abrir), la segunda funcion es abrir manualmente con otros dos botones boton 2 y boton 3, cada uno de los botones ya tiene asignada una puerta para abrirla manuelmente desde el pulso de alguno de ellos, y la tercer funcion ( he ahi mi problema), ya que ahora tengo que pulsar un boton3 manual para abrir la puerta interior y volver a pulsar el boton 1 para abrir la puerta uno, pero necesito interrumpir el conteo que se acciona al pulsar el boton uno por primera vez (entrada) y necesito que el codigo identifique que ya es una salida.
adjunto el codigo: ``
const int Hc = 4; // Huellas
const int Btd1 = 8, Btc2 = 7; //botones
const int chc = 2, cht = 3; // Chapas
const int S1 = 5, S2 = 6; // Electroimanes
int conta = 0; // Variable para el contador
int edo = 0;
int edo1 = 0, edo2 = 0; // estado de sensores
int edo3 = 0, edo4 = 0; // estado de botones
boolean lastButton = LOW; // Estado anterior
boolean currentButton = LOW; // Estado actual
void setup()
{
pinMode(Hc,INPUT); //Pin 4 como una entrada (entrada de pulso del lector de huellas)
pinMode(S1,INPUT); //Pin 5 como una entrada (entrada de pulso de electroiman que controla la puerta de la calle)
pinMode(S2,INPUT); //Pin 6 como una entrada (entrada de pulso de electroiman que controla la puerta de la trampa)
pinMode(Btd1, INPUT); //Pin 8 como una entrada (controla el pulso del boton de salida)
pinMode(Btc2, INPUT); //Pin 7 como una entrada (controla el pulso del boton de la caseta)
pinMode(chc,OUTPUT); //Pin 2 como una salida (controla la chapa de la calle)
pinMode(cht,OUTPUT); //Pin 3 como una salida (controla la chapa de la trampa)
pinMode(b3, INPUT);
}
boolean debounce(boolean last){ // Función antirebote
boolean current = digitalRead(Hc); // esta funcion hace una comparacion en el pulso del lector de huellas
if (last != current) // inicia esperando un estado alto, al momento de recibir el estado alto,
{ // e inmediatamente cambia a estado bajo. (regresa a estado inicial)
delay(5);
current = digitalRead(Hc);
}
return current;
}
void conteo(){ // funcion que hace el conteo en el pulso del lector de huellas
currentButton = debounce(lastButton); // Eliminación de rebote
// Si hay cambio de estado en el botón
if ( lastButton == LOW && currentButton == HIGH){ // en esta funcion se inicia en estado bajo y se espera un estado alto
conta++; //Incrementa el contador
delay (100); // Retardo
}
if(conta == 1){ // se inicia cuando se recibe el primer pulso
hsalida();
}
if(conta == 2){ // se inicia cuando se recibe el segundo pulso
digitalWrite(cht,HIGH); //se abre la chapa de la trampa
delay(50);
conta = 0;
}else{
digitalWrite(cht,LOW);
}
lastButton = currentButton; // Actualiza estado
}
void bcaseta(){ // en esta funcion se espera lel pulso del boton de la caseta para abrir de manera manual la puerta de la calle
if(( edo4 == HIGH && edo == LOW ) && ( edo1 == HIGH && edo2 == HIGH )){ // sensores en estado inicial y el pulso del boton de case
digitalWrite(chc,HIGH);
delay(50);
digitalWrite(chc,LOW);// si se cumplen los pulsos esperados, se abre la puerta de la calle
}else{ // de lo contrario
digitalWrite(chc,LOW); // manten la puerta de la calle cerrada
}
}
void bsalida(){
if(( edo3 == HIGH && edo == LOW ) && ( edo1 == HIGH && edo2 == HIGH )){// si boton interno es pulsado y los 2 sensores son pulsados
digitalWrite(cht, HIGH);
delay(50);
digitalWrite(cht, LOW);
}else{
digitalWrite(cht, LOW);
}
}
void hsalida(){ // en esta funcion se espera lel pulso del boton de la caseta para abrir de manera manual la puerta de la calle
if((edo == HIGH) && (edo1 == HIGH && edo2 == HIGH)){ // sensores en estado inicial y el pulso del boton de caseta
digitalWrite(chc,HIGH); // si se cumplen los pulsos esperados, se abre la puerta de la calle
}else{ // de lo contrario
digitalWrite(chc,LOW); // manten la puerta de la calle cerrada
}
}
void loop() { // funcion principal del programa, en ella se interactua con las sub funciones escritas anteriormente
currentButton = debounce(lastButton); // Eliminación de rebote
edo = digitalRead(Hc); //huella
edo1 = digitalRead(S1); //estado sensor 1 puerta de calle
edo2 = digitalRead(S2); //estado sensor 2 puerta de trampa
edo3 = digitalRead(Btd1); //estado boton 1
edo4 = digitalRead(Btc2); //estado boton caseta
edo5 = digitalRead(b3);
// Si hay cambio de estado en el botón
if (edo1 == HIGH && edo2 == HIGH){ // si sensor 1 y 2 estan cerrados
conteo(); // y se pulsa la huella de calle, se abre chapa de calle y si pulsa nuevamente la huella
}
if (edo4 == HIGH && edo1 == HIGH && edo2 == HIGH){
bcaseta();
}
if (edo3 == HIGH && edo1 == HIGH && edo2 == HIGH){
bsalida();
}
}