Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe beim auswerten wie lange ein Display gedrückt ist


von Sebastian (Gast)


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;}

von OldMan (Gast)


Lesenswert?


von Soda (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Offenbar ist p.z zwischendurch mal <= 10. Das kannst du mit zusätzlichen 
printf() leicht überprüfen.

von Sebastian (Gast)


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.

von Sebastian (Gast)


Lesenswert?

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;

    }}

von Sebastian (Gast)


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

von Stefan F. (Gast)


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
}

von Sebastian (Gast)


Lesenswert?

Danke

von Stefan F. (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Ich denke, dass dein Lösungsansatz ganz schnell in einer Sackgasse 
endet, sobald parallel zur Tastenabfrage noch etwas anderes gemacht 
werden soll oder die Eingabe-Muster komplexer werden.

Spätestens wenn du dort angelangt bist, befasse dich mal mit 
Zustandsautomaten: 
http://stefanfrings.de/multithreading_arduino/index.html

von Joachim B. (jar)


Lesenswert?

eigentlich nicht so schwer, in der loop() oder while(1) immer wieder 
abfragen, je nach XY verzweigen und auswerten ob gedrückt ist und Zeit 
nehmen bis nicht gedrückt ist!

von Sebastian (Gast)


Lesenswert?

In diesem Fall ist es nicht schlimm das ich in der while Schleife fest 
hänge weil diese  ausschließlich zum starten und stoppen meines Programm 
dient.

von Joachim B. (jar)


Lesenswert?

äh ja????

von Rudolph R. (rudolph)


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.

von Udo S. (urschmitt)


Lesenswert?

Sebastian schrieb:
> ich schaffe es nicht
> auszuwerten wie lang mein Display gedrückt worden ist.

Und ich dachte immer ein Display wäre dazu da etwas anzuzeigen.

von Joachim B. (jar)


Lesenswert?

Udo S. schrieb:
> Und ich dachte immer ein Display wäre dazu da etwas anzuzeigen.

dachte ich auch mal bis ich eine neue Waage brauchte, nun stellt man 
sich zu 90% auf Glas anstatt durchzugucken :)

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.