Hola buenas, tengo un código en arduino para la función de una puerta con tarjetas rfid. Cuando quiero dar de alta una tarjeta tengo que pasar la administradora y luego la usuario después de hacer todo esto vuelve a modo normal, quiero que desde pues de pasar la tarjeta se quede en modo grabación para poder grabar mas de 1 tarjeta y luego salir pasando la tarjeta de administrador, igual para borrar tarjetas.
Led azul fijo: modo normal
Led azul intermitente: modo administrador
Led verde dentro de administración tarjeta guardada
led rojo dentro de administración tarjeta borrada
led verde modo normal puerta abierta
led rojo modo normal error tarjeta no admitida
/* ARDUINO RFID-RC522 PUERTA DE SEGURIDAD
* CONEXIONES:
* LEDS: AZUL = 5 ROJO = 7 VERDE = 6
* RELE = 4
* RFID-RC522 ARDUINO UNO
* -------------------------------------
* 3.3V 3.3V
* RST PIN 9
* GND GND
* RQ --
* MISO PIN 12
* MOSI PIN 11
* SCK PIN 13
* SDA PIN 10
*/
#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>
#define LED_COMUN
#ifdef LED_COMUN
#define LED_ON HIGH
#define LED_OFF LOW
#endif
#define Ledrojo 7
#define Ledverde 6
#define Ledazul 5
#define rele 4
#define pitido 3
boolean coincide = false;
boolean programMode = false;
byte guardartarjeta[4];
byte leertarjeta[4];
byte tarjetaadmin[4] = {0xE0,0x8C,0xD7,0x1F}; // TARJETA ADMINISTRADOR
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
pinMode(Ledrojo, OUTPUT);
pinMode(Ledverde, OUTPUT);
pinMode(Ledazul, OUTPUT);
pinMode(rele, OUTPUT);
pinMode(pitido, OUTPUT);
digitalWrite(rele, HIGH);
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
}
void loop () {
int okleer;
do {
okleer = cojerid();
if (programMode) {
modoadmin();
}
else {
modonormal();
}
}
while (!okleer);
if (programMode) {
programMode = false;
if ( esAdmin(leertarjeta) ) {
return;
}
else {
if ( buscarid(leertarjeta) ) {
borrarid(leertarjeta);
}
else {
guardarid(leertarjeta);
// AQUI ES DONDE GUARDA LA TA TRAJETA
}
}
}
else {
if ( esAdmin(leertarjeta) ) {
programMode = true;
int count = EEPROM.read(0);
}
else {
if ( buscarid(leertarjeta) ) {
abrirpuerta(9000);
}
else {
fallo();
}
}
}
}
int cojerid() {
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return 0;
}
Serial.println("");
Serial.println("TARJETA N");
for (byte i = 0; i < mfrc522.uid.size; i++) {
leertarjeta[i] = mfrc522.uid.uidByte[i];
Serial.print(leertarjeta[i], HEX);
}
mfrc522.PICC_HaltA();
return 1;
}
void modoadmin() {
digitalWrite(Ledazul, LED_OFF);
digitalWrite(Ledrojo, LED_OFF);
digitalWrite(Ledverde, LED_OFF);
delay(200);
digitalWrite(Ledazul, LED_ON);
delay(200);
digitalWrite(Ledazul, LED_OFF);
delay(200);
digitalWrite(Ledazul, LED_ON);
delay(200);
digitalWrite(Ledazul, LED_OFF);
delay(200);
digitalWrite(Ledazul, LED_ON);
delay(200);
}
void modonormal () {
digitalWrite(Ledazul, LED_ON);
digitalWrite(Ledrojo, LED_OFF);
digitalWrite(Ledverde, LED_OFF);
digitalWrite(rele, HIGH);
}
void leerid( int number ) {
int start = (number * 4 ) - 3;
for ( int i = 0; i < 4; i++ ) {
guardartarjeta[i] = EEPROM.read(start+i);
}
}
void guardarid( byte a[] ) {
if ( !buscarid( a ) ) {
int num = EEPROM.read(0);
int start = ( num * 4 ) + 1;
num++;
EEPROM.write( 0, num );
for ( int j = 0; j < 4; j++ ) {
EEPROM.write( start+j, a[j] );
}
guardadook();
}
else {
falloguardar();
}
}
void borrarid( byte a[] ) {
if ( !buscarid( a ) ) {
falloguardar();
}
else {
int num = EEPROM.read(0);
int slot;
int start;
int looping;
int j;
int count = EEPROM.read(0);
slot = buscarids( a );
start = (slot * 4) - 3;
looping = ((num - slot) * 4);
num--;
EEPROM.write( 0, num );
for ( j = 0; j < looping; j++ ) {
EEPROM.write( start+j, EEPROM.read(start+4+j));
}
for ( int k = 0; k < 4; k++ ) {
EEPROM.write( start+j+k, 0);
}
borradook();
}
}
boolean comprobar ( byte a[], byte b[] ) {
if ( a[0] != NULL )
coincide = true;
for ( int k = 0; k < 4; k++ ) { // Loop 4 times
if ( a[k] != b[k] )
coincide = false;
}
if ( coincide ) {
return true;
}
else {
return false;
}
}
int buscarids( byte find[] ) {
int count = EEPROM.read(0);
for ( int i = 1; i <= count; i++ ) {
leerid(i);
if( comprobar( find, guardartarjeta ) ) {
return i;
break;
}
}
}
boolean buscarid( byte find[] ) {
int count = EEPROM.read(0);
for ( int i = 1; i <= count; i++ ) {
leerid(i);
if( comprobar( find, guardartarjeta ) ) {
return true;
break;
}
else {
}
}
return false;
}
void guardadook() {
digitalWrite(Ledazul, LED_OFF);
digitalWrite(Ledrojo, LED_OFF);
digitalWrite(Ledverde, LED_OFF);
delay(200);
digitalWrite(Ledverde, LED_ON);
delay(200);
digitalWrite(Ledverde, LED_OFF);
delay(200);
digitalWrite(Ledverde, LED_ON);
delay(200);
digitalWrite(Ledverde, LED_OFF);
delay(200);
digitalWrite(Ledverde, LED_ON);
delay(200);
}
void falloguardar() {
digitalWrite(Ledazul, LED_OFF);
digitalWrite(Ledrojo, LED_OFF);
digitalWrite(Ledverde, LED_OFF);
delay(200);
digitalWrite(Ledrojo, LED_ON);
delay(200);
digitalWrite(Ledrojo, LED_OFF);
delay(200);
digitalWrite(Ledrojo, LED_ON);
delay(200);
digitalWrite(Ledrojo, LED_OFF);
delay(200);
digitalWrite(Ledrojo, LED_ON);
delay(200);
}
void borradook() {
digitalWrite(Ledazul, LED_OFF);
digitalWrite(Ledrojo, LED_OFF);
digitalWrite(Ledverde, LED_OFF);
delay(200);
digitalWrite(Ledrojo, LED_ON);
delay(200);
digitalWrite(Ledrojo, LED_OFF);
delay(200);
digitalWrite(Ledrojo, LED_ON);
delay(200);
digitalWrite(Ledrojo, LED_OFF);
delay(200);
digitalWrite(Ledrojo, LED_ON);
delay(200);
}
boolean esAdmin( byte test[] ) {
if ( comprobar( test, tarjetaadmin ) )
return true;
else
return false;
}
void abrirpuerta( int setDelay ) {
digitalWrite(Ledazul, LED_OFF);
digitalWrite(Ledrojo, LED_OFF);
digitalWrite(Ledverde, LED_ON);
digitalWrite(pitido, HIGH);
digitalWrite(rele, LOW);
delay(1000); // TIEMPO DE SALIDA 1S
digitalWrite(rele, HIGH);
digitalWrite(pitido, LOW);
}
void fallo() {
digitalWrite(Ledverde, LED_OFF);
digitalWrite(Ledazul, LED_OFF);
digitalWrite(Ledrojo, LED_ON);
delay(1200);
}