RFID y guardado y borrado en EEPROM

Hola a todos. Estoy creando un codigo en que lea el UID de las tarjetas RFID y que compruebe a ver si esta en la EEPROM.
El tema de la lectura lo tengo controlado. El problema es cuando entro en modo programación.
Si la tarjeta leída existe, entonces que la borre de todas las posiciones de la EEPROM donde existiera.
Si la tarjeta no existe en ninguna posición de la EEPROM, que la escriba en el primer lugar donde este vacía (se considera vacía los valores 215 140 209 152)

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#include <Wire.h>
#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

byte uid[4];
const int PROG_PIN = 2; // Pin que indica si estamos en modo programación o no


int prog = 0; // Variable que indica si estamos en modo programación o no


unsigned long tiempoR = 0;



void setup() {
  Serial.begin(9600);
  pinMode(PROG_PIN, INPUT); // Configuramos el pin de programación como entrada
  SPI.begin(); //Iniciamos la comunicación SPI
  mfrc522.PCD_Init(); //Iniciamos el RC522
}

void loop() {
  // Leemos el estado del pin de programación
  int prog = digitalRead(PROG_PIN);

  // Leemos la UID de la tarjeta RFID
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    
    byte uid[4];
    for (byte i = 0; i < mfrc522.uid.size; i++) {  // Guardamos el UID de la tarjeta
        uid[i] = mfrc522.uid.uidByte[i];  // Guardamos el UID de la tarjeta
    }

    // Buscamos la UID en la EEPROM
    bool found = false;
    for (int i = 10; i <= 100; i += 10) {
      
      if (prog == 0) {
        if (EEPROM.read(i) == uid[0] && EEPROM.read(i + 1) == uid[1] && EEPROM.read(i + 2) == uid[2] && EEPROM.read(i + 3) == uid[3]) {
          found = true;
        } 
      }
      if (prog == 1) {
        if (EEPROM.read(i) == uid[0] && EEPROM.read(i + 1) == uid[1] && EEPROM.read(i + 2) == uid[2] && EEPROM.read(i + 3) == uid[3]) {  //si UID existe, lo borra
            EEPROM.update(i, 215);
            EEPROM.update(i + 1, 140);
            EEPROM.update(i + 2, 209);
            EEPROM.update(i + 3, 152);
            Serial.print("tarjeta borrada en posicion ");
            Serial.println(i);
            found = false;
        } else {
          if (EEPROM.read(i) == 215 && EEPROM.read(i + 1) == 140 && EEPROM.read(i +2) == 209 && EEPROM.read(i +3) == 152) {
            EEPROM.update(i, uid[0]);
            EEPROM.update(i + 1, uid[1]);
            EEPROM.update(i + 2, uid[2]);
            EEPROM.update(i + 3, uid[3]);
            found = false;
            break;
          }
        }
      }
    }
    if (found == true) {
          Serial.print("tarjeta encontrada ");
          Serial.print(uid[0]);
          Serial.print(" ");
          Serial.print(uid[1]);
          Serial.print(" ");
          Serial.print(uid[2]);
          Serial.print(" ");
          Serial.println(uid[3]);
          found = false;
          
          
        } else {
          Serial.print("tarjeta no encontrada ");
          Serial.print(uid[0]);
          Serial.print(" ");
          Serial.print(uid[1]);
          Serial.print(" ");
          Serial.print(uid[2]);
          Serial.print(" ");
          Serial.println(uid[3]);
          found = false;
        }

    
      
    
  }

  mfrc522.PICC_HaltA();  // Detenemos la lectura del RFID
}

El borrado de la EEPROM en prog = 1 me lo hace, pero a la vez guarda el UID en una posición.

¿Alguien me puede ayudar?

Disculpe mi español... Usé Google Translate.

Creo que tu problema es que si después de borrar la tarjeta sigues buscando en la EEPROM. Así que en la siguiente entrada volverás a escribir la misma tarjeta. Necesitas "romper" una vez que borras.

            Serial.print("tarjeta borrada en posicion ");  
            Serial.println(i);
            found = false;
            break;            // romper aquí
1 Like

Efectivamente, eso pararía la búsqueda y solo borraría el primer UID que encontrara, no el resto.
EL problema lo tengo cuando no encuentra el UID, que quiero que lo ponga en la primera posición "vacía"

Pero la tarjeta nunca debe guardarse más de una vez. Desde que lo almacena por primera vez, se "rompe" del ciclo, ¿entonces solo lo almacena una vez?

SI, solo lo almacenaría una vez.

Entonces no hay problema?

Después de muchísimo ensayo y error, he dado con la solución.
En resumidas cuentas cada vez que no se cumpla una condicional hay que volver a hacer un ciclo FOR para recorrer toda la EEPROM.
También hay que ir "terminando" algunas variables booleanas.

Aquí pongo el código definitivo:

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#include <Wire.h>
#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

byte uid[4];
const int PROG_PIN = 2; // Pin que indica si estamos en modo programación o no
const int ledR = 6; // Pin del LED rojo
const int ledV = 7; // Pin del LED verde
const int ledA = 8; // Pin del LED amarillo

int prog = 0; // Variable que indica si estamos en modo programación o no


unsigned long tiempoR = 0;



void setup() {
  Serial.begin(9600);
  pinMode(PROG_PIN, INPUT); // Configuramos el pin de programación como entrada
  pinMode(ledR, OUTPUT); // Configuramos el pin del LED rojo como salida
  pinMode(ledV, OUTPUT); // Configuramos el pin del LED verde como salida
  pinMode(ledA, OUTPUT); // Configuramos el pin del LED amarillo como salida
  SPI.begin(); //Iniciamos la comunicación SPI
  mfrc522.PCD_Init(); //Iniciamos el RC522
}

void loop() {
  // Leemos el estado del pin de programación
  int prog = digitalRead(PROG_PIN);

  // Leemos la UID de la tarjeta RFID
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    
    byte uid[4];
    for (byte i = 0; i < mfrc522.uid.size; i++) {  // Guardamos el UID de la tarjeta
        uid[i] = mfrc522.uid.uidByte[i];  // Guardamos el UID de la tarjeta
    }

    // Buscamos la UID en la EEPROM
    bool found = false;
    bool noexist = false;
    bool memoriallena = false;
    for (int i = 10; i <= 100; i += 10) {
      
      if (prog == 0) {
        if (EEPROM.read(i) == uid[0] && EEPROM.read(i + 1) == uid[1] && EEPROM.read(i + 2) == uid[2] && EEPROM.read(i + 3) == uid[3]) {
          found = true;
          
        } 
      }
      if (prog == 1) {
        if (EEPROM.read(i) == uid[0] && EEPROM.read(i + 1) == uid[1] && EEPROM.read(i + 2) == uid[2] && EEPROM.read(i + 3) == uid[3]) {  //si UID existe, lo borra
          EEPROM.update(i, 215);
          EEPROM.update(i + 1, 140);
          EEPROM.update(i + 2, 209);
          EEPROM.update(i + 3, 152);
          Serial.print("tarjeta borrada en posicion ");
          Serial.println(i);
          noexist = false;
          break;
          
          
        } else {
          noexist = true;
        }
        

      }
    }
    if (noexist == true) {
      for (int i = 10; i <= 100; i += 10) {
        if (EEPROM.read(i) == 215 && EEPROM.read(i + 1) == 140 && EEPROM.read(i + 2) == 209 && EEPROM.read(i + 3) == 152) {
          EEPROM.update(i, uid[0]);
          EEPROM.update(i + 1, uid[1]);
          EEPROM.update(i + 2, uid[2]);
          EEPROM.update(i + 3, uid[3]);
          Serial.print("tarjeta guardada en posicion ");
          Serial.println(i);
          noexist = false;
          memoriallena = false;
          break;
        } else {
          memoriallena = true;
        }
      }
    }

    if (memoriallena == true) {
      for (int i = 10; i <= 100; i += 10) {
        if (EEPROM.read(i) != 215 && EEPROM.read(i + 1) != 140 && EEPROM.read(i + 2) != 209 && EEPROM.read(i + 3) != 152) {
          Serial.println("Memoria llena");
          break;
        }
      }
    }
    if (found == true) {
          Serial.print("tarjeta encontrada ");
          Serial.print(uid[0]);
          Serial.print(" ");
          Serial.print(uid[1]);
          Serial.print(" ");
          Serial.print(uid[2]);
          Serial.print(" ");
          Serial.println(uid[3]);
          
    } 
    if (found == false && prog == 0) {
          Serial.print("tarjeta no encontrada ");
          Serial.print(uid[0]);
          Serial.print(" ");
          Serial.print(uid[1]);
          Serial.print(" ");
          Serial.print(uid[2]);
          Serial.print(" ");
          Serial.println(uid[3]);
   }
  }

  mfrc522.PICC_HaltA();  // Detenemos la lectura del RFID
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.