Probleme bei Zeichen Darstellung

Hallo,
habe den nachfolgenden Code hier im Forum gefunden, welcher super funktioniert. Nun möchte ich die Ziffern Eingabe durch die Tastatur auf einem Display darstellen. Das bekomme ich irgendwie nicht hin. Im Serial Monitor werden sie untereinander angezeigt, auf dem Display mit tft.print(key) überschreibt er die Ziffern. Kann mir jemand helfen, weil im Netz habe ich nichts gefunden?

#include <Keypad.h>
char masterCode[]  = "123456";
char limitedCode[] = "112233";
const byte ROWS = 4;   // vier Reihen
const byte COLS = 4;   // vier Spalten

// Define the Keymap
char keys[ROWS][COLS] = {
  {'D', '#', '0', '*'},
  {'C', '9', '8', '7'},
  {'B', '6', '5', '4'},
  {'A', '3', '2', '1'}
};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 37, 35, 33, 31 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 45, 43, 41, 39 };

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// Einstellung für Servo und LEDs
const int greenPin = 51;
const int redPin = 53;
const int openDelay = 3000;


byte validateCode() {     // 0...keine Taste  1...MasterCode   2...LimitedCode
  static byte counter = 0;
  static char code[sizeof(masterCode)];
  char key = keypad.getKey();
  if (!key) return 0;    // keine Taste gedrückt, kann nicht gültig sein
  if (counter == 0) memset(code, 0, sizeof(code));   // clear code string

//comment out
Serial.println(key); // comment out if not needed for debugging
  
switch (key) {
    case '*': counter = 0; // start new code
      break;
    case '#':
      if (strcmp(code, masterCode) == 0)  // maybe correct code?
      {
        counter = 0;
        return 1;    // correct masterCode was entered: return 1
      }
      if (strcmp(code, limitedCode) == 0)  // maybe correct code?
      {
        counter = 0;
        return 2;    // correct limitedCode was entered: return 2
      }
      break;
    default : code[counter] = key;  // just add the keystroke to the code
      if (counter < sizeof(code) - 1) counter++;
  }
  return 0;   // es wurde kein gültiger Code eingegeben
}
void setup() {
  Serial.begin(9600);
  // LED Pins setzen
  pinMode(greenPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  digitalWrite(greenPin, LOW);
  digitalWrite(redPin, LOW);
}
void loop() {
  byte schluessel = validateCode();
  switch (schluessel) {
    case 1:
      Serial.println("Master Code");
      // mach was bei Master Code
      digitalWrite(greenPin, HIGH);
      delay(5000);
      //  myservo.write(angleClosed);
      digitalWrite(greenPin, LOW);
      break;
    case 2:
      Serial.println("Limited Code");
      // mach was bei Limited Code
      digitalWrite(redPin, HIGH);
      delay(5000);
      digitalWrite(redPin, LOW);
      break;
    default:
      break;
  }
}

Vielen Dank

Es ist schon schwer Dir zu helfen, wenn der Code nicht zur Geschichte passt.
Mein Notepad++ sagt:

Suche "tft." (0 Treffer in 0 Dateien von 1 gesucht)

https://www.arduino.cc/en/Reference/TFTLibrary

Sorry, hier mal beide tab's, hoffe das ist so verständlicher. Möchte das die eingegebenen Ziffern nebeneinander dargestellt werden und nicht übereinander (überschrieben).

// Start
#include "Adafruit_GFX.h"
#include "MCUFRIEND_kbv.h"
MCUFRIEND_kbv tft;

#include "Fonts/FreeMonoBold12pt7b.h"
#include "Fonts/FreeMonoBold9pt7b.h"
#include "Fonts/FreeSans9pt7b.h"

// Pinbelegung
const int led_PinR = 53;      //Pin 53 ROT 
const int led_PinB = 51;      //Pin 51 BLAU
const int BP_PinR = 22;       //Pin 22 ROT
const int BP_PinB = 24;       //Pin 26 BLAU
const int greenPin = 51;
const int redPin = 53;
const int openDelay = 3000;

#include <Keypad.h>
char masterCode[]  = "123456";
char limitedCode[] = "112233";
const byte ROWS = 4;   // vier Reihen
const byte COLS = 4;   // vier Spalten

// Define the Keymap
char keys[ROWS][COLS] = {
  {'D', '#', '0', '*'},
  {'C', '9', '8', '7'},
  {'B', '6', '5', '4'},
  {'A', '3', '2', '1'}
};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 37, 35, 33, 31 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 45, 43, 41, 39 };

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int col[8];
void showmsgXY(int x, int y, int sz, const GFXfont *f, const char *msg)
{
  int16_t x1, y1;
  uint16_t wid, ht;
  tft.setFont(f);
  tft.setCursor(x, y);
  tft.setTextColor(0x0000);
  tft.setTextSize(sz);
  tft.print(msg);
}
void setup() {
  // Erklärung E/S
  pinMode(led_PinR, OUTPUT);
  pinMode(BP_PinR, INPUT);
  pinMode(led_PinB, OUTPUT);
  pinMode(BP_PinB, INPUT);


  tastatur();

} //Ende SETUP

und die Nummer 2


  byte validateCode() {     // 0...keine Taste  1...MasterCode   2...LimitedCode
  static byte counter = 0;
  static char code[sizeof(masterCode)];
  char key = keypad.getKey();

 
  
  if (!key) return 0;    // keine Taste gedrückt, kann nicht gültig sein
  if (counter == 0) memset(code, 0, sizeof(code));   // clear code string
  tft.setCursor(100,110); //setCursor(int16_t x, int16_t y)
  tft.setTextColor(6); //setTextColor(uint16_t t)
  tft.setTextColor(1,3); //setTextColor(uint16_t t, uint16_t b)
  tft.setTextSize(2); //setTextSize(uint8_t s)
  tft.print(key);    // comment out if not needed for debugging



 
  switch (key) {
    case '*': counter = 0; // start new code
   
      break;
    case '#':
      if (strcmp(code, masterCode) == 0)  // maybe correct code?
      {
        counter = 0;
        return 1;    // correct masterCode was entered: return 1
      }
      if (strcmp(code, limitedCode) == 0)  // maybe correct code?
      {
        counter = 0;
        return 2;    // correct limitedCode was entered: return 2
      }
      break;
    default : code[counter] = key;  // just add the keystroke to the code
      if (counter < sizeof(code) - 1) counter++;
  }
  return 0;   // es wurde kein gültiger Code eingegeben
}

//Tastatur Code

void tastatur() {
tft.reset();
uint16_t ID = tft.readID();
tft.begin(ID);
tft.setRotation(1);
tft.invertDisplay(true);
tft.fillScreen(0xFFFF);
showmsgXY(90, 45, 2, &FreeMonoBold12pt7b, "ENTER");
showmsgXY(55, 220, 2, &FreeMonoBold9pt7b, "your PINCODE");

}
void loop() {
  byte schluessel = validateCode();
  switch (schluessel) {
    case 1:
      Serial.println("Code RED");
      // mach was bei Master Code
      digitalWrite(greenPin, HIGH);
      delay(2000);
      //  myservo.write(angleClosed);
      //digitalWrite(greenPin, LOW);
      break;
    case 2:
      Serial.println("Code BLUE");
      // mach was bei Limited Code
      digitalWrite(redPin, HIGH);
      delay(2000);
      //digitalWrite(redPin, LOW);
      break;
    default:
      break;
  }
}

Danke, habe ich schon geschaut. Da habe ich keine Lösung gefunden.

Wenn Du vor dem Schreiben jedes mal den Cursor auf die gleiche Position setzt, dann müssen die Zeichen ja zwangsläufig auf der gleichen Position ausgegeben werden.
Der Code macht also genau das, was Du vorgibst.

Gruß Tommy

Könntest Du mir nettweise an einem Beispiel zeigen wie das korrekt wäre? Weil habe doch nur einmal die Position des Cursor gesetzt. Zumindest nach meinem Verständnis. :pleading_face:

Dein Verständnis ist falsch.
Du rufst in jedem loop()-Durchlauf validateCode(); auf und darin setzt Du jedes Mal die Cursorposition. Setze sie nur im setup() und bei einer bestimmten Taste.

Gruß Tommy

Hallo
Du weißt schon wie dein Sketch im Detail funktoniert ?

Nicht wirklich, aber ich sehe schon das hier einem Unwissenden nicht geholfen wird. Bzw. nur mit Fachchinesisch. Es ist wie immer in Deutschland's Foren, bist Du blöd bleibst Du blöd.
In diesem Sinne eine fröhliche Weihnachtszeit und einen guten Rutsch. :wink:

Wenn man die Leute erst mal beschimpft, von denen man Hilfe will, wird das wohl nichts werden.

Und Tschüß.

Gruß Tommy

@Speedo2016 : Das war jetzt vom Ton her - hmmm - unglücklich.

Aber da ich ausnahmsweise mit guter Laune vom EInkauf zurück bin:
Zeile 10 im zweiten Tab aus Post #4 sorgt dafür, dass die Ziffern überschrieben werden. Du solltest an der Stelle die x-Position abhängig von counter jeweils um die Zeichenbreite erhöhen.

  tft.setCursor(100 + counter*zeichenbreite,110); //setCursor(int16_t x, int16_t y)

Rücksetzbedingungen hast Du zwei explizite, nämlich * und #. Da dort jeweils der counter zurückgesetzt wird, setzt du damit dann auch die Ausgabeposition zurück.

Die dritte ist etwas verborgen und noch nicht korrekt behandelt: Wenn mehr Zeichen eingegeben werden als der Code lang ist (bevor mit * oder # die Eingabe abgeschlossen wird) springt zwar Deine Position zurück, aber dann überschreibst Du wieder.

An der Stelle musst Du Dich also entscheiden, was das Programm machen soll, wenn jemand mehr als sechs Ziffern eingibt: Automatische Erkennung "falscher Code" (weil zu lang) oder halt - wie es jetzt ist - wieder von vorne anfangen. Dann müsstest Du allerdings die schon eingegebenen Ziffern löschen.

In allen Fällen ist es hilfreich, wenn Du den Code verstehst. Mit der Meinung bin ich offensichtlich nicht allein. Falls es da hakt: Konkrete Frage - dann bekommst Du auch eine Antwort.

Hallo wno158,

ich danke Dir sehr. Darf ich Deine gute Laune (vermutlich Black Saturday shopping) noch weiter strapazieren? Was müsste ich tun um eine autom. Erkennung "falscher Code" (zu lang) zu generieren?

@totheotherinsulted
Fand den Ton jetzt nicht unhöflich oder unglücklich, nur ist es meistens so das es in vielen Foren und in diesem habe ich es auch schon gesehen, direkt auf den Fragenden eingehackt wird. Es gibt halt Arduino Nutzer, so wie mich, die etwas automatisieren möchten. Und da sind halt ein paar Grundkenntnisse vorhanden und das war es. Man bzw. wie auch ich sucht die passenden Codes zusammen und bastelt daraus dann diese eine hoffentlich funktionierende Funktion. Da scheitert es dann aber am Wissen und meiner Meinung nach sollten dafür Foren gut sein :man_shrugging:. Deshalb seid mir nicht böse, das war und ist nicht so gemeint gewesen. Sorry!

Mitzählen wieviel Zeichen eingelesen wurden? :slight_smile:

Noch einfacher Du benutzt ja

if (counter < sizeof(code) - 1) counter++;

Mach da noch ein else rein - und dort den Abbruch mit counter 0 .

Nee, ich war noch richtig altmodisch (meinem Alter angepasst) analog beim Schlachter meines Vertrauens :slight_smile:

Zeile 36/36 im zweiten Tab: Da begrenzt Du ja sinnvollerweise schon den Index in den Code-Speicher. Das genau ist die Stelle, wo "Code zu lang" schon erkannt wird.

    default : code[counter] = key;  // just add the keystroke to the code
      if (counter < sizeof(code) - 1) counter++;

Allerdings bleibst Du da einfach auf der letzten Ziffer stehen.
Ohne es compiliert oder getestet zu haben (einfach trocken heruntergetippt):

    default :
      code[counter] = key;  // just add the keystroke to the code
      counter++;
      if (counter >= sizeof(code) ) 
      {
        // Jetzt ist es zu lang.
        counter = 0;
        // fällt dann durch auf return 0 am Ende der Funktion
      }
     else
     {
       // Noch innerhalb des Bereichs, aber noch nicht fertig
       // Die return-Werte waren noch nicht eindeutig: 
       // 0 wurde sowohl bei falschem Code als auch bei Code-Eingabe noch nicht fertig zurückgegeben.
       // Das ist zwar im Ergebnis das gleiche, aber ich würde die Fälle unterscheiden.
       return 3;
     }
     break;  // den hattest Du auch noch vergessen - würde bei ausführlichen Compilerwarnungen angemeckert.

Viel Erfolg - jetzt gehe ich Mittagessen kochen!

Mit Sauerkraut?

Viel Spaß beim kochen und guten Appetit!
Und vielen Dank!

Vielen Dank!