Forum: Mikrocontroller und Digitale Elektronik Tastenmatrix / 4x4 tastenpad 2 mal abfragen.


von DAVID B. (bastler-david)


Lesenswert?

Hallo
Wie mache ich es wenn ich eine taste 2 mal abfragen möchte um ein ganz 
einfaches Menü zubekommen ?

Meine Vorstellung und das Ergebnis reichen von sollte gehen in der 
Theorie zu geht gar nicht in der Praxis.

Hier mal mein Code Kunstwerk:

keypressed = myKeypad.getKey();

if (keypressed == '3') {// xxx starten
    lcd1.clear();
    lcd1.setBacklight(HIGH);
    lcd1.backlight();
    keypressed = 'E'; ---E um Eingabe von taste 3 zu überschreiben
    if (PinCON)       ------Abfrage ob xxx schön läuft oder nicht
    {
      lcd1.setCursor(0, 0);
      lcd1.print(F("xxx Gestartet"));
    }
    else
    {
      lcd1.setCursor(0, 0);
      lcd1.print(F("xxx Ist Aus"));
    }
    lcd1.setCursor(0, 1);
    lcd1.print(F("druck T1 = an"));  ----- taste 1 auf dem tastenpad
    lcd1.setCursor(0, 2);
    lcd1.print(F("druck T2 = aus"));  ---- taste 2 auf dem tastenpad
    lcd1.setCursor(0, 3);
    lcd1.print(F("Abbrechen Warten"));
    delay(2000);-----zeit zum überlegen und wurst finger umparken.
----------------------Soweit alles ok und geht auch.
Das erneute einlesen der tasten was jetzt folgt übergeht er aber einfach 
?

    keypressed = myKeypad.getKey();
    delay(200);

    if (keypressed == '1') {
      lcd1.setCursor(0, 0);
      lcd1.print(F("Wird Eingeschalten"));
      lcd1.setCursor(0, 1);
      lcd1.print(F("Bitte Warten"));
      digitalWrite(34, LOW);
      delay(1000);
      digitalWrite(34, HIGH);
      lcd1.setBacklight(LOW);
      lcd1.clear();
      keypressed = 'E';
      delay(2000);
    }
    if (keypressed == '2') {
      lcd1.setCursor(0, 0);
      lcd1.print(F("Wird Ausgeschalten"));
      lcd1.setCursor(0, 1);
      lcd1.print(F("Bitte Warten"));
      digitalWrite(34, LOW);
      delay(1700);
      digitalWrite(34, HIGH);
      delay(2000);
      digitalWrite(34, LOW);
      delay(1700);
      digitalWrite(34, HIGH);
      lcd1.setBacklight(LOW);
      lcd1.clear();
      keypressed = 'E';
    }
  }

Jemand eine Idee ?
Danke

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

DAVID -. schrieb:
> keypressed = myKeypad.getKey();

Niemand weiß, was dieses "myKeypad.getKey" macht.

DAVID -. schrieb:
> keypressed = myKeypad.getKey();
> if (keypressed == '3') {// xxx starten
> ...
>     keypressed = 'E'; ---E um Eingabe von taste 3 zu überschreiben

Das ist Mumpitz, 'E' wird immer von myKeypad.getKey überschrieben, also 
nirgends ausgewertet.

DAVID -. schrieb:
> delay(2000);-----zeit zum überlegen und wurst finger umparken.

Du willst also den Bediener zur Weißglut bringen?
Sowas macht man über Flankenerkennung.
Typisch hat man im Timerinterrupt eine Routine, die Tasten einliest, 
entprellt und Ereignisflags (Flanke) dem Main übergibt.

von DAVID B. (bastler-david)


Lesenswert?

Danke
E wird und soll auch gar nicht ausgewertet werden es dienst NUR dazu den 
gelesenen wert (0-D) zu überschreiben um eine Fehlauswertung zu 
vermeiden.
Es geht in dem teil nur um die taste 1 (1) und taste 2 (2)
if (keypressed == '1') {
if (keypressed == '2') {
Die tasten werden auch nicht per interput ausgewertet sondern nur zu 
bestimmen Zeiten.

Die Funktion myKeypad.getKey ist eigentlich hier gut beschreiben.
https://funduino.de/nr-04-tastenfeld

Dein Problem mit der zeit kann ich nicht nachvollziehen.
es ist nötig das Display ordentlich zu lesen und die finger umzuparken.
wo für 2 sek reichen sollten.

Auf den einbau 2 weiterer tasten wollte ich verzichten.

: Bearbeitet durch User
von Reiner_Gast (Gast)


Lesenswert?

DAVID -. schrieb:
> Wie mache ich es wenn ich eine taste 2 mal abfragen möchte um ein ganz
> einfaches Menü zubekommen ?
>
> Meine Vorstellung und das Ergebnis reichen von sollte gehen in der
> Theorie zu geht gar nicht in der Praxis.

Hi,

schon mal drüber nachgedacht, die Menü Navigation mit einer Statemachine 
abzubilden?

vg

von Peter D. (peda)


Lesenswert?

DAVID -. schrieb:
> Dein Problem mit der zeit kann ich nicht nachvollziehen.
> es ist nötig das Display ordentlich zu lesen und die finger umzuparken.
> wo für 2 sek reichen sollten.

Kennst Du wirklich jemanden, der soviel Geduld hat?
Die Firmware sollte spätestens nach 0,1s den nächsten Tastendruck 
akzeptieren.

von georg (Gast)


Lesenswert?

Peter D. schrieb:
> Die Firmware sollte spätestens nach 0,1s den nächsten Tastendruck
> akzeptieren.

Naja, Sekretärinnen mit 10-Finger-Blind sind eher selten geworden, bei 
Maschinensteuerungen kann es auch etwas langsamer gehen - aber 2 .. 3 
Tasten pro Sekunde sollte man schon drücken können.

Georg

von Ralf (Gast)


Lesenswert?

Führe deinen Code im Debugger aus und schau wo es hackt.

von DAVID B. (bastler-david)


Lesenswert?

Ein Debugger hmm müsste ich mich mal einlesen wie so was geht und was 
ich da brauche.

>Kennst Du wirklich jemanden, der soviel Geduld hat?<
>Die Firmware sollte spätestens nach 0,1s den nächsten Tastendruck<
>akzeptieren.<

Du alter Zocker :-)
also ich für mein teil brauche mehr als 100 ms um einen text zulesen und 
dadrauf mit der richtigen taste zureagieren.

Da ich so recht keine Lösung finde und es morgen mittag laufen 
muss(soll) wird mir nix anderes übrig bleiben als 2 eigene Taster zu 
verbauen.
mal sehen ob ich morgen noch eine Erleuchtung bekomme.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.