Oh pardon, à force d'avoir la tête dans le projet, j'en ai oublié mes bonnes manières...
Le projet : Monnayeur RFID pour machine à laver pour une collocation de 11 chambres
Accessoires : Arduino Nano, RFID, Afficheur simple 7 segments couplé à un multiplex 74hc595 , Buzzer, Relais, LED RGB, Module RTC horloge et un bouton pour play.
Utilisations : Limiter l'accès à la machine à laver par le biais d'un badge pour chaqu'un des locataires. Dont 5 crédits par badge ; soit une utilisation de 5 fois/mois/chambre.
La personne remplit la machine avec son linge sale, choisit le programme voulu et pour lancer la machine à laver, il faut que :....
Fonction de la Loop :
- Cas le plus favorable : le locataire scan son badge. Il est reconnu dans la base de donnée : LED_Verte(), Buzzer OK, le nombre de crédit lié au badge est affiché sur le 7 segment. Il lui reste des crédits il peut alors appuyer sur le bouton qui va lui décompter 1 crédit et enclencher le relais qui va à son tour lancer le programme de la machine à laver. FIN DE LOOP
- Cas défavorable :le locataire scan son badge. Il est reconnu dans la base de donnée : LED_Verte(), Buzzer OK, le nombre de crédit lié au badge est affiché sur le 7 segment. Il ne lui reste aucun crédits : LED_Rouge(), Buzzer ERREUR. Il ne peut pas appuyer sur le bouton. FIN DE LOOP
- Cas le plus défavorable : le locataire ou l'admin scan son badge. Il n'est pas reconnu dans la base de donnée : LED_Rouge(), Buzzer ERREUR. FIN DE LOOP
- Fonction Master 1 : L'admin scan son badge. LED_Bleu(), Buzzer Admin. Il ne fait aucune action pendant 5 sec. LED_Rouge(), Buzzer ERREUR. LED_Verte() Relais actif. FIN programMode
- Fonction Master 2 : L'admin scan son badge. LED_Bleu(), Buzzer Admin. Il appui plusieurs fois sur le bouton play pour sélectionner un numéro qui s'affiche sur le 7 segment. (Le chiffre correspond à une chambre, il fait 5 appuis : Chambre 5). Il a 5 sec pour placer un badge sur le lecteur RFID. Le badge sélectionné correspond déjà au badge de la chambre 5 : les crédits du badge sont réinitialisés à 5 crédits. FIN programMode
- Fonction Master 3 : L'admin scan son badge. LED_Bleu(), Buzzer Admin. Il appui plusieurs fois sur le bouton play pour sélectionner un numéro qui s'affiche sur le 7 segment. (Le chiffre correspond à une chambre, il fait 5 appuis : Chambre 5). Il a 5 sec pour placer un badge sur le lecteur RFID. Le badge sélectionné ne correspond pas au badge de la chambre 5 : l'UID du nouveau badge scanné est remplacé par l'ancien UID de la chambre 5. Les anciens crédits sont concervés pour être attribué au nouveau badge. FIN programMode
- Mode Reset crédits Auto : Tous les 1er du mois, une boucle vérifie la date et l'heure pour réinitialiser tous les crédits de toutes les chambres afin de les remettre à 5 crédits.
Toutes les données sont stockées dans l'EEPROM et actualisées au fur et à mesure des actions.
void loop() {
date_heure();
do {
successRead = getID(); // définit successRead à 1 lorsque nous lisons dans le lecteur, sinon 0
if (serNumLu == Badge[0].sernum) tagok = 255; // carte master reconnue
else for (int i = 1 ; i < nbUser ; i++) {
if (serNumLu == Badge[i].sernum) {
tagok = 1; // badge reconnue dans le tableau
break;
}
}
}
while (!successRead); //le programme n'ira pas plus loin si vous n'obtenez pas une lecture réussie
if (tagok == 1 ) {
badge_ok();
}
if (tagok == 255) {
if (programMode) {
programMode_OFF();
} else {
programMode_ON();
badge_master();
}
} else if (tagok == 0 ) badge_erreur();
delay(2000);
clean_7seg(); // on éteint le 7 segment
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII CARTE MASTER IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII//
void badge_master() {
digitalWrite(LED_B, HIGH);
tone(BUZZER, 1200, 100); //Allume Led bleu+Buzzer
// select d'un chiffre correspondant à une chambre par l'appui successif du bouton_play
// (ex: N°3, après 3 appui sur bouton_play)
byte roomNumber = 0;
Serial.println("Appuyez sur le bouton pour selectionner la chambre");
const unsigned long tempo = 4500ul; // temporisation : fin d'appui bouton
unsigned long wait = millis();
while (millis() - wait < tempo) {
if (digitalRead(bouton_play) == HIGH) {
delay (300); // debounce
++ roomNumber;
if (roomNumber > nbUser + 1) roomNumber = 1;
Serial.print ("Chambre numéro :");
Serial.println(roomNumber);
// Affiche le numéro de la chambre sur le 7 segment
byte chiffre = digit[roomNumber];
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, chiffre);
digitalWrite(latchPin, HIGH);
wait = millis();
}
}
if (roomNumber == 0) {
Serial.println ("Aucune chambre selectionnee !");
LED_Rouge();
programMode_OFF();
LED_Verte();
relais_actif();
return;
}
// scan nouveau badge inconnu
if (! rfid.PICC_IsNewCardPresent());
if (! rfid.PICC_ReadCardSerial());
serNumLu = *((uint32_t *)rfid.uid.uidByte);
rfid.PICC_HaltA(); // Arrête de lire
// compare UID badge, si identique alors reset credit
if (Badge[roomNumber].sernum == serNumLu) {
successWrite_credit();
Serial.println("Badge connu");
Serial.print("UID Badge ["); Serial.print(Badge[roomNumber].sernum); Serial.println("] ");
Badge[roomNumber].credit = 5;
Serial.println("Credits Réinitialisé...");
Serial.print("Crédits= "); Serial.println(Badge[roomNumber].credit);
write_eeprom(roomNumber); // Modification des données sur l'EEPROM
read_eeprom(roomNumber); // Vérification du changement
programMode_OFF();
return;
} else {
// enregistre le UID du nouveau badge
// dans l'EEPROM à la place de celui de la chambre sélectionnée
Badge[roomNumber].sernum = serNumLu;
successWrite_UID();
//Affiche le serNumLu sur le moniteur série (UID Badge [........])
Serial.println("Lecture du nouveau Badge...");
Serial.print("UID Badge ["); Serial.print(Badge[roomNumber].sernum); Serial.println("] ");
write_eeprom(roomNumber); // Modification des données sur l'EEPROM
read_eeprom(roomNumber); // Vérification du changement
programMode_OFF();
return;
}
}
//////////////////////////////////// VERIFIE DATE POUR RESET CREDITS /////////////////////////////////
void date_heure() {
static unsigned long chrono = millis();
if (millis() - chrono < 1000ul) return;
chrono = millis();
//Affiche date et heure lors du badge sur le moniteur série
dt = clock.getDateTime();
//Exemple --> Date : 2/5/2020 16H 15min 31Sec
Serial.print("Date : ");
Serial.print(dt.day); Serial.print("/");
Serial.print(dt.month); Serial.print("/");
Serial.print(dt.year); Serial.print(" ");
Serial.print(dt.hour); Serial.print("H");
Serial.print(dt.minute); Serial.print("min ");
Serial.print(dt.second); Serial.println("Sec");
if ((dt.day == 2) && (dt.hour == 17) && (dt.minute == 33) && (dt.second == 0)) {
for (int i = 1 ; i < nbUser ; i++) {
Badge[i].credit = 2;
Serial.println(Badge[i].nom);
Serial.print("Crédits= "); Serial.println(Badge[i].credit);
write_eeprom(i); // Modification des données sur l'EEPROM
read_eeprom(i); // Vérification du changement
}
delay (1000);
return;
}
}