Cerradura RFID Arduino Nano

Buenas noches, espero que se encuentren muy bien. Con los pocos conocimientos que dispongo logré diseñar un circuito para implementar una cerradura con RFID el mismo es el que se acompaña en la imagen y el código que abajo se detalla, la cuestión es que no logro que el circuito funcione, está un par de días andando a la perfección y a los días ya deja de funcionar, la arduino está siendo alimentada por un cargador de celular y el circuito de potencia por otro cargador de 12V

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

/*
In the ESP8266, D3 pin is RST_PIN and
D4 pin is SS_PIN
*/
#define RST_PIN 0
#define SS_PIN 2

// Buzzer
#define Buz 16

// Portón
#define Por 15

MFRC522 reader(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

// Inicio de la EEPROM
#define EEPROM_ADDR 0

// Asignamos los valores de los llaveros RFID
String CardNumber = "EXXXXXX1 - EXXXXXX2";
void setup()
{
  // Definimos la función de los pines
  pinMode(Buz, OUTPUT);  
  pinMode(Por, OUTPUT);

  Serial.begin(9600); // Initialize serial communications and wait until it is ready
  while (!Serial)
  {
    // Nothing here. Just wait for serial to be present
  }

  SPI.begin();

  reader.PCD_Init();
  // Just wait some seconds...
  delay(4);
  // Prepare the security key for the read and write functions.
  // Normally it is 0xFFFFFFFFFFFF
  // Note: 6 comes from MF_KEY_SIZE in MFRC522.h
  for (byte i = 0; i < 6; i++)
  {
    key.keyByte[i] = 0xFF; //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library
  }
  
  // Definimos los estados iniciales de las salidas
  digitalWrite(Buz, LOW);  
  digitalWrite(Por, LOW);

  Serial.println(CardNumber);
  delay(2000);
}

void loop()
{
  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if (!reader.PICC_IsNewCardPresent())
  {
    return;
  }

  // Select one of the cards. This returns false if read is not successful; and if that happens, we stop the code
  if (!reader.PICC_ReadCardSerial())
  {
    return;
  }

  // At this point, the serial can be read. We transform from byte to hex

  String serial = "";
  for (int x = 0; x < reader.uid.size; x++)
  {
    // If it is less than 10, we add zero
    if (reader.uid.uidByte[x] < 0x10)
    {
      serial += "0";
    }
    // Transform the byte to hex
    serial += String(reader.uid.uidByte[x], HEX);
    // Add a hypen
    if (x + 1 != reader.uid.size)
    {
      serial += "";
    }
  }
  // Transform to uppercase
  serial.toUpperCase();
  Serial.println(CardNumber);
  Serial.println("Read serial is: " + serial);

  // Halt PICC
  reader.PICC_HaltA();
  // Stop encryption on PCD
  reader.PCD_StopCrypto1();

  if (CardNumber.indexOf(serial) >= 0) {
    // Encendemos el buzzer
  digitalWrite(Buz, LOW);

    // Apagamos el electroimán
    digitalWrite(Por, HIGH);
    delay(1500);

  }
  else {
    Serial.println("Access denied");
    
    //Emitimos 3 pitidos para avisar de un error en la lectura de la tarjeta
    emitirPitido(5);
  }
  // Apagamos el buzzer
  digitalWrite(Buz, LOW);

  // Encendemos el electroimán
  digitalWrite(Por, LOW);
  delay(500);
}

// Función para emitir un pitido en el buzzer
void emitirPitido(int cantidad) {
  for (int i = 0; i < cantidad; i++) {
    digitalWrite(Buz, HIGH);
    delay(100);
    digitalWrite(Buz, LOW);
    delay(100);
  }
}

Desde ya agradezco la ayuda.

Saludos cordiales.

Y por donde lo alimentas, por Vin o por 5V?

Por la ficha USB lo alimento.
Muchas gracias por responder.

El funcionamiento de los circuitos con Arduino depende de como construyes tu equipo.
Acá vendría bien una foto de como esta armado todo, mas datos de la fuente que alimenta el circuito de potencia.
Es posible que el circuito de potencia en algun momento genere alguna perturbación electrica que haga que el arduino falle.
Solo especulo. Debo ver mas datos para poder guiarte mejor y claramente puedo estar equivocado. Pero tu problema es muy común y siempre se debe a perturbaciones electricas.
Tal vez en el recinto donde estas haya un motor electrico y su accionamiento genere el problema, tal vez una lampara fluorescente que son muy ruidosas.
Busca cosas como estas.

Buenas, el circuito está como en la foto
cerradura

La fuente del magnético es este:
Fuente 12V

La fuente del arduino es esta:
Fuente 5V

En la puerta está al lado el caño de la bajada de la luz y en a unos metros una lámpara fluorescente como se muestra en la foto debajo:
frente

Espero con toda esta información poder aclarar, muchas gracias por toda la ayuda.

Saludos cordiales.

Lampara fluorescente, es la responsable de tu problema, ya te lo indiqué antes.

Y como puedo solucionar ese ruido?

Reemplaza la lampara fluorescente, por alguna LED, hoy hay reemplazo de todo.
No pierdas el tiempo porque esta fuera de tus capacidades o eso me imagino.

Pero no podrías facilitarme algo para leer o introducirme para filtrar ese ruido?
En este momento está fuera de mis capacidades ya que desconozco como filtrarlo, pero me gustaría conocer como hacerlo.
Muchas gracias!

Si claro, en este foro hemos debatido el tema muchas veces.
Todo tema de interferencia, ruidos en Arduino.
La solución mejor que he encontrado es usar un cilindro similar al que tienen algunos cables de buena calidad que actuan eleminando la interferencia de modo comun. eso debes ponerlo antes de la entrada de la fuente del arduino.
https://www.xataka.com/componentes/para-que-sirve-ese-cilindro-situado-en-el-extremo-de-nuestros-cables
Ni la jaula de faraday (meter al arduino en una caja metálica) ni otras consideraciones han funcionado tan bien como el tema que te señalo.

Buenas noches, mil disculpas por la demora en la respuesta, pero acabo de probar y sigue dando errores a los días, noté que el edificio del lado tiene una lámpara igual, pero no creo que me den bolilla de cambiarla. le cambié el cable USB que alimenta la arduino por uno que tenga el núcleo de ferrita, pero no tiene caso. Estaba pensando en lo siguiente:
Si le pongo un filtro emi en la alimentación de la arduino?
Si cambio el cable del lector RFID por uno mallado?
La jaula de Faraday será al vicio?
Si en la fuente de arduino pongo un varistor como el de la publicación? varistor
Si pongo en Vin un capacitor de 2200 uF en paralelo con el de 0.1?
Estos dos útlimos puntos son ideas que saco de aquí: Publicación foro

Desde ya muchas gracias por la ayuda!

Hi,
Como tienes montado el NANO? Usa un shield .Normalmente se usa un condesador de .1pfd para las altas frecuencias y uno electrolitico para ls bajas frecuencias. Estos se conectan lo mas cercanos a los pines del micro. No mencionas como tienes montado el micro. El power supply que alimentas el micro es de los tipos de switches. Con estos debes de tener cuidado ya que usan un condesador para bajar el voltaje. Normalente yo uso los de tranformadores ya que estos te aislan el alto voltaje del de bajo voltaje. Posiblementa no sea el problema pero yo no los usos para alimentar el micro en mis projectos. Ya que el micro no tien mucha carga yo usaria un condensador electrolitico de por lo menos 470 a 1000 mfd . Una pregunta que lejos esta el opto del micro ya que de la distancia puede ser una causa.

Buenos días, muchas gracias por tu respuesta, voy respondiendo por partes:

El power supply que alimentas el micro es de los tipos de switches.

El arduino está como viene, conectado al optoacoplador y al lector RFID mediante cables dupont, sobre los pines de Vin y GND soldé un capacitor de 0.1 uF.

El power supply que alimentas el micro es de los tipos de switches.

Las fuente que utilizo son las que puse al principio en la publicación, creo que utilizan mini transformadores para reducir la tensión.

El power supply que alimentas el micro es de los tipos de switches.

El optoacoplador se encuentra a escasos centímetros de la Arduino.

Ya que el micro no tien mucha carga yo usaria un condensador electrolitico de por lo menos 470 a 1000 mfd

Le añado un capacitor de 1000 uF en Vin y GND en paralelo al de 0.1uF entonces?

Desde ya muchas gracias por tu respuesta, espero haber solucionado todos las dudas.

Hi,
Creo que se te olvido la distancia del opto coupler a la cerradura.

¿Pero lo alimentas por el pin Vin o por el pin 5V?

Si lo alimentas por Vin necesitas más de 6.5V

Pero si dijo que le funciona x varios dias y luego se le cuelga?

Buenas, gracias por tu respuesta está a 7 cm

Buenas, gracias por su respuesta. Lo alimento mediante el cable USB de la Arduino. El capacitor lo debería de mover a 5v y GND?

Buenas, muchas gracias por su respuesta. Así es!

Si.