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

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.