Ja klar kann ich machen
hier der Code:
// ╔══╗───╔╦╦══╦═╦╦═╗╔═╗
// ╚╗╔╩╦═╦╣║╠║║╣║║║║║║╬╠╦╦═╦═╦╦╦═╗╔══╦══╦═╦╦╗
// ─║║╬║║║║║╠║║╣║║║║║║╔╣╔╣╬║╬║╔╣╬╚╣║║║║║║╩╣╔╝
// ─╚╩═╩╩═╩═╩══╩╩═╩═╝╚╝╚╝╚═╬╗╠╝╚══╩╩╩╩╩╩╩═╩╝
// ────────────────────────╚═╝
String Version = "Version 1.5";
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
#define LED A5
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
MFRC522::StatusCode status;
String inputString = "read";
String assign_folder = "";
String assign_mode = "";
String assign_file = "";
String special = "";
byte special_2 = 0xEA;
byte trailerBlock = 7;
byte blockAddr = 4;
byte magicCookie[] = {0x13, 0x37, 0xB3, 0x47};
byte Card_Version = 0x02;
byte cardCookie[5];
byte dataBlock[25];
byte buffer[25];
byte size = sizeof(buffer);
byte len = 16;
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
Serial.setTimeout(2000);
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
show_logo();
pinMode(A5, OUTPUT);
digitalWrite(A5, HIGH);
}
void loop() {
if (Serial.available()) {
inputString = Serial.readStringUntil('\n');
inputString.toLowerCase();
}
if (inputString == "info") {
show_logo();
show_info();
inputString = "read";
}
if (! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if (! mfrc522.PICC_ReadCardSerial()) {
return;
}
if (inputString == "read") {
read_RFID();
}
if (inputString == "clear") {
for ( int i = 0; i < len; i++) {
dataBlock[i] = 0x00;
}
write_RFID();
Serial.println(F("Karte gelöscht!"));
Serial.println();
delay(250);
inputString = "read";
}
if (inputString == "admin") {
for ( int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = 0x00;
dataBlock[6] = 0xFF;
dataBlock[7] = 0x09;
dataBlock[8] = special_2;
write_RFID();
delay(250);
inputString = "read";
}
if (inputString == "toddler") {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = 0x00;
dataBlock[6] = 0x04;
dataBlock[7] = 0x00;
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
if (inputString.substring(0, 11) == "schlummern ") {
special = inputString.substring(11, 13);
if (special == "5" || special == "15" || special == "30" || special == "60") {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = 0x00;
dataBlock[6] = 0x01;
dataBlock[7] = special.toInt();
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
}
if (inputString == "kita") {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = 0x00;
dataBlock[6] = 0x05;
dataBlock[7] = 0x00;
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
if (inputString == "sperren") {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = 0x00;
dataBlock[6] = 0x03;
dataBlock[7] = 0x00;
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
if (inputString == "stoptanz") {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = 0x00;
dataBlock[6] = 0x02;
dataBlock[7] = 0x00;
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
if (inputString.substring(0, 6) == "write ") {
assign_folder = inputString.substring(6, 8);
assign_mode = inputString.substring(9, 10);
assign_file = inputString.substring(11, 14);
if (assign_folder.toInt() != 0 && assign_mode.toInt() > 0 && assign_mode.toInt() < 4 || assign_mode.toInt() == 5) {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = assign_folder.toInt();
dataBlock[6] = assign_mode.toInt();
dataBlock[7] = 0x00;
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
else if (assign_mode.toInt() == 4) {
if ( assign_file.toInt() > 255 || assign_file.toInt() == 0) {
Serial.println(F("Du kannst nur eine Datei zwischen 1-255 eingeben"));
Serial.println();
inputString = "read";
}
else if ( assign_folder.toInt() == 0 || assign_folder.toInt() > 99) {
Serial.println(F("Du kannst nur einen Ordner zwischen 1-99 eingeben"));
Serial.println();
inputString = "read";
}
else {
for (int i = 0; i < 4; i++) {
dataBlock[i] = magicCookie[i];
}
dataBlock[4] = Card_Version;
dataBlock[5] = assign_folder.toInt();
dataBlock[6] = assign_mode.toInt();
dataBlock[7] = assign_file.toInt();
dataBlock[8] = 0x00;
write_RFID();
delay(250);
inputString = "read";
}
}
else if (assign_mode.toInt() > 5) {
Serial.println(F("Diese Funktion gibt es noch nicht!"));
Serial.println();
inputString = "read";
}
}
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}
void read_RFID() {
MFRC522::StatusCode status;
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
delay(500);
return;
}
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
for (int i = 0; i < 4; i++) {
cardCookie[i] = buffer[i];
}
// Magic cookie
if (checkTwo(magicCookie, cardCookie) == true) {
Serial.println(F("Tonuino Karte erkannt:"));
Serial.print(F("READ\tBlock 4 = "));
for (int i = 0; i < len; i++) {
Serial.print(buffer[i] < 0x10 ? "0" : "");
Serial.print(buffer[i], HEX);
if (i == 15) {}
else {
Serial.print(F("|"));
}
}
Serial.println(F("-> HEX"));
assigned_mode(buffer);
}
else {
Serial.println(F("leere Karte!"));
Serial.print(F("READ\tBlock 4 = "));
for (int i = 0; i < len; i++) {
Serial.print(buffer[i] < 0x10 ? "0" : "");
Serial.print(buffer[i], HEX);
if (i == 15) {}
else {
Serial.print(F("|"));
}
}
Serial.println(F("-> HEX\n"));
}
}
void write_RFID() {
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
delay(500);
return;
}
status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, len);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("WRITE\tBlock 4 = "));
for (byte i = 0; i < len; i++) {
Serial.print(dataBlock[i] < 0x10 ? "0" : "");
Serial.print(dataBlock[i], HEX);
if (i == 15) {}
else {
Serial.print(F("|"));
}
}
Serial.println(F("-> HEX"));
assigned_mode(dataBlock);
delay(1000);
}
void assigned_mode( byte buffer[]) {
// Wiedergabemodus:
// Hörspiel Modus = 1
if (buffer[5] != 0x00 && buffer[6] == 0x01) {
Serial.print(F("Hörspiel Modus 1 -> eine zufällige Datei aus dem Ordner "));
Serial.print(buffer[5], DEC);
Serial.println(F(" abspielen"));
Serial.println();
}
// Album Modus = 2
if (buffer[5] != 0x00 && buffer[6] == 0x02) {
Serial.print(F("Album Modus 2 -> den kompletten Ordner "));
Serial.print(buffer[5], DEC);
Serial.println(F(" abspielen"));
Serial.println();
}
// Party Modus = 3
if (buffer[5] != 0x00 && buffer[6] == 0x03) {
Serial.print(F("Party Modus 3 -> Dateien des Ordners "));
Serial.print(buffer[5], DEC);
Serial.println(F(" in zufälliger Reihenfolge abspielen"));
Serial.println();
}
// Einzel Modus = 4
if (buffer[5] != 0x00 && buffer[6] == 0x04) {
Serial.print(F("Einzel Modus 4 -> die Datei "));
Serial.print(buffer[7], DEC);
Serial.print(F(" aus dem Ordner "));
Serial.print(buffer[5], DEC);
Serial.println(F(" abspielen"));
Serial.println();
}
// Hörbuch Modus = 5
if (buffer[5] != 0x00 && buffer[6] == 0x05) {
Serial.print(F("Hörbuch Modus 5 -> kompletten Ordner "));
Serial.print(buffer[5], DEC);
Serial.println(F(" spielen und Fortschritt merken"));
Serial.println();
}
// Modifikationskarten:
// Admin Karte
if (buffer[6] == 0xFF && buffer[7] == 0x09 && buffer[8] == 0xEA) {
Serial.println(F("Admin Karte"));
Serial.println();
}
// Schlummer Modus
if (buffer[5] == 0x00 && buffer[6] == 0x01) {
Serial.print(F("Schlummer-Modus -> "));
Serial.print(buffer[7], DEC);
Serial.println(F(" min"));
Serial.println();
}
// Stoptanz Karte
if (buffer[5] == 0x00 && buffer[6] == 0x02) {
Serial.println(F("Stoptanz Karte"));
Serial.println();
}
// TonUINO sperren
if (buffer[5] == 0x00 && buffer[6] == 0x03) {
Serial.println(F("TonUINO sperren"));
Serial.println();
}
// Toddler Modus
if (buffer[5] == 0x00 && buffer[6] == 0x04) {
Serial.println(F("Toddler-Modus"));
Serial.println();
}
// KiTa Karte
if (buffer[5] == 0x00 && buffer[6] == 0x05) {
Serial.println(F("KiTa Karte"));
Serial.println();
}
}
void show_logo() {
Serial.println(F(" ╔══╗───╔╦╦══╦═╦╦═╗╔═╗"));
Serial.println(F(" ╚╗╔╩╦═╦╣║╠║║╣║║║║║║╬╠╦╦═╦═╦╦╦═╗╔══╦══╦═╦╦╗"));
Serial.println(F(" ─║║╬║║║║║╠║║╣║║║║║║╔╣╔╣╬║╬║╔╣╬╚╣║║║║║║╩╣╔╝"));
Serial.println(F(" ─╚╩═╩╩═╩═╩══╩╩═╩═╝╚╝╚╝╚═╬╗╠╝╚══╩╩╩╩╩╩╩═╩╝"));
Serial.println(F(" ────────────────────────╚═╝"));
Serial.println(F("für TonUINO Karten"));
Serial.println(F("Designed and created by Christian Kühner 10/2022\n"));
Serial.println(Version);
mfrc522.PCD_DumpVersionToSerial();
Serial.println();
}
void show_info() {
Serial.println(F("Befehle:"));
Serial.println(F(" clear\t\t\t-> Sektor 1 / Block 4 der RFID Karte wird auf 0x00 geschrieben,"));
Serial.println(F("\t\t\t durch fehlen des magick cookie wird Sie vom TonUINO als neue Karte erkannt."));
Serial.println(F(" write {xx} {n}\t-> Erstellt TonUINO-Karte aus Ordnernummer {xx} und Wiedergabemodus {n}"));
Serial.println(F("\t\t\t und zeigt diese an. z.B. write 01 2 -> spielt den Ordner 1 im Album Modus ab."));
Serial.println(F(" admin\t\t\t-> Erstellt eine Admin Karte."));
Serial.println(F(" toddler\t\t-> Erstellt eine Toddler Karte."));
Serial.println(F(" schlummern {nn}\t-> Erstellt eine Schlummer Karte und zeigt die Minuten {nn} an."));
Serial.println(F(" stoptanz\t\t-> Erstellt eine Stoptanz Karte."));
Serial.println(F(" kita\t\t\t-> Erstellt eine KiTa Karte."));
Serial.println(F(" sperren\t\t-> Erstellt eine TonUINO Sperr-Karte."));
Serial.println(F(" info\t\t\t-> zeigt diese Info an."));
Serial.println(F("\n"));
}
bool checkTwo(uint8_t a[], uint8_t b[]) {
for (uint8_t k = 0; k < 4; k++) { // Loop 4 times
if ( a[k] != b[k] ) { // IF a != b then false, because: one fails, all fail
return false;
}
}
return true;
}
Ich habe versucht das ganze einfach zu gestalten damit jeder die Funktionen versteht.