Hallo Zusammen, ich bin neu in der Welt des Arduinos und will mich nun mal an einem Projekt versuchen. Mein Ziel ist es, den Arduino nur für einen Prototyp zu gebrauchen und die entstandene Schaltung als Grundlage für eine eigene Platine zu verwenden. Mein Vorhaben ist nicht komplex, hat aber so seine Tücken. Ein Baustein des Projekts ist die Ansteuerung eines Motors, wobei ein Taster verwendet werden soll. Funktion 1: Wird der Taster gehalten, läuft der Motor; wird der Taster losgelassen, soll der Motor stehen. Funktion 2: Wird der Taster zweimal kurz hintereinander betätigt, läuft der Motor und der Taster kann losgelassen werden. Zum Anhalten des Motors muss der Taster dann erneut betätig werden. Hier der Code für Funktion 1: void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, OUTPUT); } void loop() { if (digitalRead(2)== LOW) { digitalWrite(3, HIGH); } else { digitalWrite(3,LOW); } } Ich wurde zudem auf einen Umstand aufmerksam gemacht, der mit der Rechengeschwindigkeit zusammenhängt. Mein Kollege meinte, je größere das Programm ist, desto größer ist die Abweichung bei den Zeiten. Das könnte für mich bedeuten, dass ich bei einem kleinen Programm (Funktion 2) den Taster sehr schnell betätigen muss und mir bei einem großen Programm mehr Zeit bleibt. Zu meinen Problemen, mir fehlen ein paar grundlegende Programmbausteine, die mir es ermöglichen von Funktion 1 u. 2 zu unterscheiden und Funktion 2 auszuführen. Des Weiteren will ich im Hinterkopf behalten, dass der Arduino (so vielfältig die Möglichkeiten auch sind) nur für den Prototyp verwendet werden soll. Eventuell hat jemand eine Idee, wie ich Funktion 2 auf dem Arduino umsetzen kann; oder eine Anmerkung.
Emil schrieb: > Eventuell hat jemand eine Idee, wie ich Funktion 2 auf dem Arduino > umsetzen kann; oder eine Anmerkung. "kurz oder lang" sind schon einmal Zeiteinheiten. Das heißt, du musst erst einmal messen, wie lange der Taster schon gedrückt ist, nachdem er gedrückt wurde. Beim Loslassen geht der Zähler wieder auf Null. Wenn das läuft, kann Funktion 1 wieder rein. Wenn der Taster länger als z.B. 3 Sekunden gedrückt wurde, läuft der Motor, bis man den Taster wieder loslässt. Das sollte noch einfach sein. Für Funktion 2 gibt es ziemlich viele Ansätze. Wenn der Taster 2x binnen 3 Sekunden gedrückt wurde, geht's los oder wenn der Taster für <1s gedrückt, für <1s losgelassen und dann wieder gedrückt wurde, geht's los,... Und falls alles frustet, gibt's bei Arduino immer einen, der genau das schon gemacht hat: https://github.com/poelstra/arduino-multi-button
Emil schrieb: > Das könnte > für mich bedeuten, dass ich bei einem kleinen Programm (Funktion 2) den > Taster sehr schnell betätigen muss und mir bei einem großen Programm > mehr Zeit bleibt. Das kann Anfängern passieren, wenn sie keine konstante Zeitbasis zum Abzählen der Drückabstände benutzen (Timerinterrupt). Hier mal ein Beispiel mit Doppeldruckerkennung: Beitrag "Wartezeiten effektiv (Scheduler)"
Emil schrieb: > Funktion 1: Wird der Taster gehalten, läuft der Motor; Soll der Motor dabei sofort beim Niederdrücken des Tasters loslaufen? > wird der Taster losgelassen, soll der Motor stehen. Und auch sofort beim Loslassen wieder stoppen? Falls Deine Antwort zweimal ja ist dann... > Funktion 2: Wird der Taster zweimal kurz hintereinander läuft der Motor los, stoppt, läuft wieder los, bevor der Doppeldruck als solcher erkannt werden kann. Ob das in Deiner Anwendung zum Problem oder auch nur einem ggf. unschönen kurzen Ruckler wird, mußt Du selbst beurteilen bzw. ergibt sich daraus eine maximale Zeit dafür wie schnell kurz hintereinander sein muß.
Michi S. schrieb: > läuft der Motor los, stoppt, läuft wieder los, bevor der Doppeldruck als > solcher erkannt werden kann. Die Fragen hatte ich mir auch gestellt. Ist aber lösbar 😀. Damit er das zitierte nicht macht, gibt es noch die Option 1, dass er eben sofort startet und mindestens die Zeit t0 läuft, bis spätestens ein zweiter Tastendruck eingegangen sein muss für die Funktion 2. Alternativ die Option 2: man lässt ihn generell erst loslaufen, wenn diese Zeit t0 abgelaufen ist oder der zweite Tastendruck erkannt wurde, was ja etwas früher sein wird.
Stichwort Zustandsautomat, FSM (finite state machine) https://de.wikipedia.org/wiki/Endlicher_Automat https://www.mikrocontroller.net/articles/Statemachine Damit der FSM formuliert man das Problem. Die Eingaben (Taster lang/kurz/2x) und Aktionen (Motor an/aus) formuliert man vorteilhafterweise an anderer Stelle.
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.