Text auf Tastendruck

Das hab ich so auch nicht geschrieben.
Nur wird erst MEINE Entscheidung für das vorhalten der 2ten Seriellen und dann auch noch das 2ms delay() in genau 2 Codes madig gemacht und sogar als schmutzig bezeichnet, obwohl es ausdrücklich kommentiert war - da fragt man sich dann, ob die Entscheidung Dir mit einem Schnipsel einen Anstoß zu geben die richtige war.

edit: Zu Deinem Umlautproblem: Es gibt eine Unterstützung für Umlaute in der lib. Das müßte man austesten. Andernfalls wäre auch die Variante das komplett als Tastaturcode zu übertragen. Aber damit setze Dich auseinander, wenn gesichert ist, dass Du überhaupt erstmal die Zeichen verarbeiten kannst.

Neu:

Keyboard.begin(KeyboardLayout_de_DE);

sollte auch Umlaute können.

Nur wird erst MEINE Entscheidung für das vorhalten der 2ten Seriellen und dann auch noch das 2ms delay() in genau 2 Codes madig gemacht

Deine bestimmende Ansage, tx und rx frei zu halten, war mir zu absolut.
Zu willkürlich. Selbst das Argument mit dem debuggen schien mir dann zu sehr an den Haaren herbei gezogen, da es ja noch die native Serielle über USB gibt. Die reicht zum debuggen.

Mit gleichem Recht könnte man I2C oder/und SPI frei halten wollen, um externe Speicher anbinden zu können, für längere Texte.

Also, zum "madig machen":

Es lassen sich alle Pins benutzen, die sonst nicht gebraucht werden.
Damit fallen RX/TX (0,1) aus.

Der TO braucht die beiden Pins offensichtlich nicht zum debuggen.
Damit sind auch diese frei, für beliebig andere Zwecke.

Bei einem UNO, Mega usw. würde ich dir zustimmen, da diese Pins wirklich zum Upload und zum Debuggen benutzt werden.


Moin @dn75-44 ,

ich habe eben einen Sketch erstellt, der acht verschiedene Texte auf Knopfdruck per Keyboard-Lib an einen Rechner ausgibt:

/*
  Forum: https://forum.arduino.cc/t/text-auf-tastendruck/1399159
  
  2025/08/02
  ec2021

*/

#include "Keyboard.h"

constexpr byte buttonPin[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
constexpr uint8_t noOfButtons = sizeof(buttonPin) / sizeof(buttonPin[0]);
constexpr uint16_t maxZeichen{ 2000 };

constexpr char text1[] PROGMEM = "Dies ist der erste Text: <|> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text2[] PROGMEM = "Text §2: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ENDE ";
constexpr char text3[] PROGMEM = "Text 3: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ENDE ";
constexpr char text4[] PROGMEM = "Text 4: !§$%&/=  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text5[] PROGMEM = "Text 5: ?*+#.,;-_  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text6[] PROGMEM = "Dies ist der sechste Text mit Klammern: {[()]}  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text7[] PROGMEM = "Dies ist der siebte Text: ÄÖÜßäöü  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text8[] PROGMEM = "Und hier noch der achte: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";



constexpr char* const tabelle[] PROGMEM = { text1, text2, text3, text4, text5, text6, text7, text8 };

class btClass {
private:
  byte pin;
  byte state = HIGH;
  byte lastState = HIGH;
  unsigned long lastChange = 0;
public:
  void init(byte aPin) {
    pin = aPin;
    pinMode(pin, INPUT_PULLUP);
  }
  boolean pressed() {
    byte actState = digitalRead(pin);
    if (actState != lastState) {
      lastChange = millis();
      lastState = actState;
    }
    if (state != lastState && millis() - lastChange > 30) {
      state = lastState;
      return state;  // ergibt true, wenn der pin-State von LOW auf HIGH wechselt
    }
    return false;
  }
};

btClass button[noOfButtons];


void setup() {
  for (int i = 0; i < noOfButtons; i++) {
    button[i].init(buttonPin[i]);
  }
  Keyboard.begin(KeyboardLayout_de_DE);
}

void loop() {
  for (int i = 0; i < noOfButtons; i++) {
    if (button[i].pressed()) {
      printText(i);
    }
  }
}

void printText(int no) {
  char buffer[maxZeichen];
  strncpy_P(buffer, (char*)pgm_read_word(&(tabelle[no])), maxZeichen);
  buffer[maxZeichen - 1] = 0x00;
  int i = 0;
  boolean isSpecial = false;
  while (buffer[i] != 0x00) {
    byte c = buffer[i++];
    c = c & 0xFF;
    boolean useShift = false;
    if (isSpecial) {
      switch (c) {
        case 0x84:  // Ä
          useShift = true;
        case 0xA4:  // ä
          c = 0xBC;
          break;
        case 0x96:  // Ö
          useShift = true;
        case 0xB6:  // ö
          c = 0xBB;
          break;
        case 0x9C:  // Ü
          useShift = true;
        case 0xBC:  // ü
          c = 0xB7;
          break;
        case 0x9F:  // ß
          c = 0xB5;
          break;
        case 0xA7:
          useShift = true;
          c = '3';
          break;
      }
      isSpecial = false;
    }
    if (c == 0xC3 || c == 0xC2) {
      isSpecial = true;
    } else {
      if (useShift) {
        Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.press(char(c));
        delay(5);
        Keyboard.releaseAll();
        useShift = false;
      } else {
          Keyboard.print(char(c));
      }
    }
  }
  Keyboard.println();
}

Der Sketch verwendet die Arduino-Keyboard-Library https://docs.arduino.cc/language-reference/en/functions/usb/Keyboard/, wobei Keyboard.begin() mit deutschem Tastaturlayout aufgerufen wird (KeyboardLayout_de_DE).

Die Umlaute, das Eszett und das Paragraphen-Zeichen müssen im Sketch leider trotzdem separat behandelt werden, da sie ansonsten (zumindest an meinem PC unter Win 11) nicht korrekt emuliert wurden. Das wäre zu testen...

Den Sketch habe ich anhand eines Pro Micro, der kleinen Bauform des Leonardo, getestet.

Die Serielle Schnittstelle zum PC funktioniert dabei parallel zur Keyboard-Anwendung, auch wenn die Pins 0 und 1 mit Tasten belegt sind. Die entsprechenden Aufrufe, die beim Debuggen hilfreich waren, habe ich aus dem o.a. Sketch entfernt.

Da der RAM des Pro Micro wie der eines Leonardo begrenzt ist, bleibt die Frage, was Du unter

dann wird jede Menge Text ausgegeben

verstehst. Der o.a. Sketch ist vermutlich noch nicht die endgültige Lösung, aber u.U. ein Schritt in die gewünschte Richtung.

Gruß
ec2021

Die Umlaute, das Eszett und das Paragraphen-Zeichen müssen im Sketch leider trotzdem separat behandelt werden, da sie ansonsten (zumindest an meinem PC unter Win 11) nicht korrekt emuliert wurden.

Meine Vermutung/Ahnung:
Unsere Arduino Quelltexte sind in utf8, Win verwendet immer noch in weiten Teilen 8Bit Codepages.

Das halte ich durchaus für korrekt:

  • Das Eszett wird im char array mit 0xC3 und 0x9F codiert und muss dann als 0xB5 ausgegeben werden.
  • Die Umlaute entsprechend UTF8 (siehe Tabelle unten)
  • Das Paragraphenzeichen wird als 0xC2 und 0xA7 codiert und lässt sich dann als SHIFT '3' emulieren.


https://de.wikipedia.org/wiki/UTF-8

Wie gesagt --> Umsetzung für Windows!

Gruß
ec2021

P.S.:

Habe den Pro Micro nun zusätzlich

  • an einem Linux-Rechner (kubuntu) mit LibreOffice
  • an einem Raspberry Pi 4 (Bullseye) mit Texteditor

als "Text-Empfänger" getestet. Klappt genauso.

Die Umsetzung zum Rechner sollte demnach wohl mit der Abbildung von UTF8 auf das Tastaturlayout zusammenhängen.

Win verwendet immer noch in weiten Teilen 8Bit Codepages.

Das hat mit dem Problem nur wenig bzw indirekt zu tun. Hier geht es darum, Tastaturbetätigungen zu simulieren, und die Einstellung "deutsche Tastatur" simuliert eben einen Tastendruck "unten links", wenn man ein 'y' vorgibt. (Was sonst bei einem 'z' passiert.)
Ob überhaupt 2byte Codes als vorgegebene utf8 Zeichen zusammengefasst werden und einen einzelnen Tastendruck generieren, wäre eine Frage an die Arduino keyboard library, und hat wenig mit Windows zu tun.

1 Like

Meine Tests mit Linux (im "Nachspann" von Post 26) bestätigen den Zusammenhang mit dem Tastaturlayout ...

Also ich habe jetzt das erste Script von my_xy_projekt und das Script von ec2021 ausprobiert.
Bei beiden passiert nichts, wenn ich beispielsweise den A0 oder A1 gegen GND schließe.

Hier eine Weiterführung des Sketches von Post 24:

/*
  Forum: https://forum.arduino.cc/t/text-auf-tastendruck/1399159
  
  2025/08/05
  ec2021

*/

#include "Keyboard.h"

constexpr byte buttonPin[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
constexpr uint8_t noOfButtons = sizeof(buttonPin) / sizeof(buttonPin[0]);

constexpr char text1[] PROGMEM = "Version 1.0 05.08.2025:  Liest Text zeichenweise aus dem Flash-Speicher und gibt sie über Keyboard aus. ";
constexpr char text2[] PROGMEM = "Text §2: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ENDE";
constexpr char text3[] PROGMEM = "Text 3: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ENDE ";
constexpr char text4[] PROGMEM = "Text 4: !§$%&/=  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text5[] PROGMEM = "Text 5: ?*+#.,;-_  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text6[] PROGMEM = "Dies ist der sechste Text mit Klammern: {[()]}  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text7[] PROGMEM = "Dies ist der siebte Text: ÄÖÜßäöü  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ENDE";
constexpr char text8[] PROGMEM =
  "Längentest: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy \
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At \
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur \
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna \
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. \
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum \
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut \
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor \
sit amet. ENDE";



constexpr char* const tabelle[] = { text1, text2, text3, text4, text5, text6, text7, text8 };

class btClass {
private:
  byte pin;
  byte state = HIGH;
  byte lastState = HIGH;
  unsigned long lastChange = 0;
public:
  void init(byte aPin) {
    pin = aPin;
    pinMode(pin, INPUT_PULLUP);
  }
  boolean pressed() {
    byte actState = digitalRead(pin);
    if (actState != lastState) {
      lastChange = millis();
      lastState = actState;
    }
    if (state != lastState && millis() - lastChange > 30) {
      state = lastState;
      return state;  // ergibt true, wenn der pin-State von LOW auf HIGH wechselt
    }
    return false;
  }
};

btClass button[noOfButtons];


void setup() {
  Serial.begin(115200);
  for (int i = 0; i < noOfButtons; i++) {
    button[i].init(buttonPin[i]);
  }
  Keyboard.begin(KeyboardLayout_de_DE);
}

void loop() {
  for (int i = 0; i < noOfButtons; i++) {
    if (button[i].pressed()) {
      printText(i, true);
    }
  }
}


void printText(int no, boolean LINEFEED) {
  size_t textLen = strlen_P(tabelle[no]);
  Serial.println(textLen);
  for (size_t k = 0; k < textLen; k++) {
    byte aChar = pgm_read_byte_near(tabelle[no] + k);
    char2Keyboard(aChar);
  }
  if (LINEFEED) {
    Keyboard.println();
  }
}


void char2Keyboard(byte cOut) {
  static boolean isSpecial = false;
  boolean useShift = false;
  if (isSpecial) {
    switch (cOut) {
      case 0x84:  // Ä
        useShift = true;
      case 0xA4:  // ä
        cOut = 0xBC;
        break;
      case 0x96:  // Ö
        useShift = true;
      case 0xB6:  // ö
        cOut = 0xBB;
        break;
      case 0x9C:  // Ü
        useShift = true;
      case 0xBC:  // ü
        cOut = 0xB7;
        break;
      case 0x9F:  // ß
        cOut = 0xB5;
        break;
      case 0xA7:
        useShift = true;
        cOut = '3';
        break;
    }
    isSpecial = false;
  }
  if (cOut == 0xC3 || cOut == 0xC2) {
    isSpecial = true;
  } else {
    if (useShift) {
      Keyboard.press(KEY_LEFT_SHIFT);
      Keyboard.press(char(cOut));
      delay(5);
      Keyboard.releaseAll();
      useShift = false;
    } else {
      Keyboard.print(char(cOut));
    }
  }
}

Anstatt die Strings vor Ausgabe jeweils komplett aus dem Flash zu kopieren, werden nun die Zeichen einzeln aus dem Flash gelesen und übertragen. Damit ergibt sich die maximale Textlänge aus dem verfügbaren Flashspeicher.

Der Text 8 umfasst ca. 6970 Zeichen und ließ sich problemlos übertragen.

Gruß
ec2021

ich verstehe noch nicht so ganz, welche Pins auf der Platine du ansteuerst.

Alles ab 0 bis 7
Nur PIN 0,1,2,3 - also SDA, SCL, RX,TX

Also irgendeinen PIN mit GND verbinden, nachdem der angesteckt und gebootet ist und wieder loslassen.

Alternativ:
Ändere die Zeile:

constexpr byte buttonPin[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

in

constexpr byte buttonPin[] = { A0, A1, A2 };
Dann hast Du den ursprünglich geplanten Zustand.

Also wenn ich nach meinem Bild aus Post 1 gehe, funktionieren nur folgende Pins:
Bei "1" kommt Text 2
Bei "0" kommt Text 1
Bei "2" kommt Text 3
Bei "3" kommt Text 4

Alle anderen Pins funktionieren nicht

Danke @my_xy_projekt !

Genau so ist es. Die Pins werden mittels INPUT_PULLUP auf HIGH gehalten und werden gegen Masse ausgelöst.

Die Funktion wird ausgelöst, sobald man die Taste wieder loslässt.

Falls man das anders möchte, ist nur eine kleine Anpassung in der Button-Klasse erforderlich.

So konnte ich den Sketch einfach mit einem Pro Micro und einem Jumper-Kabel auf einem Breadbord testen ...

1 Like

Hab ich grad geändert.
Du kannst das so ändern wie oben, oder auch:

constexpr byte buttonPin[] = { 0, 1, 2, 3, A0, A1, A2, 9 };

Die Reihenfolge ist egal, Die Nummern müssen nur Deinem Chipdesign entsprechen und es dürfen nicht mehr als 8 werden, weil Du dann keine Texte mehr hast :slight_smile:

1 Like

Der Sketch wurde mit einem Pro Micro getestet. Du musst die Pins wohl noch an Deine Hardware anpassen.

1 Like

Vielen lieben Dank. Es funktioniert. Jetzt muss ich es morgen nur noch an der alten Hardware testen, ob die da auch mitkommt. Denn an meinem Testrechner kommen die Texte SEHR schnell. Hoffentlich verschluckt sich der alte Rechner morgen da mal nicht.
Könnte man das zur Not nochmal anpassen? Also das der Text langsamer geschrieben wird?

Da kommt ein delay() dazwischen:

  for (size_t k = 0; k < textLen; k++) {
    byte aChar = pgm_read_byte_near(tabelle[no] + k);
    delay(2); // Zeit in ms
    char2Keyboard(aChar);
  }
1 Like

Es funktioniert alles wunderbar. Vielen lieben Dank noch mal für eure Hilfe. Im Prinzip genau das was ich gesucht habe.

mal angenommen, ich möchte jetzt keinen fertigen USB Stick haben, auf dem das Programm läuft, sondern irgendein Board, an welches ich einen USB C Anschluss löten kann. Welches Board könnt ihr empfehlen?

Also Programm und Funktion soll alles genau gleich bleiben. Nur würde ich gerne das Board in ein selbst gedrucktes Gehäuse einbauen und eine USB C Buchse mit einbauen, so dass ich mir dann ein USB C auf USB Kabel von außen anstecken kann. Fragt nicht nach dem Grund, ist nur Spielerei. :face_with_peeking_eye:

Ich vermute, der Arduino pro micro wäre geeignet, oder?

Könnte ich an den USB C Anschluss dann einfach ein Kabel von USB C auf USB A anschließen? Und mit dem Programm von euch würde dann genau das gleiche passieren wie mit meinem Beetle Stick?

Wieso willst Du einen USB-C Anschluß um einen USB-C zu USB-A Kabel dranzustöpseln?