HI ich möchte einen RFID Leser mit Master card programmieren komme aber nicht weiter.
habe ein Mega2560 board
vielen dank im Vorraus.
#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <pitches.h>
#define RST_PIN 5
#define SS_PIN 53
#define STATE_STARTUP 0
#define STATE_STARTING 1
#define STATE_WAITING 2
#define STATE_SCAN_INVALID 3
#define STATE_SCAN_VALID 4
#define STATE_SCAN_MASTER 5
#define STATE_ADDED_CARD 6
#define STATE_REMOVED_CARD 7
//#define REDPIN 6
//#define GREENPIN 7
const int cardArrSize = 10;
const int cardSize = 4;
byte cardArr[cardArrSize][cardSize];
byte masterCard[cardSize] = {153,252,148,153};
byte readCard[cardSize];
byte cardsStored = 0;
// Define the melodies for successful access and denied access
int access_melody[] = {NOTE_G4, 0, NOTE_A4, 0, NOTE_B4, 0, NOTE_A4,
0, NOTE_B4, 0, NOTE_C5, 0
};
int access_noteDurations[] = {8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 4};
int fail_melody[] = {NOTE_G2, 0, NOTE_F2, 0, NOTE_D2, 0};
int fail_noteDurations[] = {8, 8, 8, 8, 8, 4};
int speaker_pin = 4; // Pin connected to piezo sounder
int relayPin = 3;
// Create MFRC522 instance
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Set the LCD I2C address
LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
byte currentState = STATE_STARTUP;
unsigned long LastStateChangeTime;
unsigned long StateWaitTime;
//
void setup ()
{
Serial.begin(9600);
SPI.begin(); // Init SPI Bus
mfrc522.PCD_Init(); // Init MFRC522
lcd.begin(16,2);
LastStateChangeTime = millis();
updateState(STATE_STARTING);
pinMode(speaker_pin, OUTPUT);
pinMode(relayPin, OUTPUT);
}
//
void loop() ;
byte cardState;
cardState = readCardState();
updateState(cardState);
do {
if ((currentState != STATE_WAITING) &&
(StateWaitTime > 0) &&
(LastStateChangeTime + StateWaitTime < millis()))
{
updateState(STATE_WAITING);
}
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
{
cardState = readCardState();
updateState(cardState);
}
//------------------------------------------------------------------------------------
int readCardState()
{
int index;
Serial.print("Card Data - ");
for(index = 0; index < 4; index++)
{
readCard[index] = mfrc522.uid.uidByte[index];
Serial.print(readCard[index]);
if (index < 3)
{
Serial.print(",");
}
}
Serial.println(" ");
//Check Master Card
if ((memcmp(readCard, masterCard, 4)) == 0)
{
return STATE_SCAN_MASTER;
}
if (cardsStored == 0)
{
return STATE_SCAN_INVALID;
}
for(index = 0; index < cardsStored; index++)
{
if ((memcmp(readCard, cardArr[index], 4)) == 0)
{
return STATE_SCAN_VALID;
}
}
return STATE_SCAN_INVALID;
}
//------------------------------------------------------------------------------------
void addReadCard()
{
int cardIndex;
int index;
if (cardsStored <= 20)
{
cardsStored++;
cardIndex = cardsStored;
cardIndex--;
}
for(index = 0; index < 4; index++)
{
cardArr[cardIndex][index] = readCard[index];
}
}
//------------------------------------------------------------------------------------
void removeReadCard()
{
int cardIndex;
int index;
boolean found = false;
for(cardIndex = 0; cardIndex < cardsStored; cardIndex++)
{
if (found == true)
{
for(index = 0; index < 4; index++)
{
cardArr[cardIndex-1][index] = cardArr[cardIndex][index];
cardArr[cardIndex][index] = 0;
}
}
if ((memcmp(readCard, cardArr[cardIndex], 4)) == 0)
{
found = true;
}
}
if (found == true)
{
cardsStored--;
}
}
//------------------------------------------------------------------------------------
void updateState(byte aState)
{
if (aState == currentState)
{
return;
}
// do state change
switch (aState)
{
case STATE_STARTING:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("RFID Scanner");
lcd.setCursor(0,1);
lcd.print("Starting up");
StateWaitTime = 1000;
// digitalWrite(REDPIN, HIGH);//
// digitalWrite(GREENPIN, HIGH);
break;
case STATE_WAITING:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Waiting for Card");
lcd.setCursor(0,1);
lcd.print("to be swiped");
StateWaitTime = 0;
// digitalWrite(REDPIN, LOW);
// digitalWrite(GREENPIN, LOW);
break;
case STATE_SCAN_INVALID:
if (currentState == STATE_SCAN_MASTER)
{
addReadCard();
aState = STATE_ADDED_CARD;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Card Scanned");
lcd.setCursor(0,1);
lcd.print("Card Added");
StateWaitTime = 2000;
// digitalWrite(REDPIN, LOW);
// digitalWrite(GREENPIN, HIGH);
}
else if (currentState == STATE_REMOVED_CARD)
{
return;
}
else
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Card Scanned");
lcd.setCursor(0,1);
lcd.print("Invalid Card");
StateWaitTime = 2000;
for (int i = 0; i < 6; i++) { // Play intruder melody
int fail_noteDuration = 1000 / fail_noteDurations[i];
tone(speaker_pin, fail_melody[i], fail_noteDuration);
int fail_pauseBetweenNotes = fail_noteDuration * 1.30;
delay(fail_pauseBetweenNotes);
noTone(speaker_pin);
// digitalWrite(REDPIN, HIGH);
// digitalWrite(GREENPIN, LOW);
}
break;
case STATE_SCAN_VALID:
if (currentState == STATE_SCAN_MASTER)
{
removeReadCard();
aState = STATE_REMOVED_CARD;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Card Scanned");
lcd.setCursor(0,1);
lcd.print("Card Removed");
StateWaitTime = 2000;
// digitalWrite(REDPIN, LOW);
// digitalWrite(GREENPIN, HIGH);
}
else if (currentState == STATE_ADDED_CARD)
{
return;
}
else
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Card Scanned");
lcd.setCursor(0,1);
lcd.print("valid Card");
StateWaitTime = 2000;
for (int i = 0; i < 12; i++) { // Play welcome music
int access_noteDuration = 1000 / access_noteDurations[i];
tone(speaker_pin, access_melody[i], access_noteDuration);
int access_pauseBetweenNotes = access_noteDuration * 1.30;
delay(access_pauseBetweenNotes);
noTone(speaker_pin);
// digitalWrite(REDPIN, LOW);
// digitalWrite(GREENPIN, HIGH);
}
break;
case STATE_SCAN_MASTER:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Master Card");
lcd.setCursor(0,1);
lcd.print("Cards = ");
lcd.setCursor(8,1);
lcd.print(cardsStored);
StateWaitTime = 5000;
// digitalWrite(REDPIN, LOW);
// digitalWrite(GREENPIN, HIGH);
break;
}
{
/*lcd.clear();
lcd.setCursor(0,0);
lcd.print(aState);
lcd.setCursor(0,1);
lcd.print(currentState);*/
currentState = aState;
LastStateChangeTime = millis();
}
}