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;}
https://www.arduino.cc/reference/en/language/functions/time/millis/ Schau mal bei Notes and Warnings!
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.
Offenbar ist p.z zwischendurch mal <= 10. Das kannst du mit zusätzlichen printf() leicht überprüfen.
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.
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; }}
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
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 | }
|
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.
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
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!
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.