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.
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í
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"
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
}