Bonjour à tous,
Je suis en train de réaliser une serrure badgée avec un module RFID et un enregistrement des logs sur une carte SD.
Dans un premier temps j'ai glané du code pour l'ouverture de la porte >> tout fonctionne
Dans un second temps j'ai glané du code pour l'écriture sur la carte SD >> l'écriture fonctionne mais la fonction de lecture des tags RFID ne fonctionne plus...
Seulement voilà, en laissant le code tel quel et que je retire le module SD de la breadboard, la lecture de badge fonctionne a nouveau...
Des précisions: Carte Arduino UNO, module RFID RC522 et module SD générique (broche SCK, CS, MOSI et MISO)
Merci à vous
#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>
#include <SD.h>
#define SS_PIN 10// Arduino Uno: RST: 9, SS (SDA): 10, MOSI: 11, MISO: 12, SCK: 13
#define RST_PIN 9 //module RC522
#define CS_PIN 3 // Module SD
byte led_rouge = 6, led_verte = 7, bouton = 4, serrure = 8, buzz = 2;
byte cur_badge[5]; //current badge, liste des 5 octets du badge que l'on lit
RFID rfid(SS_PIN, RST_PIN);
File journal;
void setup()
{
Serial.begin(9600); //uniquement pour debug
SPI.begin();
rfid.init();
pinMode(led_rouge,OUTPUT);
pinMode(led_verte,OUTPUT);
pinMode(bouton, INPUT_PULLUP);
pinMode(serrure, OUTPUT);
pinMode(buzz, OUTPUT);
pinMode(12, INPUT);
if( !digitalRead(bouton))// à l'appui du bouton au moment du démarrage, effaçage de la mémoire
{
for (int n=0; n<1024; n++) //lancer ces deux lignes pour effacer totalement la mémoire
EEPROM.write(n,0);
digitalWrite(led_rouge,1);
digitalWrite(led_verte,1);
tone(buzz,2093,1000);
delay(1000);
digitalWrite(led_rouge,0);
digitalWrite(led_verte,0);
}
else //bip normal d'allumage
{
digitalWrite(led_verte,1);
tone(buzz,2093, 150); delay(150);
digitalWrite(led_verte,0); delay(150);
tone(buzz, 2093, 150); digitalWrite(led_verte,1); delay(150);
digitalWrite(led_verte,0);
}
if (!SD.begin(3)) {
Serial.println("L'initialisation de la carte SD a echoue !");
return;
}
Serial.println("L'initialisation de la carte SD a reussie !");
journal = SD.open("test.txt", FILE_WRITE); //on peut en ouvrir qu'un à la fois //
if (journal) { //si le fichier a bien été ouvert :
Serial.print("En train d ecrire dans le fichier test.txt");
journal.println("J'ecris une ligne dans le ficher !");
journal.close();
Serial.println(" Fait");
digitalWrite(CS_PIN, LOW);
} else { // sinon :
Serial.println("Erreur lors de l'ouverture de test.txt");
}
}
void new_badge()
{
// Enregistre un nouveau badge dans la mémoire EEPROM
int start_mem = EEPROM.read(0)*5+1; //dans la première case mémoire, on stock le nombre de badge déjà sauvegardés,
//et on calcule la case mémoire à partir de laquelle enregistrer le nouveau badgenb_badge
for(byte n= 0; n<5; n++)
{
EEPROM.write(start_mem+n, cur_badge[n]);
}
EEPROM.write(0, EEPROM.read(0)+1);
}
bool compare_badge()
{
//Compare le badge lu avec tous les badges enregistrés
int nb_badge = EEPROM.read(0); //récupération du nombre de badges stockés en mémoire
bool badgeOk = false; //0 si badge non correspondant, 1 si badge correspondant
/* Serial.println("Badge actuel: ");
Serial.println(cur_badge[0]);
Serial.println(cur_badge[1]);
Serial.println(cur_badge[2]);
Serial.println(cur_badge[3]);
Serial.println(cur_badge[4]);
Serial.println("FIN BADGE ACTUEL");*/
for(int n = 0; n<nb_badge; n++)
{
/*Serial.print("Badge memoire lu numero: "); Serial.println(n+1);
Serial.println(EEPROM.read(n*5+1));
Serial.println(EEPROM.read(n*5+2));
Serial.println(EEPROM.read(n*5+3));
Serial.println(EEPROM.read(n*5+4));
Serial.println(EEPROM.read(n*5+5));
Serial.println("FIN BADGE MEMOIRE LU");*/
badgeOk = EEPROM.read(n*5+1)==cur_badge[0] && EEPROM.read(n*5+2)==cur_badge[1] && EEPROM.read(n*5+3)==cur_badge[2] && EEPROM.read(n*5+4)==cur_badge[3] && EEPROM.read(n*5+5)==cur_badge[4];
if (badgeOk) return true;
}
return false;
}
void loop()
{
if (rfid.isCard()) {
if (rfid.readCardSerial())
{
for(byte n=0; n<5; n++)
{
cur_badge[n] = rfid.serNum[n]; //copie de la liste des 5 octets lus sur le badge dans la liste current badge (cur_badge))
}
/*Serial.println("DEBUT");
Serial.print(rfid.serNum[0],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(" ");
Serial.println(rfid.serNum[4],DEC);
Serial.print("FIN");*/
Serial.println();
for (byte n=0; n<5; n++)
{
Serial.print(rfid.serNum[n],DEC);
Serial.print(" ");
journal.print(rfid.serNum[n],DEC);
journal.print(" ");
}
if(compare_badge()) //si la comparaison du badge actuel avec un des badges mémoire est ok, alors on ouvre
{
digitalWrite(led_verte,1);
tone(buzz,523,50);
delay(50);
tone(buzz, 783, 50);
delay(50);
tone(buzz, 1046, 50);
delay(50);
tone(buzz, 1568, 50);
delay(50);
tone(buzz, 2093, 70);
delay(250);
digitalWrite(serrure, 1);
delay(3000);
digitalWrite(led_verte,0);
digitalWrite(serrure, 0);
}
else
{
digitalWrite(led_rouge, 1);
tone(buzz,370,50);
delay(100);
tone(buzz, 370, 300);
delay(1000);
digitalWrite(led_rouge, 0);
}
}
}
if(!digitalRead(bouton)) //lors de l'appui du bouton pour enregistrer un nouveau badge
{
while(!digitalRead(bouton)) {} //anti rebond sur le bouton d'enregistrement de nouveau badge
delay(100);
digitalWrite(led_rouge, 1); digitalWrite(led_verte,1); //allumage des deux leds simultanément pour signaler que c'est ok et prêt
while (!rfid.isCard() && digitalRead(bouton)) {} //on attend la lecture d'un badge, ou le rappui du bouton qui va annuler, car le if suivant ne sera pas vérifié
if (rfid.readCardSerial())
{
for(byte n=0; n<5; n++)
{cur_badge[n] = rfid.serNum[n];} //lecture du badge que l'on passe
if(!compare_badge()) //si le badge n'est pas déjà enregistré, on enregistre le nouveau badge
{
new_badge();
digitalWrite(led_rouge, 0);
digitalWrite(led_verte, 1);
tone(buzz, 2093, 500);
delay(200);
digitalWrite(led_verte, 0);
delay(200);
digitalWrite(led_verte, 1);
delay(200);
digitalWrite(led_verte, 0);
delay(200);
digitalWrite(led_verte, 1);
delay(200);
digitalWrite(led_verte, 0);
}
else //si le badge que l'on veut ajouter est déjà enregistré, du con, ça clignote rouge
{
digitalWrite(led_verte, 0);
digitalWrite(led_rouge, 1);
tone(buzz,370,500);
delay(200);
digitalWrite(led_rouge, 0);
delay(200);
digitalWrite(led_rouge, 1);
delay(200);
digitalWrite(led_rouge, 0);
delay(200);
digitalWrite(led_rouge, 1);
delay(200);
digitalWrite(led_rouge, 0);
}
}
else
{
//si on rappuie sur le bouton, retour
digitalWrite(led_rouge,0);
digitalWrite(led_verte,0);
while(!digitalRead(bouton)) {} //anti redéclenchement si on reste appuyé
delay(500);
}
}
rfid.halt();
}