RC522 und Keybordausgabe Deutsch-schweiz

Hallo zusammen. Ich habe hier ein Skript angehängt. Ich habe das Problem, dass ich keine Deutsch-Schweiz Tastaturausgabe über die Library realisieren kann. Es ist wichtig, dass ich die Zeichen $, !, und @ als Tastatureingaben verwenden kann. Zur Beschreibung des Projekts: Das Leonardo-Board verfügt über ein RC522 Lesegerät. Nun zum Beginn: Das Lesegerät erkennt einen hinterlegten RFID-Chip. Falls dieser der richtige ist, gibt es das Passwort als Tastatureingabe aus und bestätigt mit Enter. Falls der RFID-Chip nicht hinterlegt ist, gibt es einen Tastaturfehler aus. Um einen RFID-Chip am Gerät zu hinterlegen, gibt man 'Neu' oder 'neu' ein. Dann sucht es nach einem RFID-Chip, und wenn dieser gefunden wird, wird er in einer Variable gespeichert. Danach wird auf eine serielle Eingabe gewartet, wo man das Passwort eingeben kann. Auch dieses wird in Variablen gespeichert. Alle zwei Variablen werden im EEPROM hinterlegt, falls ein Stromausfall auftritt, um sicherzustellen, dass diese beiden Informationen nicht verloren gehen. Weiß jemand, wie ich das Problem über das Skript lösen kann oder das Skript anpassen kann? Ich wäre auch bereit, für diese Hilfe etwas zu geben.

#include <Keyboard.h>
#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
const int ledPin = 13; //----- Bestimmt welche Pin zuständig ist für LED-----

#define RST_PIN 9
#define SS_PIN 10

MFRC522 mfrc522(SS_PIN, RST_PIN);  // -----Create MFRC522 instance.-----

String Variable1;      // -----RFID ID-----
String Variable2;      // -----zu schreibendes Passwort-----

boolean program1Active = true;  // -----Schaltet beim 1 mal stromzufuhr Program 1 ein-----

void setup() {
  Serial.begin(9600);   //----- Initiate a serial communication-----
  SPI.begin();      // -----Initiate  SPI bus-----
  mfrc522.PCD_Init();   // -----Initiate MFRC522-----
  Keyboard.begin();     // -----Initiate Keyboard library-----
  pinMode(ledPin, OUTPUT); //----- Bestimmt das LED ein Ausgang ist -----
  
  readFromEEPROM();     //-----Lesen des EEPROM Speicher-----
}

void loop() {
  if (program1Active) {
    program1();  //-----Prüft ob CHIP im Kartenleser hinterlegt ist-----
  } else {
    program2();  //-----Zu Progammierung des RFID ID und zum zuweisen des Passwort-----
  }
}

void program1() {
  //-----Check die RFID chip-----
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    String rfid = getRFID(mfrc522.uid.uidByte);
    Serial.println("RFID Chip gefunden: " + rfid);
    
    //-----bei Regstristiertem CHIP-----
    if (rfid.equals(Variable1)) {
      
      Keyboard.println(Variable2);
      delay(500);
      Keyboard.write(KEY_RETURN);
      digitalWrite(ledPin, true); //-----Led für 2 Sekunden ein-----
      delay(2000);
      digitalWrite(ledPin, false);
    } 
    
    else {
      //-----bei nicht regristierem CHIP-----
      Keyboard.println("Fehler"); //-----Ausgabe per Keyboard Fehler und blinken der LED-----
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100); 
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100); 
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      digitalWrite(ledPin, true);
      delay(100);
      digitalWrite(ledPin, false);
      delay(100);
      
      
      
    }
  }
  
  //-----Überprüft den seriellen eingang auf das Neu & und neu für Program 2 zu starten -----
  if (Serial.available() > 0) {
    String input = Serial.readString();
    input.trim();
    if ((input.equals("Neu")) || (input.equals("neu"))) {
      program1Active = false;
      Serial.println("Editor Untermenu"); //-----Gibt serielle ausgabe aus damit man weiss das mann ins Untermenü gelangt-----
    }
  }
}

void program2() {
  String rfid;
  String newPassword;
  
  Serial.println("Chip wird gesucht."); //-----Gibt serielle ausgabe  Chip wird gesucht-----  
  //-----RFID suchen----- 
  while (!rfid.length()) {
    if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {  //-----Fals Chip gefunden und Chip ID gelesen in Variable rfid schreiben-----
      rfid = getRFID(mfrc522.uid.uidByte);
    }
  }
  
  Serial.println("RFID Chip gefunden: " + rfid);
  Serial.println("Neues Passwort eingeben: ");
  
  //-----Wartet auf Serielle eingabe ( Passwort )-----
  while (!Serial.available()) {}
  newPassword = Serial.readString();
  newPassword.trim();
  
  //-----Schreibt new Passwort in die Variable 2 und RFID in Variable 1-----
  Variable1 = rfid;
  Variable2 = newPassword;
  program1Active = true;
  Serial.println("Passwort gespeichert, kann jetzt verwendet werden.");
  
  writeToEEPROM();     
}

//-----Schreibt alle Variablen in die EEPROM-----

String getRFID(byte* uid) {
  String rfid = "";
  for (byte i = 0; i < 4; i++) {
    rfid += String(uid[i], HEX);
  }
  mfrc522.PICC_HaltA();
  return rfid;
}

void readFromEEPROM() {
  int addr = 0;
  byte dataLen = EEPROM.read(addr);
  addr++;
  
  for (byte i = 0; i < dataLen; i++) {
    Variable1 += (char)EEPROM.read(addr);
    addr++;
  }
  
  dataLen = EEPROM.read(addr);
  addr++;
  
  for (byte i = 0; i < dataLen; i++) {
    Variable2 += (char)EEPROM.read(addr);
    addr++;
  }
}

void writeToEEPROM() {
  int addr = 0;
  byte dataLen = Variable1.length();
  
  EEPROM.write(addr, dataLen);
  addr++;
  
  for (byte i = 0; i < dataLen; i++) {
    EEPROM.write(addr, Variable1[i]);
    addr++;
  }
  
  dataLen = Variable2.length();
  
  EEPROM.write(addr, dataLen);
  addr++;
  
  for (byte i = 0; i < dataLen; i++) {
    EEPROM.write(addr, Variable2[i]);
    addr++;
  }
}

1 Like

Hallo fahrni

Herzlich Willkommen im weltbesten Arduino Forum der Welt.

Schaue mal hier.

Hoi Paulpaulson
Danke für deinen Tipp.
Ich bekomme es einfach nicht hin. Sogar mit der GitHub - MichaelDworkin/Arduino-Leonardo-USB-Keyboard-Deutsch-library: Arduino Leonardo USB Keyboard Deutsch ( german ) layout library habe ich es nicht geschaft.

Da tuen mir die Augen weh. Bitte mach das Fehlergeblinke mit einer FOR Schleife.

Du hast 2 verschiedene Buchstabenkodierungen:
ASHII von der Seriellen Eingabe
Key Scan Code vom Leonardo.

und wie am Ende des Artikels geraten:
"For the list of layout-specific key definitions, see the respective Keyboard_*.h file within the library sources."

Umlaute:

Für die anderen Sonderzeichen orientiere Dich welche Zeichen auf der englischen Tastatur liegen würden und nicht auf Deiner Deutschen.

Grüße Uwe

Du meinst "ASCII" :slightly_smiling_face:

Hab ich das nicht so gedacht? :innocent: :innocent:

Haha ja hast recht uwefed. Ich bin nicht gerade der Fachprofi von der Programmierung. Es ist auch eher ein Hobby das ich ab und zu mal mache. Meine Kenntnisse sind nicht gerade Rissig was das angeht. Deswegen holle ich mir da ja Hilfe von den Profis. Es ist mir gerade zu viel mit den ASCII und so :slight_smile: hoffe trotzdem jemand schreibt mir den Skript korrigiert :).

Hallo zusammen
Bin auch Neuling im Thema Arduino.
Auf das gleiche Problem bin ich auch schon gestossen, habe aber das Projekt aus nicht wissen wieder verworfen. Stelle nun die Tastatur unter Windows einfach um. :blush:
Es wäre aber cool wenn sich jemand der sich damit auskennt, da Hilfe leisten könnte.
Komme da mit der Datei Keyboard_*.h nicht klar. Habe mich mal versucht, aber ohne Erfolg. :unamused:
Würde da gerne dazu Lernen :yum: jeder hat mal angefangen... :yum:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.