Logikfehler in Tasterauswertung für Menue

Gast #5210410
Lesenswert?
• ▲
▼
Hallo Zusammen,

ich versuche gerade ein Menue zu Programmieren. Um in das Menue zu 
kommen soll eine Taste eine Secunde lang gedrückt werden. Danach soll 
mit jedem weiteren druck der Taste in den nächsten Menue Punkte 
gesprungen werden. Das klapt auch so weit sehr gut.
Allerdings soll wenn ich im lezten Menue Punkt bin mit einem weiteren 
Druck der Taste das Menue verlassen werden.
Leider spring ich dann immer zurück in den ersten Menuepunkt.
1
int menuePunkt = 0;
2

3
unsigned long timemils, timesec, timesecalt, menueDelay;
4
unsigned long timeMenueTaster1, timeMenueTaster2, timePlusTaster, timeMinusTaster;
5

6
bool statusMenueTaster, statusPlusTaster, statusMinusTaster;
7
bool statusMenue = false, statusPlus = false, statusMinus = false;
8
bool minusOn = false, plusOn = false, menueOn = false;
9
bool timerabgelaufen = false;
10

11
void loop () {  
12
  timemils = millis();
13
  
14
  //Start Tasterabfrage plus entprellung und Zeitverzögerung für Menue
15
  statusMenueTaster = digitalRead(menueTaster);
16
  statusPlusTaster  = digitalRead(plusTaster );
17
  statusMinusTaster = digitalRead(minusTaster);
18

19

20
  if(statusMenueTaster == LOW){
21
    if(timeMenueTaster1 < timemils && statusMenue == false){
22
      statusMenue = true;
23
      menueOn = true;
24
      if (menuePunkt==0){
25
        menueDelay = timeMenueTaster1+950;
26
      }
27
    }
28
  }else{
29
    timeMenueTaster1 = timemils+50;
30
    statusMenue = false;
31
  }
32

33
  if(statusMenue == true && menuePunkt == 0){
34
    if(menueDelay < timemils){
35
      menuePunkt = 1;
36
      menueOn = false;
37
    }
38
  }
39
  
40
  if(statusPlusTaster == LOW){
41
    if(timePlusTaster < timemils && statusPlus == false){
42
      statusPlus = true;
43
      plusOn= true;
44
    }
45
  }
46
  else{
47
    timePlusTaster = timemils+50;
48
    statusPlus = false;
49
  }
50

51
  if(statusMinusTaster == LOW){
52
    if(timeMinusTaster < timemils && statusMinus == false){
53
        statusMinus = true;
54
        minusOn = true;
55
      }
56
  }
57
  else{
58
    timeMinusTaster = timemils+50;
59
    statusMinus = false;
60
  }
61
  //Ende Tasterabfrage plus entprellung und Zeitverzögerung für Menue
62

63
  //Gehe durch das Menue.
64
  if (menuePunkt != 0 && menueOn){
65
    menueOn = false;
66
    menuePunkt++;
67
    }
68

69
  if (menuePunkt== 1){
70
      analogWrite(5 ,255 );
71
    } else if (menuePunkt== 2){
72
      analogWrite(6 ,255 );
73
    } else if (menuePunkt== 3){
74
      analogWrite(11 ,255 );
75
    } else if (menuePunkt== 4){
76
      analogWrite(5 ,0 );
77
      analogWrite(6 ,0 );
78
      analogWrite(11 ,0 );
79
      menuePunkt =0;
80
    }
81
}

Ich komm leider nicht drauf wo mein logischer Fehler liegt.

Danke schon mal für eure hilfe und noch mehr danke an die jenigen die es 
sich verkneifen können mich dumm anzumachen weil ich erst mal 
Programmierun lernen soll oder das der Code völliger mist ist oder, 
oder, oder...
Ist ja leider in nicht ganz unüblich hier.


bis dann und Danke
Amper
Gast #5210637
Lesenswert?
• ▲
▼
Du setzt doch menuPunkt hier auf 0
Amper schrieb:
> } else if (menuePunkt== 4){
>       analogWrite(5 ,0 );
>       analogWrite(6 ,0 );
>       analogWrite(11 ,0 );
>       menuePunkt =0;
>     }

und im nächsten Durchlauf auf 1
>  if(statusMenue == true && menuePunkt == 0){
>    if(menueDelay < timemils){
>      menuePunkt = 1;
>      menueOn = false;
>    }
>  }
Gast #5210738
Lesenswert?
• ▲
▼
Hallo Grunschüler,

ich hab die ganzen Serial.print `s rausgenommen da der Code sonst 
ziemlich durcheinander ist. Ein paar LED´s hab ich auch drann um sehen 
zu was der yC gerade so macht.

@Achim S. ja das hab ich auch gesehen ich brauch das (if(statusMenue == 
true && menuePunkt == 0){) aber um beim ersten Druchlauf überhaubt ins 
menue zu kommen.

Wenn ich jede menge Serial.print eingebaut habe kann ich sehen das ich 
den statusMenue wider auf false setzte bevor die abfrage kommt 
allerdings muss ich dazu den taster ziemlich schnell wider loslassen. 
Was keine Lösung ist.
Gast #5210753
Lesenswert?
• ▲
▼
Ich habs:

Ich hab noch eine Bool eingesetzt die gesetzt wird wenn ich das Menue 
verlasse und erst wider rückgesetzt wird wenn ich den Tasterloslasse.
Wahrscheinlich gibt es noch eine elegantere Lösung aber mir fällt gerade 
keine ein.
1
if(statusMenueTaster == LOW){
2
  if(timeMenueTaster1 < timemils && statusMenue == false){
3
    statusMenue = true;
4
    menueOn = true;
5
    if (menuePunkt==0){
6
      menueDelay = timeMenueTaster1+950;
7
    }
8
  }
9
}else{
10
  timeMenueTaster1 = timemils+50;
11
  statusMenue = false;
12
  menueEnde = false;
13
}
14

15
...
16

17
if(statusMenue == true && menuePunkt == 0 && menueEnde == false){
18
    if(menueDelay < timemils){
19
      menuePunkt = 1;
20
      menueOn = false;
21
    }
22
  }
23

24
...
25

26
if (menuePunkt== 1){
27
    analogWrite(5 ,255 );
28
  } else if (menuePunkt== 2){
29
    analogWrite(6 ,255 );
30
  } else if (menuePunkt== 3){
31
    analogWrite(11 ,255 );
32
  } else if (menuePunkt== 4){
33
    analogWrite(5 ,0 );
34
    analogWrite(6 ,0 );
35
    analogWrite(11 ,0 );
36
    menuePunkt =0;
37
    menueEnde = true;
38
}
#5210811
Lesenswert?
• ▲
▼
Amper schrieb:
> Ich hab noch eine Bool eingesetzt die gesetzt wird wenn ich das Menue
> verlasse und erst wider rückgesetzt wird wenn ich den Tasterloslasse.

Natürlich darf man nicht nur das Drücken auswerten, da man ja auf die 
Flanke reagieren will. Das Loslassen zu prüfen ist also essentiell.

Amper schrieb:
> Wahrscheinlich gibt es noch eine elegantere Lösung aber mir fällt gerade
> keine ein.

Tasten entprellen und Flanke erkennen braucht man sehr oft. Daher lohnt 
es sich, dafür eine extra Task zu implementieren, die dann nur noch die 
fertigen Ereignisse liefert.
Das macht dann auch die Auswertung in der Mainloop deutlich einfacher 
und übersichtlicher.

Z.B.:
Beitrag "Universelle Tastenabfrage"
Gast #5211614
Lesenswert?
• ▲
▼
Ich hab auf Taster nahezu ganz verzichtet und mache Eingaben per 
ir-Fernbedienung. Einmal programmiert ist das universell einsetzbar. Nur 
ein Pin und nahezu unbegrenzte Möglichkeiten für Menus.
Gast #5211971
Lesenswert?
• ▲
▼
Wenn ich irgendwann mal fertig werde poste ich nen Bild von der Uhr, da 
passt ne Ferhnbedinung einfach nicht zu.
Aber ja hab ich bei meine Lichtsteuerung auch bietet auch mehr 
möglichkeiten wie drei Taster :)

bis dann

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.