# include <MFRC522.h>
# include <SPI.h>
# include <SdFat.h>
# include <RTClib.h>
// Name des RTC-Moduls (rtc)
RTC_DS3231 rtc;
// Bezeichnung der SD-Karte
// entfällt bei der Bibliothek SD
SdFat SD;
// Bezeichnung der CSV-Datei
File Zeiterfassung;
// Anschlüsse RFID definieren
# define SDA 7
# define RST 9
// RFID-Empfänger benennen
MFRC522 mfrc522(SDA, RST);
// Datenpin für das SD-Kartenmodul
// int DatenPin = 4;
// Daten-Logger-Shield
int DatenPin = 10;
// Trennzeichen für die CSV-Datei
const String TrennZeichen = ";";
String Mitarbeiter;
void setup()
{
Serial.begin(9600);
SPI.begin();
// Initialisierung des RFID-Empfängers
mfrc522.PCD_Init();
/*
wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
Beispiel: 2022 August 31. 10 Uhr 30 Minuten 30 Sekunden
rtc.adjust(DateTime(2022, 8, 31, 10, 31, 30));
*/
// RTC-Modul starten
rtc.begin();
// SD-Karte starten
if (!SD.begin(DatenPin))
{
Serial.println(F("Initialisierung fehlgeschlagen!"));
} else Serial.println("SD-Karte gestartet!");
// rtc.now() -> aktuelle Zeit holen
DateTime aktuell = rtc.now();
char Datum[] = "DD.MM.YYYY ";
// Datum in Zeichenkette (String) umwandeln und anzeigen
Serial.print(aktuell.toString(Datum));
// Format der Zeitangabe festlegen
char Zeit[] = "hh:mm:ss";
// Zeitangabe in Zeichenkette (String) umwandeln und anzeigen
Serial.println(aktuell.toString(Zeit));
}
void loop()
{
// vom RFID ermttelter Wert der Karte als Folge von Dezimalzahlen
String WertDEZ;
// String Mitarbeiter löschen, damit falsche Karte erkannt wird
Mitarbeiter = "";
// Wenn keine Karte in Reichweite ist ..
if (!mfrc522.PICC_IsNewCardPresent())
{
// .. wird die Abfrage wiederholt.
return;
}
// Wenn kein RFID-Sender ausgewählt wurde ..
if (!mfrc522.PICC_ReadCardSerial())
{
// .. wird die Abfrage wiederholt.
return;
}
Serial.println(F("Karte entdeckt!"));
// Dezimal-Werte in String schreiben
for (byte i = 0; i < mfrc522.uid.size; i++)
{
WertDEZ = WertDEZ + String(mfrc522.uid.uidByte[i], DEC) + " ";
}
// dezimalen Wert anzeigen
Serial.println("Wert in dezimal: " + WertDEZ);
// Leerzeichen am Ende entfernen
WertDEZ.trim();
// Karten abfragen und Namen der Mitarbeiter*innen zuordnen
if (WertDEZ.compareTo("195 106 18 23") == 0) Mitarbeiter = "Klaus Drolshagen";
if (WertDEZ.compareTo("227 77 233 22") == 0) Mitarbeiter = "Eva Hilger";
if (WertDEZ.compareTo("179 150 17 23") == 0) Mitarbeiter = "Claudia Kruse";
// Namen abfragen
if (Mitarbeiter == "Klaus Drolshagen" || Mitarbeiter == "Eva Hilger" || Mitarbeiter == "Claudia Kruse")
{
/*
Daten in die Datei schreiben
Funktion DatenSchreiben aufrufen
*/
DatenSchreiben();
}
else Serial.println("Falsche Karte!");
delay(1000);
}
void DatenSchreiben()
{
// Meldungen im Seriellen Monitor
Serial.println("Schreibe Daten in Zeiterfassung.csv ... ");
Serial.println("Mitarbeiter*in: " + Mitarbeiter);
Serial.println("-----------------------------");
// rtc.now() -> aktuelle Zeit holen
DateTime aktuell = rtc.now();
char Datum[] = "DD.MM.YYYY ";
// Datum in Zeichenkette (String) umwandeln und anzeigen
Serial.print(aktuell.toString(Datum));
// Format der Zeitangabe festlegen
char Zeit[] = "hh:mm:ss";
// Zeitangabe in Zeichenkette (String) umwandeln und anzeigen
Serial.println(aktuell.toString(Zeit));
Zeiterfassung = SD.open("Zeiterfassung.csv", FILE_WRITE);
if (Zeiterfassung)
{
// Kopfzeile
Zeiterfassung.print(F("Mitarbeiter*in:"));
Zeiterfassung.print(TrennZeichen);
Zeiterfassung.print(F("Datum:"));
Zeiterfassung.print(TrennZeichen);
Zeiterfassung.print(F("Zeit"));
Zeiterfassung.println();
// Daten schreiben: Mitarbeiter*in, Datum und Zeit
Zeiterfassung.print(Mitarbeiter);
Zeiterfassung.print(TrennZeichen);
Zeiterfassung.print(Datum);
Zeiterfassung.print(TrennZeichen);
Zeiterfassung.print(Zeit);
Zeiterfassung.println();
Zeiterfassung.println();
}
// Datei schließen
Zeiterfassung.close();
Serial.println("Speichern abgeschlossen.");
Serial.println();
}
Letzte Aktualisierung: