Ahoi, I am trying to establish when 5 different RFID cards have been read.
P1 to P5 are set as 0, when the card is read the counter C=C+1 is set then the coresponding P is set to 1. If the same card is read again C remains unchanged. My problem is that after reading only one card C returns a value of 2! Can anyone see where I have gone wrong?
// Includes
#include <TM1637Display.h>
#include <Bounce2.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include "Waveshare_LCD1602_RGB.h"
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <RH_ASK.h>
RH_ASK driver;
// constants won't change. They're used here to set pin numbers:
const int GreenledPin = 6; // the number of the LED pin
const int RedledPin = 8; // the number of the LED pin
const int BlueledPin = 7; // the number of the LED pin
#define ActU A1 //CW is defined as pin #2//
#define ActD A2 //CCW is defined as pin #3//
#define CD A3
byte button1 = A0;
byte button4 = A6;
byte button5 = A7;
#define CLK 2
#define DI0 3
TM1637Display display(CLK, DI0);
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
Waveshare_LCD1602_RGB lcd(16, 2); //16 characters and 2 lines of show
// defines variables
bool buttonState1;
char Send[1] = " ";
int r, g, b = 0;
int P1 = 0;
int P2 = 0;
int P3 = 0;
int P4 = 0;
int P5 = 0;
int C = 0;
//void printDetail(uint8_t type, int value);
// Connections to dfPlayer module
const byte TxToDFPlayer = 4;
const byte RxFromDFPlayer = 5;
SoftwareSerial softwareSerial(RxFromDFPlayer, TxToDFPlayer); // RX, TX
DFRobotDFPlayerMini dfPlayer;
// GLOBALS
// States in which the game can be
typedef enum {Task1, Task2, Task3, Display, Solved, Idle } stateType;
// Assume that the game starts
stateType state = Idle;
// Create debounce objects for each of the mechanical switches
Bounce aswt = Bounce();
// CONSTANTS
const uint8_t OFF[] = {0, 0, 0, 0};
// In this library, the byte order is .GFEDCBA
void setup()/////////////////////////////////////////////////SET UP/////////////////////////////////////////
{
display.setBrightness(0x0f);
// Clear the display
display.setSegments(OFF);
display.showNumberDec (0000);
r = 255;
g = 0;
b = 0;
lcd.init();
lcd.setRGB(r, g, b);
lcd.setCursor(0, 0);
// initialize the pins :
pinMode(BlueledPin, OUTPUT);
pinMode(RedledPin, OUTPUT);
pinMode(GreenledPin, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(ActU, OUTPUT); //Set CW as an output//
pinMode(ActD, OUTPUT); //Set CCW as an output//
pinMode(CD, OUTPUT);
//blink LED
digitalWrite(GreenledPin, HIGH);
digitalWrite(BlueledPin, HIGH);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
digitalWrite(BlueledPin, LOW);
digitalWrite(RedledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
digitalWrite(BlueledPin, HIGH);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
digitalWrite(BlueledPin, LOW);
digitalWrite(RedledPin, LOW);
// Declare pin inputs and attach debounce objects
aswt.attach(button1);
aswt.interval(5);
Serial.begin(9600);
Serial.println();
// Print some useful debug output - the filename and compilation time
Serial.println(__FILE__);
Serial.println("Compiled: " __DATE__ ", " __TIME__);
if (!driver.init())
Serial.println("init failed");
Serial.println();
Serial.print(F("Initialising software serial interface to DFPlayer..."));
for (int i = 0; i < 10; i++) {
softwareSerial.begin(9600);
delay(500);
if (dfPlayer.begin(softwareSerial)) {
Serial.println(F("OK!"));
break;
}
else {
Serial.print(".");
}
if (i == 9) {
Serial.println(F("Failed :("));
return;
}
}
// Set volume (value from 0 to 30)
dfPlayer.volume(30);
SPI.begin();
mfrc522.PCD_Init();
lcd.send_string(" Scan ID Card");
}
void loop()
{
if (C == 5)
{
state = Solved;
}
//delay(2000);
buttonState1 = digitalRead(button1);
switch (state) {
case Task1:
if (analogRead(7) < 500)
{
char Send[1] = "8";
Serial.write(Send, 1);
display.setSegments(OFF);
display.showNumberDec (1243);
state = Task2;
lcd.clear();
lcd.send_string("Stage one ");
lcd.setCursor(0, 1);
lcd.send_string(" complete");
delay(2000);
lcd.clear();
lcd.send_string("Initiating");
lcd.setCursor(0, 1);
lcd.send_string("Stage Two");
delay(4000);
lcd.clear();
lcd.send_string("ATT 20 dBm");
lcd.setCursor(0, 1);
lcd.send_string("VERT. AMPL. 0,3 ");
} break;
case Task2:
if (analogRead(6) < 500)
{
char Send[1] = "9";
Serial.write(Send, 2);
state = Task3;
lcd.clear();
lcd.send_string("Stage two ");
lcd.setCursor(0, 1);
lcd.send_string(" complete");
delay(2000);
lcd.clear();
lcd.send_string("Initiating");
lcd.setCursor(0, 1);
lcd.send_string("Stage Three");
delay(2000);
lcd.clear();
lcd.send_string("Z to EARTH: TB25K");
lcd.setCursor(0, 1);
lcd.send_string("FREQ X100: SYNC EXT");
} break;
case Task3:
if (buttonState1 == LOW)
{
char Send[1] = "0";
Serial.write(Send, 2);
state = Display;
lcd.clear();
lcd.send_string("Stage three ");
lcd.setCursor(0, 1);
lcd.send_string(" complete");
r = 0;
g = 255;
b = 255;
lcd.setRGB(r, g, b);
lcd.clear();
lcd.send_string(" USERNAME:");
lcd.setCursor(0, 1);
lcd.send_string(" XXXXXXXX");
} break;
case Solved:
lcd.clear();
lcd.send_string("SOLVED");
delay(8000);
break;
case Idle:
if (C == 1)
{
display.showNumberDec (1000);
lcd.setCursor(0, 1);
lcd.send_string("1 CARD READ");
}
if (C == 2)
{
display.showNumberDec (1100);
lcd.setCursor(0, 1);
lcd.send_string("2 CARDS READ");
} if (C == 3)
{
display.showNumberDec (1110);
lcd.setCursor(0, 1);
lcd.send_string("3 CARDS READ");
} if (C == 4)
{
display.showNumberDec (1111);
lcd.setCursor(0, 1);
lcd.send_string("4 CARDS READ");
}
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
// lcd.send_string("UID tag :");
String content = "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.println(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.println(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
lcd.clear();
lcd.send_string("Message : ");
content.toUpperCase();
// This is the reaction to the individual cards
//Card A PLAYER 1
if (P1 == 0)
{ C = C + 1;
P1 = 1;
}
if (content.substring(1) == "A9 0B 9B 63") //Plz change to your cards UID
{ char Send[1] = "1";
lcd.setCursor(0, 1);
dfPlayer.playMp3Folder(1);
lcd.send_string("CHECKING ID");
delay(2000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
delay(2000);
lcd.clear();
r = 0;
g = 0;
b = 255;
lcd.setRGB(r, g, b);
lcd.send_string("HALLO PLAYER 1");
display.setSegments(OFF);
display.showNumberDec (7529);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(BlueledPin, HIGH);
delay(500);
digitalWrite(BlueledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 2);//
delay(1000);
dfPlayer.stop();
display.setSegments(OFF);
lcd.clear();
r = 255;
g = 0;
b = 0;
lcd.setRGB(r, g, b);
lcd.send_string(" Scan ID Card");
state = Idle;
if (P1 == 0)
{ C = C + 1;
P1 = 1;
}
break;
}
//Card B PLAYER 2
if (content.substring(1) == "29 F4 4F 47") //Plz change to your cards UID
{ char Send[1] = "2";
dfPlayer.playMp3Folder(2);
lcd.setCursor(0, 1);
lcd.send_string("CHECKING ID");
delay(2000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
delay(2000);
lcd.clear();
r = 0;
g = 0;
b = 255;
lcd.setRGB(r, g, b);
lcd.send_string("HALLO PLAYER 2");
display.setSegments(OFF);
display.showNumberDec (5492);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(BlueledPin, HIGH);
delay(500);
digitalWrite(BlueledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 2);//
delay(1000);
dfPlayer.stop();
display.setSegments(OFF);
lcd.clear();
r = 255;
g = 0;
b = 0;
lcd.setRGB(r, g, b);
lcd.send_string(" Scan ID Card");
if (P2 == 0)
{ C = C + 1;
P2 = 1;
}
state = Idle;
break;
}
//Card C PLAYER 3 CD
if (content.substring(1) == "B9 BE 76 48") //Plz change to your cards UID
{ char Send[1] = "3";
dfPlayer.playMp3Folder(3);
lcd.setCursor(0, 1);
lcd.send_string("CHECKING ID");
delay(2000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
delay(2000);
lcd.clear();
r = 0;
g = 0;
b = 255;
lcd.setRGB(r, g, b);
lcd.send_string("HALLO PLAYER 3");
display.setSegments(OFF);
display.showNumberDec (8431);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(BlueledPin, HIGH);
delay(500);
digitalWrite(BlueledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 2);//
delay(1000);
digitalWrite(CD, HIGH); //CD OPENS
delay(1000);
dfPlayer.stop();
digitalWrite(CD, LOW);
display.setSegments(OFF);
lcd.clear();
r = 255;
g = 0;
b = 0;
lcd.setRGB(r, g, b);
lcd.send_string(" Scan ID Card");
if (P3 == 0)
{ C = C + 1;
P3 = 1;
}
state = Idle;
break;
}
//Card D PLAYER 4
if (content.substring(1) == "C9 54 4E 47") //Plz change to your cards UID
{ char Send[1] = "4";
dfPlayer.playMp3Folder(4);
lcd.setCursor(0, 1);
lcd.send_string("CHECKING ID");
delay(2000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
delay(2000);
lcd.clear();
r = 0;
g = 0;
b = 255;
lcd.setRGB(r, g, b);
lcd.send_string("HALLO PLAYER 4");
display.setSegments(OFF);
display.showNumberDec (2467);
digitalWrite(BlueledPin, HIGH);
delay(500);
digitalWrite(BlueledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 2);//
delay(1000);
dfPlayer.stop();
display.setSegments(OFF);
lcd.clear();
r = 255;
g = 0;
b = 0;
lcd.setRGB(r, g, b);
lcd.send_string(" Scan ID Card");
if (P4 == 0)
{ C = C + 1;
P4 = 1;
}
state = Idle;
break;
}
//CARD E Player 5
if (content.substring(1) == "29 B6 65 63") //Plz change to your cards UID
{ char Send[1] = "5";
dfPlayer.playMp3Folder(5);
lcd.setCursor(0, 1);
lcd.send_string("CHECKING ID");
delay(2000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
delay(2000);
lcd.clear();
r = 0;
g = 0;
b = 255;
lcd.setRGB(r, g, b);
lcd.send_string("HALLO PLAYER 5");
display.setSegments(OFF);
display.showNumberDec (4835);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(BlueledPin, HIGH);
delay(500);
digitalWrite(BlueledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
delay(500);
digitalWrite(GreenledPin, HIGH);
delay(500);
digitalWrite(GreenledPin, LOW);
delay(500);
digitalWrite(RedledPin, HIGH);
delay(500);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 2);//
delay(1000);
dfPlayer.stop();
display.setSegments(OFF);
lcd.clear();
r = 255;
g = 0;
b = 0;
lcd.setRGB(r, g, b);
lcd.send_string(" Scan ID Card");
if (P5 == 0)
{ C = C + 1;
P5 = 1;
}
state = Idle;
break;
}
// RESET
if (content.substring(1) == "04 FD BE 29") //Plz change to your cards UID
{ lcd.setCursor(0, 1);
dfPlayer.playMp3Folder(6);
lcd.send_string("CHECKING ID");
delay(1000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
lcd.clear();
digitalWrite(ActD, HIGH); //Motor runs clockwise//
lcd.send_string(" * RESETTING * ");
lcd.setCursor(0, 1);
lcd.send_string("* DO NOT TOUCH *");
char Send[1] = "2";
Serial.write(Send, 2);//RESETTING
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 2);//OPENING
delay(26000);
digitalWrite(ActD, LOW);
dfPlayer.stop();
lcd.clear();
lcd.send_string(" Scan ID Card");
state = Idle;
break;
}
//Card OPENING
if (content.substring(1) == "ED 93 3B D5") //Plz change to your cards UID
{ lcd.setCursor(0, 1);
dfPlayer.playMp3Folder(7);
lcd.send_string("CHECKING ID");
delay(1000);
lcd.clear();
lcd.send_string("ID ACCEPTED");
lcd.clear();
digitalWrite(ActU, HIGH); //Motor runs clockwise//
lcd.send_string(" * Opening * ");
lcd.setCursor(0, 1);
lcd.send_string("* DO NOT TOUCH *");
char Send[1] = "6";
Serial.write(Send, 2);//OPENING
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
digitalWrite(RedledPin, HIGH);
delay(1000);
digitalWrite(RedledPin, LOW);
Serial.write(Send, 6);//OPENING
delay(26000);
digitalWrite(ActU, LOW);
dfPlayer.stop();
lcd.clear();
lcd.send_string(" Scan ID Card");
state = Idle;
break;
}
//Card P FOB START
if (content.substring(1) == "59 15 ED 63") //Plz change to your cards UID
{ char Send[1] = "7";
dfPlayer.playMp3Folder(8);
lcd.setCursor(0, 1);
lcd.send_string("CHECKING ID");
delay(2000);
lcd.send_string("ID Accepted");
r = 0;
g = 0;
b = 255;
lcd.setRGB(r, g, b);
delay(2000);
lcd.clear();
lcd.send_string("Hallo Professor");
delay(1000);
lcd.clear();
lcd.send_string("Start sequence");
Serial.write(Send, 2); //SYSTEM STARTING
delay(1000);
lcd.clear();
lcd.send_string("Initiating");
lcd.setCursor(0, 1);
lcd.send_string("Stage one");
delay(1000);
dfPlayer.stop();
lcd.clear();
r = 255;
g = 0;
b = 0;
lcd.setRGB(r, g, b);
lcd.send_string("FREQ: X1");
lcd.setCursor(0, 1);
lcd.send_string("DC TO SYNC.EXT.");
state = Task1;
break;
}
else
// Invalid cards
{ lcd.clear();
dfPlayer.playMp3Folder(9);
lcd.send_string("CHECKING ID");
delay(1000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.send_string(" ACCESS DENIED");