Bonjour à tous, 8)
Je travaille sur un projet de monnayeur RFID avec décompte individuel des crédits en fonction de plusieurs badges (chaque badge possède sont propre crédit).
J'ai pas mal avancé sur le code, mais il y a plusieurs choses qui me bloque...
Exemple : Je n'arrive pas a afficher les crédits du badge X et à les décrémenter de 1 si j'appui sur un bouton
Pouvez vous jeter un œil à mon code (une photo de mon montage en PJ pour vous aider à y voir plus clair)
PS : ce qui fonctionne:
-Reconnaissance des différents badges enregistrés
-son buzzer
-affichage led différentes couleurs
#include <SPI.h>
#include <MFRC522.h> //Library RFID
#include <Wire.h> //Library Horloge
#include <DS3231.h>
//Définition des Sorties
#define SS_PIN 10 //pin RFID
#define RST_PIN 9 //""
#define RELAY 8 //pin relais
#define BUZZER 6 //pin buzzer
#define BOUTON 2 //pin bouton play
#define ACCESS_DELAY 5000 //Durée de pause Badge OK
#define DENIED_DELAY 1000 //Durée de pause Badge non-valide
#define ACCESS_MASTER 5000 //Durée de pause Carte Master
int LED_B = A1; // LED Bleu
int LED_V = A2; // LED Verte
int LED_R = A3; // LED Rouge
//N° Sorties et variable du 7_segments
const int dataPin = 5; // Fil bleu 74HC595 pin 14
const int latchPin = 4; // Fil vert 74HC595 pin 12
const int clockPin = 3; // Fil jaune 74HC595 pin 11
const char commune = 'c'; // "c" cathode commune (sinon "a" pour anode commune)
//DEFINITION DES VARIABLES
DS3231 clock; // Déclarer instance Horloge
RTCDateTime dt;
MFRC522 rfid(SS_PIN, RST_PIN); // Déclarer instance MFRC522 RFID
MFRC522::MIFARE_Key key;
byte tagok = 0; // Variable pour différencier Badge de la carte Master
int etat_bouton; // Variable pour différencier état haut ou état bas du bouton
int credit = 5; // Nombre de crédit Max
int mem_btn_play = HIGH; // etat du bouton moins
//Affichage des chiffres sur le 7_Segments 74HC595 pin Q0 - Q1 - Q2 - Q3 - Q4 - Q5 - Q6 - Q7
// 1 = LED on, 0 = LED off, dans cet ordre: Mappage vers a b c d e f g ..
byte chiffre[10] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11100110 // 9
};
// Code des Badges
unsigned long sernum[13] = {0, //poste 0 N° badge lue
1669386246, //Badge 1
3009123561, //Badge 2
3009327833, //Badge 3
0, //Badge 4
0, //Badge 5
0, //Badge 6
0, //Badge 7
0, //Badge 8
0, //Badge 9
0, //Badge 10
0, //Badge 11
2778220336}; //Carte Master(12)
//INITIALISATION DE LA CARTE ET DES SORTIES
void setup()
{
Serial.begin(9600); // Initialiser communication avec le serial
SPI.begin(); // Initialiser le bus SPI
rfid.PCD_Init(); // Initialiser carte rfid
clock.begin(); // Initialiser Horloge
clock.setDateTime(__DATE__, __TIME__);
pinMode(LED_V, OUTPUT); // Indiquer LED et Buzzer comme sortie
pinMode(LED_R, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
pinMode(BOUTON, INPUT_PULLUP);
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
pinMode(dataPin, OUTPUT); // Indiquer pin du 7_segments comme sortie d'infos
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.println("Présentez votre badge sur le lecteur ...");
Serial.println();
}
//Permet d'afficher un nombre sur le segment numérique
void sevenSegWrite(byte credit) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, chiffre[credit]);
digitalWrite(latchPin, HIGH);
}
//PROGRAMME
void loop() {
// Initialisé la boucle si aucun badge n'est présent
if ( ! rfid.PICC_IsNewCardPresent()) {
return; }
// Vérifier la présence d'un nouveau badge
if ( ! rfid.PICC_ReadCardSerial()) {
return; }
//Affiche date et heure lors du badge sur le moniteur série
dt = clock.getDateTime();
//Exemple --> Date : 2-5-2020 16:15:31
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");
//Afficher l'UID sur le moniteur série
Serial.print("UID Badge :");
String content= "";
byte letter;
for (byte i = 0; i < rfid.uid.size; i++)
{
Serial.print(rfid.uid.uidByte[i] < 0x12 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
content.concat(String(rfid.uid.uidByte[i] < 0x12 ? " 0" : " "));
content.concat(String(rfid.uid.uidByte[i], HEX));
}
//recup num serie lu dans la library des codes badge
sernum[0] = *((unsigned long *)rfid.uid.uidByte);
Serial.print(" ");
Serial.print(sernum[0]);
Serial.print(" ");
Serial.print(sernum[0], HEX);
Serial.print(" ");
tagok = 0;
for (byte i = 1; i < 12; i++) {
if (sernum[0] == sernum[i]) tagok = 1; // badge reconnue dans la liste
}
if (sernum[0] == sernum[12]) tagok = 255; // carte master reconnue
// faire si carte inconnue
if (tagok == 0) {
Serial.print("Bagge INCONNU");
Serial.println();
digitalWrite(LED_R, HIGH); //Allume LED Rouge + Buzzer son d'erreur
tone(BUZZER, 300);
delay(DENIED_DELAY);
digitalWrite(LED_R, LOW);
noTone(BUZZER);
}
//faire si carte reconnue
if (tagok >0)
{
digitalWrite(LED_V, HIGH);
tone(BUZZER,2093,150); //Allume LED VERTE + Buzzer son OK
digitalWrite(RELAY, HIGH);
Serial.print("Badge OK");
if (sernum[0] == sernum[1]) Serial.print(" - Badge 1 " );
if (sernum[0] == sernum[2]) Serial.print(" - Badge 2 " );
if (sernum[0] == sernum[3]) Serial.print(" - Badge 3 " );
if (sernum[0] == sernum[4]) Serial.print(" - Badge 4 " );
//etc...
if (sernum[0] == sernum[12]) Serial.print(" - Carte MASTER " );
//Appui Bouton play pour décrémenter le compteur de 1
etat_bouton = digitalRead(BOUTON);
if ((etat_bouton != mem_btn_play)&& (etat_bouton == LOW)){
credit--;
}
mem_btn_play = etat_bouton;
sevenSegWrite(credit);
if(credit < 0){ //ne descend pas en dessous de 0 et ne dépasse pas la valeur 9
credit = 0;}
if (credit > 9)
credit = 9;
}
delay(ACCESS_DELAY);
Serial.println();
digitalWrite(LED_V, LOW);
digitalWrite(RELAY, LOW);
noTone(BUZZER);
//faire si carte master reconnue
if (tagok == 255)
{
Serial.println("Carte Master Reconnu");
tone(BUZZER,1200, 100);
digitalWrite(LED_B, HIGH); //Allume LED VERTE puis BLEU + Double Buzzer son OK + ...
delay(4000);
digitalWrite(LED_B, LOW);
noTone(BUZZER);
}
}