DE Keyboard problem

#include <HID-Project.h>
#include <HID-Settings.h>

const int BTN = 9;                    // Taster an D9 → GND
const unsigned long DEBOUNCE = 30;    // ms Entprellen
const char* TEXT = "ABC_XYZ_abx_xyz";      // ASCII-Test

bool lastState = HIGH;
unsigned long t0 = 0;

void setup() {
  pinMode(BTN, INPUT_PULLUP);   // interner Pullup
  Keyboard.begin();
}

void loop() {
  bool now = digitalRead(BTN);
  if (now != lastState) { t0 = millis(); lastState = now; }
  if (now == LOW && (millis() - t0) > DEBOUNCE) {
    Keyboard.print(TEXT);
    while (digitalRead(BTN) == LOW) {}
    delay(50);
  }
}

//Sendet: ABC?XZY?abx?xzy

Wie kann ich die richtigen Zeichen senden ?
(Auf einem Arduino Leonardo)

Ein paar mehr Informationen solltest du schon posten.
Was genau soll dein Sketch machen und was funktioniert nicht ?

Hallo,

(sorry wenn ich aus der Firma Antworte darf ich meinen Account nicht benutzen drum haben ich 2 einen für daheim (LInuxPC) und einen in der Firma(WindowsPC).)

Der Scetch sendet auf HID den Text "ABC_XYZ_abx_xyz"
Dieser sendet auch und es kommt aber “ABC?XZY?abx?xzy” an
Irgendwie versteht der nicht das ich ein deutsches Keybord habe.

Und es ist auf Windows das gleiche Problem wie auch auf Linux

Gruß Heinz

Bedienungsanleitung lesen:

ok Danke - ich blick mit den Keybords nicht wirklich durch und habe mich für die Variante der einzelnen Zeichen schicken entschieden

#define HID_CUSTOM_LAYOUT
#define LAYOUT_GERMAN
#include <HID-Project.h>
#include <HID-Settings.h>

const uint8_t BTN = 9;                  // Taster an D9 -> GND
const unsigned long DEBOUNCE = 30;      // ms
const String text = "ABC_XYZ_abx_xyz";  // Soll exakt so erscheinen

bool lastState = HIGH;
bool sentOnThisPress = false;
unsigned long tChange = 0;

void setup() {
  pinMode(BTN, INPUT_PULLUP);
  delay(4000);              // USB-Enumeration abwarten
  Keyboard.begin();     // NICHT BootKeyboard! Keine Arduino-Keyboard-Lib!
}

void loop() {
  bool now = digitalRead(BTN);

  if (now != lastState) {
    lastState = now;
    tChange = millis();     // Entprellen: Zeit der Flanke merken
  }

  if (now == LOW && (millis() - tChange) > DEBOUNCE) {
    if (!sentOnThisPress) {
  // --- alle Zeichen einzeln senden ---
  for (int i = 0; i < text.length(); i++) {
    Keyboard.write(text[i]);     // einzelnes Zeichen senden
    delay(20);                   // kleine Pause zwischen Tasten (optional)
  }

  Keyboard.write(KEY_RETURN);    // ENTER-Taste drücken
  Keyboard.end();                // Tastatur deaktivieren (optional)
      sentOnThisPress = true;
    }
  } else if (now == HIGH) {
    sentOnThisPress = false;      // freigeben für den nächsten Druck
  }
}

Ich möchte einfach mal auf Knopfdruck ein Passwort eingeben das evtl 64Stellen hat.

Das ändert nichts an deinem Problem:
Der Buchstabe '_' wird in einen Tastencode gewandelt und an den PC gesendet, der dann dort mit einer anderen Layout-Tabelle in ein '?' gewandelt wird.

Wenn du dem PC sagst, dass eine deutsche Tastatur dranhängt, musst du das auch so im Arduino einstellen (oder umgekehrt)

Um dir @Kai-R s link vorzulesen:

Recent releases of the HID Library have support for the most common layouts, so that they will always press the key corresponding to the character you want to type. Just use:

Keyboard.write('Y');

For this to work, you will need to add the following at the top of your sketch:

#define HID_CUSTOM_LAYOUT
#define LAYOUT_GERMAN

Make sure to add it before the #include <HID-Project.h> directive. Of course you can customize the second line to choose your desired keylayout. You can have a glimpse at the available layouts at the bottom of the ImprovedKeylayouts.h file.

Moin @heinzs1 ,

ich habe hier mal einen Sketch geschrieben, der auch längere Texte aus dem Flashspeicher eines Controllers auf Knopfdruck an einen PC überträgt:

https://forum.arduino.cc/t/text-auf-tastendruck/1399159/30

Dabei werden bestimmte Sonderzeichen in der Funktion "void char2Keyboard(byte cOut) " umcodiert, so dass sie vom PC (Linux wie auch unter Windows) korrekt erkannt werden.

Eine kurze Erläuterung dazu findest Du im o.a. Thread in meinem Post 26.

Gerne mal testen ...

Gruß
ec2021

P.S.: Der Sketch wurde bei mir auf einem Pro Micro (in der Arduino IDE wie ein Leonardo anzusprechen) getestet. Für Deinen Anwendung müsstest Du nur das Pin-Array und das Text-Array anpassen.
Aber Achtung: Wenn man den Text sofort ausgeben lässt, sobald das Board angeschlossen wird oder nicht sicherstellt, dass der Fokus auf dem beabsichtigen Fenster liegt, können ggf. äußerst unangenehme DInge passieren. Bei bösartigen Kommandos bis hin zum Löschen der Festplatte !!!! Es zeigt, wie gefährlich es ist, unbekannte Hardware per USB anzuschließen ... :wink:

Erfahrene Elektriker behalten immer eine Hand in der Hosentasche. Und tragen isolierende Arbeitsschuhe.

:slight_smile:

Wenn man den USB-Stick ausschließlich zusammen mit der Hand in die Hosentasche steckt, reicht das natürlich vollkommen aus... :wink: