Brauche Hilfe beim auswerten wie lange ein Display gedrückt ist

Gast #6526328
Lesenswert?

Hallo ich bin gerade irgendwie am verzweifeln ich schaffe es nicht 
auszuwerten wie lang mein Display gedrückt worden ist. Und zwar habe ich 
ein Menu mit 4 Auswahlmöglichketen die gehen auch aber ich möchte vorher 
prüfen ob mein Display egal wo 1000ms gedrückt worden ist bevor es im 
Code weiter geht. Da es egal ist wo gedrückt wird habe ich einfach p.z 
genommen. Aktuell wird Hallo nie ausgeführt weil ich irgendwo einen 
Denkfehler habe

starttime=millis();
    while (p.z > 10){
      if (millis()-starttime >=1000){
        Serial.print("Hallo");}
    break;}
Gast #6526333
Lesenswert?

Dabei sollte es mit p.z doch eigentlich prinzipbedingt IMMER 
funktionieren. Ganz egal, was drin steht, wo es herkommt, wie es 
beschrieben wird, um welchen Controller es sich handelt und welche 
Bibliotheken ggf. eingesetzt werden. Ganz zu schweigen davon, wie völlig 
egal es ist, was vorher in Deinem Code passiert und in welchem Kontext 
Du diese Schleife eingebaut hast.
Ist mir wirklich ein Rätsel... eigentlich sollte das so klappen.
Gast #6526356
Lesenswert?

Ja irgendwie geht der aus der Schleife raus. Wenn ich das Touchscreen 
drücke kommen immer weiter einzelne werte aber keine unter 10. Aber zum 
Test habe ich ein Print danach gesetzt und dieses wird immer ausgeführt.
Gast #6526458
Lesenswert?

Ne die Lösung gefällt mir nicht weil ich dann nicht die anderen Buttons 
deaktivieren kann es muss irgendwie mit einer while schleife passieren. 
Nur leider wird p.z. zich mal abgefragt und bleibt nicht bei einem wert 
wenn gedrückt wird deswegen klappt meine schleife nicht hat jemand noch 
eine iDEE FÜR MICH
Gast #6526521
Lesenswert?

Sebastian schrieb:
> Ja irgendwie geht der aus der Schleife raus.

Rücke den Code mal richtig ein, dann wird der Fehler offensichtlich:
1
starttime=millis();
2
while (p.z > 10)
3
{
4
    // display wurde gedrückt
5
    if (millis()-starttime >=1000)
6
    {
7
        // display wurde lange gedrückt
8
        Serial.print("Hallo");
9
    }
10
    break; //aus der Schleife raus gehen -> warum hier?
11
}
Gast #6526535
Lesenswert?

Sebastian schrieb:
> Ok ich bin nochmal einen ganz anderen weg
> gegangen und so funktioniert es
> if (p.z >10)
>     {
>       i++;
>       Serial.print(i);
>       if (i>150)
>       {programm();
>       i=0;
>
>     }}

Auch hier bitte richtig einrücken, damit man sehen kann, was da 
passiert:
1
if (p.z >10)
2
{
3
    i++;
4
    Serial.print(i); // Debug Ausganbe
5
    if (i>150)
6
    {
7
        // Taster wurde lange gedrückt
8
        programm();
9
        i=0;
10
    }
11
}

Du hast dir sicher keine vernünftigen Gedanken über die 150 gemacht. 
Nimm die Debug Ausgabe heraus, schon hast du ein völlig anderes Timing.
#6527602
Lesenswert?

Stefan hat doch schon die richtige Idee in den Topf geworfen, die 
richtige Lösung ist da komplett auf while() zu verzichten für einzelne 
Komponenten, das Programm läuft immer durch und es wird anhand von 
Zuständen entschieden wie und wo verzweigt wird.

Sein Beispiel-Programm ist jetzt nicht so der Hit, da jeder "Thread" mit 
millis() seine eigene Auswertung macht, anstatt in der loop() Funktion 
für eine gemeinsame Zeitbasis zu sorgen indem die Funktionen nur alle 
10ms aufgerufen werden, aber das Prinzip ist nicht falsch.

Ob man nun einen Taster oder ein Touch-Event auswertet, oder was 
anderes, man muss nicht das geplante Intervall abwarten.

Mit einer festen Zeitbasis, etwa 1ms, 5ms oder 10ms, oder was auch immer 
passend erscheint, fragt man den Taster zyklisch ab.
Ist der Taster betätigt zählt das Programm hoch, ist er nicht betätigt 
zählt das Programm gegen Null runter.
Überschreitet der Zähler eine Schwelle wird die nächste Funktion 
ausgelöst.
Ja, so kann man nebenbei Taster entprellen, z.B. im 1ms Raster abfragen 
und wenn der Wert über z.B. 9 geht, dann gilt der Taster als betätigt.
Jetzt kann man da noch viel mehr mit machen, im einfachsten Fall setzt 
man den Zähler auf einen festen Wert damit er nicht weiter hoch zählt.
Oder man lässt ihn weiter hoch zählen bis zu einer weiteren Schwelle für 
eine zweite Funktion und dann vielleicht noch weiter zu einer dritten 
Schwelle ab welcher der Taster als verklemmt gilt.
Oder man setzt den Zähler auf Null so das durch fortlaufendes Drücken 
des Tasters die Funktion wiederholt ausgelöst wird.

Und so weiter, das Prinzip ist jedenfalls möglichst an keiner Stelle im 
Programm auf irgendwas zu warten, es sei denn sehr kurz wie zum Beispiel 
ein SPI.transfer(data) ein blockierender Aufruf ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren