Zeit­er­fas­sung RFID und SD-Karten-Modul

# 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: 5. Sep 2022 @ 21:33