Dauer eines Tastendrucks auswerten

Im folgenden soll ausgewertet werden, ob der Taster kurz oder lang (> 1,5 Sekunden) betätigt wird.
Bei Programmstart sind alle LEDs aus.
Wenn der Taster an GPIO13 kurz betätigt wird, soll die rote LED an GPIO19 leuchten,
bei langem Tastendruck (> 1,5 Sekunden) leuchtet die grüne LED an GPIO21.
Nach 5 Sekunden geht die LED wieder aus und das Programm beginnt von vorne.

Erstelle hierzu einen Programmablaufplan (PAP).
Programmiere den Mikrocontroller entsprechend deines PAPs und kontrolliere die Funktion.

You need a state machine and (software) timer.
can be solved like this

0/ /* wait */
if key==1 {start the timer; preset=1500ms; state = 1;}

1/ /* short */
if timer not elapsed and key==0
{key_press_code = short_click; state = 3;}

if timer elapsed
{start the timer; preset=(10000-1500); state = 2;}

2/ /* long */
if timer not elapsed and key==0
{key_press_code = long_click; state = 3;}

if timer is elapsed and key==0
{state = 3;}

if timer is elapsed and key==1
{key_press_code = still_holding_the_key; state = 3;}

3/ /* dead time after key released, enable */
{start the timer; preset=500ms; state = 4;}

4/ /* dead time after key released, completed */
if timer is elapsed
{state = 0;}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hast Du denn den PAP schon?
Weil, die Aufgabe lautet ja aus dem PAP die Software zu erstellen.

1 Like

Das geht bestimmt auch mit einem umgekehrten Konstruktionsprozess. :grinning:

Vielleicht, wenn du ihm das Programm schreibst.

Wie sieht denn dein PAP aus?
Was wirst du für die undefinierten Zustände annehmen?

1 Like

Ich würde das so machen:

2 Likes

Dann werde ich auch noch einen PAP abwerfen, schon lange keinen gemacht.

1 Like


Nicht wirklich

na logisch

Das ist der Unterschied von Erkennung der Flanke und des Pegels...

Solange Du Button pressed abfragst, kannst Du nix anderes machen.
Du bemerkst erst den Status, wenn die Taste losgelassen wurde.

Und das sleep(...) erst... da ignoriert es jede Eingabe.

Die Aufgabe ist nicht lösbar.
Es ist nicht klar, was ein kurzer Tastendruck ist.
Es ist nicht klar, ob bei einem langen Tastendruck von >1,5 Sekunden die LED nach 5 Sekunden Leuchtzeit wieder ausgehen soll, oder erst wenn die Taste 5 Sekunden losgelassen wurde. (Retriggersperre)

Somit ist jeder bisherige Pap eine Wundertüte.

Willkommen in der professionellen Softwareentwicklung, wo die Requirements erst definiert werden nachdem du es falsch implementiert hast...

2 Likes

Da wäre es egal. Das auslösende Ereignis ist erfolgt. Das nächste Ereignis ist das verlöschen der LED.

Ja... ist halt blockierende Programmierung bei meinem PAP. Das Button pressed? reduziert sich am Ende auf ein digitalRead(...).

das ist nicht richtig.
deshalb erstellt man erst ein Diagramm was das Programm machen soll, holt Feedback ein, und dann macht man erst eine Implementierung.

Ich bin jetzt #21.
Nach 3d sollte das aber vom TO kommen oder?