1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
| #include <SPI.h>
#include <RFID.h> // https://github.com/song940/RFID-RC522
#include <EEPROM.h>
#define SS_PIN 10 //SS=SDA, 53 imposé pour Mega, puis SCK 52, MOSI 51, MISO 50
// Arduino Uno: RST: 9, SS (SDA): 10, MOSI: 11, MISO: 12, SCK: 13
// Arduino Nano: RST: D9, SS (SDA): D10, MOSI: D11, MISO: D12, SCK: D13
#define RST_PIN 9 //le pin qu'on veut pour RST
//byte led_rouge = 6, led_verte = 7, bouton = 4, serrure = 8, buzz = 2;
byte led_rouge = 6, led_verte = 7, bouton = 4, serrure = 8, buzz = 2, boutonPorte = 3;
byte cur_badge[5]; //current badge, liste des 5 octets du badge que l'on lit
RFID rfid(SS_PIN, RST_PIN);
void setup()
{
Serial.begin(9600); //uniquement pour debug, arrête de faire pause pour lire mes conneries
SPI.begin();
rfid.init();
pinMode(led_rouge,OUTPUT);
pinMode(led_verte,OUTPUT);
pinMode(bouton, INPUT_PULLUP);
pinMode(boutonPorte, INPUT_PULLUP);
pinMode(serrure, OUTPUT);
pinMode(buzz, OUTPUT);
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.update(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);
}
}
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(rfid.serNum[0],DEC);
Serial.println(rfid.serNum[1],DEC);
Serial.println(rfid.serNum[2],DEC);
Serial.println(rfid.serNum[3],DEC);
Serial.println(rfid.serNum[4],DEC);*/
if(compare_badge()) //si la comparaison du badge actuel avec un des badges mémoire est ok, alors on ouvre
{
porteOuvrir();
}
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 OOOKAAAAAYYYYY 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);
}
}
//--------------------------------- Lecture du bouton de porte
if(!digitalRead(boutonPorte)) //lors de l'appui du bouton pour enregistrer un nouveau badge
{
while(!digitalRead(boutonPorte)) {} //anti rebond sur le bouton d'enregistrement de nouveau badge
delay(100);
porteOuvrir();
}
rfid.halt();
}
void porteOuvrir()
{
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);
} |
Partager