so for a school project im trying to build a Time Attendance System with an RFID Module. In the beginning i had the Problem that the RFID Sensor just randomly started reading out Blanks even if nothing is in the Proximity. I thought it might be an issue with the wiring between the SDHC Module and the RFID Module, so i soldered it. Now it doesnt read out any RFID Chips and the display only show white bars. So no reaction from the system. Wiring has else been checked and done as in the wiring diagram. The code was written after a Tutorial and parts have been tested individually before. They all worked individually. I think it might be a mistake in the code but i wasnt able to pinpoint anything yet.
As an explanation to what should happen is when you scan a RFID Card it logs it in with the Current Time and compares it to a set Time to evaluate if the check in is in time or too late. If in time the Green LED will flash else the Red one. Also while scanning it should notify the User via an audible beep from the Speaker that something was scanned. During the startup the LCD should display that the modules either fail or that the SD Card initalization was succesful. Times and Log Ins should be documented in a Text Document on the SD Card to be read out afterwards.
I will attach the wiring diagram and code.
I thankful for any help that might help me finish the project.
Thanks in advance.
Code: Select all
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 2, A0, A1, A2, A3);
#include <MFRC522.h> // for the RFID
#include <SPI.h> // for the RFID and SD card module
#include <SD.h> // for the SD card
#include <RTClib.h> // for the RTC
#include <Adafruit_I2CDevice.h>
// define pins for RFID
#define CS_RFID 10
#define RST_RFID 9
// define select pin for SD card module
#define CS_SD 4
// Create a file to store the data
File myFile;
// Instance of the class for RFID
MFRC522 rfid(CS_RFID, RST_RFID);
// Variable to hold the tag's UID
String uidString;
// Instance of the class for RTC
RTC_DS1307 rtc;
// Define check in time
const int checkInHour = 9;
const int checkInMinute = 5;
//Variable to hold user check in
int userCheckInHour;
int userCheckInMinute;
// Pins for LEDs and buzzer
const int redLED = 6;
const int greenLED = 7;
const int buzzer = 5;
void setup() {
// Set LEDs and buzzer as outputs
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(buzzer, OUTPUT);
// Init Serial port
Serial.begin(9600);
lcd.begin(16,2);
while(!Serial); // for Leonardo/Micro/Zero
// Init SPI bus
SPI.begin();
// Init MFRC522
rfid.PCD_Init();
// Setup for the SD card
Serial.print("Initializing SD card...");
lcd.print("Initializing ");
lcd.setCursor(0, 1);
lcd.print("SD card...");
delay(3000);
lcd.clear();
if(!SD.begin(CS_SD)) {
Serial.println("initialization failed!");
lcd.print("Initializing ");
lcd.setCursor(0, 1);
lcd.print("failed!");
return;
}
Serial.println("initialization done.");
lcd.print("Initialization ");
lcd.setCursor(0, 1);
lcd.print("Done...");
// Setup for the RTC
if(!rtc.begin()) {
Serial.println("Couldn't find RTC");
lcd.clear();
lcd.print("Couldn't find RTC");
while(1);
}
else {
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
if(!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
lcd.clear();
lcd.print("RTC Not Running!");
}
}
void loop() {
//look for new cards
if(rfid.PICC_IsNewCardPresent()) {
readRFID();
logCard();
verifyCheckIn();
}
delay(10);
}
void readRFID() {
rfid.PICC_ReadCardSerial();
lcd.clear();
Serial.print("Tag UID: ");
lcd.print("Tag UID: ");
uidString = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " +
String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
Serial.println(uidString);
lcd.setCursor(0, 1);
lcd.print(uidString);
delay(2000);
// Sound the buzzer when a card is read
tone(buzzer, 2000);
delay(200);
noTone(buzzer);
delay(200);
}
void logCard() {
// Enables SD card chip select pin
digitalWrite(CS_SD,LOW);
// Open file
myFile=SD.open("DATA.txt", FILE_WRITE);
// If the file opened ok, write to it
if (myFile) {
Serial.println("File opened ok");
lcd.clear();
lcd.print("File opened ok");
delay(2000);
myFile.print(uidString);
myFile.print(", ");
// Save time on SD card
DateTime now = rtc.now();
myFile.print(now.year(), DEC);
myFile.print('/');
myFile.print(now.month(), DEC);
myFile.print('/');
myFile.print(now.day(), DEC);
myFile.print(',');
myFile.print(now.hour(), DEC);
myFile.print(':');
myFile.println(now.minute(), DEC);
// Print time on Serial monitor
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.println(now.minute(), DEC);
Serial.println("sucessfully written on SD card");
lcd.clear();
lcd.print(now.year(), DEC);
lcd.print(':');
lcd.print(now.month(), DEC);
lcd.print(':');
lcd.print(now.day(), DEC);
lcd.print(' ');
lcd.setCursor(11, 0);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.setCursor(0, 1);
lcd.print("Written on SD...");
delay(2000);
myFile.close();
// Save check in time;
userCheckInHour = now.hour();
userCheckInMinute = now.minute();
}
else {
Serial.println("error opening data.txt");
lcd.clear();
lcd.print("error opening data.txt");
}
// Disables SD card chip select pin
digitalWrite(CS_SD,HIGH);
}
void verifyCheckIn(){
if((userCheckInHour < checkInHour)||((userCheckInHour==checkInHour) && (userCheckInMinute <= checkInMinute))){
digitalWrite(greenLED, HIGH);
delay(2000);
digitalWrite(greenLED,LOW);
Serial.println("You're welcome!");
lcd.clear();
lcd.print("You're Welcome!");
}
else{
digitalWrite(redLED, HIGH);
delay(2000);
digitalWrite(redLED,LOW);
Serial.println("You are late...");
lcd.clear();
lcd.print("You are Late...");
delay(3000);
lcd.clear();
lcd.print("Put RFID to Scan");
}
}