Arduino nano y RC522

Hola buenas estoy haciendo un control de acceso mediante un arduino nano y el RC522.

#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <SPI.h>

#define SALIDA 4
#define ENTRADA_OK 3
#define RST_PIN  9    //Pin 9 para el reset del RC522
#define SS_PIN  10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522
int ENTRADA_OKS = 0;

void setup() {
  pinMode(SALIDA, OUTPUT);
  pinMode(ENTRADA_OK, INPUT);
  Serial.begin(9600); //Iniciamos La comunicacion serial
  SPI.begin();        //Iniciamos el Bus SPI
  mfrc522.PCD_Init(); // Iniciamos el MFRC522
  Serial.println("IDENTIFICACION:");
}

byte ActualUID[4]; //almacenará el código del Tag leído
byte Usuario1[4]= {0x45, 0xD2, 0xF5, 0x16};     
byte Usuario2[4]= {0xD1, 0xD2, 0x4A, 0x41};

void loop() {
  
  // Revisamos si hay nuevas tarjetas  presentes
  if ( mfrc522.PICC_IsNewCardPresent()) 
        {  
      //Seleccionamos una tarjeta
            if ( mfrc522.PICC_ReadCardSerial()) 
            {
                  // Enviamos serialemente su UID
                  Serial.print(F("Card UID:"));
                  for (byte i = 0; i < mfrc522.uid.size; i++) {
                          Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                          Serial.print(mfrc522.uid.uidByte[i], HEX);   
                          ActualUID[i]=mfrc522.uid.uidByte[i];          
                  } 
                  Serial.print("     ");                 
                  //comparamos los UID para determinar si es uno de nuestros usuarios  
                  if(compareArray(ActualUID,Usuario1)or(ActualUID,Usuario2)){
                    Serial.println("ACCESO AUTORIZADO");
                    proceso();
                    }                    
                  else
                    Serial.println("ACCESO DENEGADO");
                   } 
                  // Terminamos la lectura de la tarjeta tarjeta  actual
                  mfrc522.PICC_HaltA();

                  
                  
                  
          
            }
      
  }
  
void proceso(){
  ENTRADA_OKS = digitalRead(ENTRADA_OK);
  digitalWrite(SALIDA, HIGH);
  while (digitalRead(ENTRADA_OK) == LOW) {
  digitalWrite(SALIDA, LOW);
  }
  
}

//Función para comparar dos vectores
 boolean compareArray(byte array1[],byte array2[])
{
  if(array1[0] != array2[0])return(false);
  if(array1[1] != array2[1])return(false);
  if(array1[2] != array2[2])return(false);
  if(array1[3] != array2[3])return(false);
  return(true);
}

El problema esta a la hora de activar la salida y verificar la entrada, en este apartado:

void proceso(){
  ENTRADA_OKS = digitalRead(ENTRADA_OK);
  digitalWrite(SALIDA, HIGH);
  while (digitalRead(ENTRADA_OK) == LOW) {
  digitalWrite(SALIDA, LOW);
  }

Necesito que al tener acceso autorizado me active la salida "SALIDA" si en dos minutos no se a activado la entrada "ENTRADA_OK" la salida se desactiva, pero dentro de esos dos minutos se activa la entrada "ENTRADA_OK" el tiempo se anula y la salida queda activada hasta que se desactive la entrada "ENTRADA_OK".

Lo e intentado de todas las maneras y no soy capaz de hacer esto.

Cualquier cosa ayuda.

Saludos.

Hola buenas, hay está el problema que no se como hacer el tiempo y la confirmación de la entrada.

Saludos

Buenas, depende si quieres que el programa siga "fluyendo" o no, si te va bien que se pare en el void de proceso deberías hacer algo así:

unsigned long tiempo;

tiempo=millis()+espera_deseada; //Cuando llamas al void almacenas el tiempo+espera
proceso();


void proceso(){
  unsigned long time;
  do{
  ENTRADA_OKS = digitalRead(ENTRADA_OK);
  digitalWrite(SALIDA, HIGH);
  time=millis();
  } while (ENTRADA_OKS == LOW && time<=tiempo);
  digitalWrite(SALIDA, LOW);}

No lo he probado y no se si los dos minutos darían algo de problema, pero creo funciona y sirve de ejemplo de timer sin delay()

Como dije en mi mensaje...

Buenas, depende si quieres que el programa siga "fluyendo" o no, si te va bien que se pare en el void de proceso deberías hacer algo así:

Parece que él quiere que no haga nada más el programa, salvo esperar la señal de entrada_ok.

@arkarash, Esa forma de hacer el timer ¿Estás seguro que le va a funcionar a @Eltecnico? Ya te digo que no.

Pues yo lo probaría así. Si estas seguro pues podrías ayudar en lugar de criticar....

Hola buenas a todos, con que espere al estado de la señal entrada_ok y cuente el tiempo me vale no va a hacer mas cosas. Nunca he entendido la instrucción millis, con el ejemplo que me as dejado no se como declarar el tiempo, ya que lo he intentado de las maneras que yo se y no compila.

Saludos

Ve a Documentación => Indice de temas tutoriales => Millis()

ArduMyth:
Esa es tu interpretación. El autor del hilo no especifica si hará otras cosas el código ahora o en un futuro.
No obstante si fuese a tu manera tampoco tiene lógica y me explico a continuación.
Generalmente ante la falta de programadores en este lenguaje vemos a menudo realizar las condiciones con while en vez de if() Esto resulta aún más estrafalario en Arduino dado que el código se ejecuta dentro de un loop() (Es decir que ustedes para una lectura meten un bucle dentro de otro bucle).
Cuando veo eso me pregunto ¿Y para qué? Eso ustedes lo hacen así porque lo han visto de esa manera y se han quedado con el mal hábito de usar los while() como if() (Vemos esto por ejemplo en los Serial.avaliable() y muchas veces queremos que otras partes del código sigan funcional recibamos o no datos de Serial)

Debido a ese mal hábito cada poco vemos personas en el foro que tienen problemas a la hora de ejecutar las instrucciones y hacen el planteamiento mal, cómo vemos por ejemplo muy a menudo con el uso de delay().
Si la idea es que algo sólo se ejecute cada X tiempo o X cantidad de veces tenemos múltiples formas de realizarlo sin hacerlo así.

Completamente de acuerdo contigo, pero...en este caso Eltecnico había llamado a una función, si se va de la función no volverá ya que la condición de acceso autorizado donde tiene el if no se vuelve a cumplir. Y como ves en su código él implementa la espera en el void. Yo sólo he seguido su razonamiento. No es que lo diga yo, lo dice su código, que se puede hacer mejor, SI, pero no es mi código.

ArduMyth:
Por ejemplo a tu manera no paras de asignar en el timer el valor de millis() a la variable hasta la salida del mismo. En el foro hay muchísimos ejemplos de timer... simplemente compara y verás que es innecesario.

Innecesario no significa que no funcione, se puede mejorar, claro, como casi todo en esta vida.

ArduMyth:
@arkarash, no te enfades, tú puedes defender tu forma de hacerlo y a mi me parece bien que lo hagas y yo opino que no es la mejor manera de programar.
Yo puedo ser serio, pero no malinterpretes tampoco lo que escribo en el foro.
Si yo te digo que creo que el timer está raro no es que te critique. Por ejemplo si a mí alguien me dice creo que esto así no, puedo aceptarlo o no, pero no tengo porque asumir que es un ataque :wink: Lo que siempre es bueno si nos dan un motivo u otra opción al menos ver si es válido en vez de tomar las cosas cómo una ofensa

No me enfado, sé lo frustrante que es que no sepas algo y te respondan con un...así no... pues vale, se supone que el pobre postea porque está bloqueado. Yo le doy una entradilla que pueda seguir, algo para que siga investigando en la misma dirección. A lo mejor debería haberle dicho coge una librería de millis que tiene las funciones ya generadas y lista, total tu programa no consume nada de espacio y puedes permitirte el lujo de gastar memoria con librerías inútiles o busca en el foro la palabra timer y encontrarás muchos ejemplos.

Eltecnico:
Hola buenas a todos, con que espere al estado de la señal entrada_ok y cuente el tiempo me vale no va a hacer mas cosas. Nunca he entendido la instrucción millis, con el ejemplo que me as dejado no se como declarar el tiempo, ya que lo he intentado de las maneras que yo se y no compila.

Saludos

millis() simplemente te devuelve los milisegundos que hace que el programa está en marcha es un temporizador interno o algo así. Así que si tu guardas millis() y luego comparas con millis()+1000 pues cuando se cumpla la comparación habrá pasado 1 segundo.