Como mantener abierto solenoide mientras esta leyendo la tarjeta en lector RC522

Buenas tardes, es mi primera duda que planteo en el foro, agradecería una pista para poder solucionar la duda que tengo.
Tengo un proyecto entre manos, el cual no consigo que realice todo lo que quiero.
Se trata de un sistema que cuenta con un lector RFDI RC522 que al leer la tarjeta autorizada me activa un solenoide, con la acción (delay) puedo programar que el solenoide se mantenga abierto durante el periodo deseado.
Mi consulta es que no consigo que el solenoide se mantenga abierto mientra me esta leyendo la tarjeta y se cierre en el momento que deje de leerla.
Os agradezco por anticipado la ayuda.

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9          
#define SS_PIN          10          

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Crea instancias MFRC522.

String read_rfid;
String ok_rfid_1="bc2fe22b";   //Usuario autorizado
int lock=7; //Pin activado para activar el solenoide

void setup() {
    Serial.begin(9600);         // Inicializa comunicaciones con PC
    while (!Serial);            // No hacer nada si no se abre ningún puerto serie
    SPI.begin();                // Inicializa biblioteca SPI 
    mfrc522.PCD_Init();         // Inicializa MFRC522 Tarjeta

    pinMode(lock, OUTPUT); // Define pin 7 como salida    
}

void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
  digitalWrite(lock, HIGH);
  // delay(2000);
  digitalWrite(lock,LOW);
 
}

void loop() {

      // Busca nuevas tarjetas
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Seleccione una de las tarjetas
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
    if (read_rfid==ok_rfid_1) {
      //ok, abre la puerta.
      open_lock();
    }
    
}

Tu modificaste esta rutina?

void open_lock() {
  digitalWrite(lock, HIGH);
  // delay(2000);
  digitalWrite(lock,LOW);
 
}

Por que esto explica porque no puedes mantener el solenoide activo.
Ahi dice, poner activo e inmediatamente desactivar el solenoide.

Si digitalWrite(lock, HIGH); activa el solenoide y
digitalWrite(lock, LOW); lo desactiva.

Dime que crees que debes hacer?

Pues antes de leer tu tarjeta RFID lo activas y luego de leerla lo desactivas.
Ahora si no alcanza a respetar los 2000 mseg entonces usa millis() y comprueba al final si se han cumplido y en caso de no cumplir, pues esperas lo que falte y luego apagas el solenoide.

Gracias Surbyte, por responder
Disculpa si no supe explicarme correctamente.
Lo que deseo hacer es lo siguiente, que el solenoide permanezca inactivo hasta que se lea la tarjeta RFDI y en el caso de ser la tarjeta correcta esta active el solenoide y el mismo solenoide cambie a inactivo al deja de leer la tarjeta.

void open_lock() {
  digitalWrite(lock, HIGH);
  delay(2000);
  digitalWrite(lock,LOW);
 
}

Con este código consigo que el solenoide se active cuando me lee la tarjeta pero espera 2 segundos y pasa a inactivo.
Lo que deseo hacer es que el solenoide este activo mientras permanezca leyendo la tarjeta.
Espero haberme expresado correctamente, recibe un cordial saludo.

Te explicas bien o digamos ahora te comprendo mejor, de todas formas ya te respondí.

Solenoide activo digitalWrite(lock, HIGH);
Solenoide inactivo digitalWrite(lock, LOW);

Si quieres que este activo o inactivo según cierta secuencia lo mejor es usar un flag.
Que es un flag, una variable que solo puede valer 0 o 1, false o true, NO o Si.
la defines asi

bool estadoLock;

al final del loop pones lo que controla el solenoide que será simplemente esto

if (estadoLock) 
    digitalWrite(lock, HIGH);
else
    digitalWrite(lock, LOW);

entonces solo esto controla que hace el solenoide y mientras debes ser muy cuidadoso en que ciertas partes de tu código cambien el valor de flag.

Entonces.. al iniciar setup en la última línea pones,

estadoLock = false;

esto hace que el solenoide arranque inactivo

Luego cuando alguien coloca una tarjeta y es correcta, pones
estadoLock = true;
y cuando detectes que la retiró de nuevo lo pasas a false.

Espero puedas lograrlo.
Si te equivocas y pones un cambio en una parte de código que se ejecuta varias veces, eso FORZARA a que el solenoide parmanezca solo en un estado.

Asi que no seas apurado y ve haciendolo paso a paso.

Arrancas con solenoide inactivo y luego intenta que responda a una RFID aceptada y finalmente restaura la situación al quitar la RFID.

Muchas gracias, estoy haciendo unas pruebas, en cuanto termine te diré si fui capaz de conseguirlo jijiji