Ich möchte einen Button so programmieren, dass er, wenn man ihn einmal drückt, einen ServoMotor um 180° drehen lässt.
Beim zweiten mal drücken soll er wieder auf die Ausgangsposition zurück drehen.
Wäre nett wenn ihr mir helfen könntet.
Gruß
Martin
Du musst genau 100 msec lang drücken, damit das als 1 Tastendruck gemerkt wird.
Wenn du kürzer drückst, kann sein dass dein Programm es gar nicht merkt, weil es im delay(100) hängt.
Länger als 100 kann als 2 Tastendrucke interpretiert werden.
Ausserdem kommt es immer darauf an, wann dein delay() gerade fertig ist um wieder digitalRead(buttonPin) zu machen.
(Immerhin kannst du beliebig lange den Button losgelassen haben, das ist ja schonmal was)
Hallo Martin 1990
Hab mir erlaubt Deinen Code oben etwas zu formattieren ( einrücken) und in code Tags zu geben um ihn leserlicher zu machen.
Um einen Taster eine Schalterfunktion zu geben ist es am einfachsten Du benutzt eine Statusvariable mit 4 Zuständen:
0 Taster nicht gedrückt ; Ausgang aus
1 Taster gedrückt; Ausgang eingeschaltet
2 Taster nicht gedrückt ; Ausgang eingeschaltet
3 Taster gedrückt; Ausgang aus
Jeweils bei jeder Statusänderung eine Entprellzeit von 10mS
Du konntrollierst im if immer den Zustand des Eingangs und der Statusvariable
So kannst Du sauber den Taster auswerten und die Aktion erfolgt immer nur 1 mal bei der Zustandsänderung des Tasters (Wechsel Ein-Aus bzw Aus-Ein). In deinem Fall entspricht Ausgang eingeschaltet bzw aus den 2 Positionen des Servo.
Zu Deinem Kode:
if(Tuer>2)
{
Tuer=0;
}
else
{
Tuer=Tuer;
}
Der else-Teil bewirkt nichts und Du kannst ihn weglassen. Außerdem Glaube ich meintest du Tuer >=2 und nicht >2. Der Fall Tuer =2 bewirkt nichts und ist gleichbedeutend Tuer = 0. Nach dem erstmaligen Einschalten mußt Du 2x drücken um Einzuschalten aber immer nur 1x zum ausschalten.
Das mit der Zeitverzögerung hat michael_x bereits erklärt.
Versuch mal Deinen Kode nach meinen Erklärungen/ Vorschlägen umzuschreiben und schauen wir mal wie's funktioniert. Ich glaube Du lernst mehr als wenn ich Dir das Beispiel umschreibe.
Reagier halt einfach auf die positive Flanke deiner Taste. Entprellen berücksichtigen
Sieh dir dazu mal das Debounce-Beispiel in der Arduino IDE an.
Und dann:
hk007:
Reagier halt einfach auf die positive Flanke deiner Taste. Entprellen berücksichtigen
Sieh dir dazu mal das Debounce-Beispiel in der Arduino IDE an.
Und dann:
Flanke && Motor bei 0 -> Motor nach 180 °
Flanke && Motor bei 180° -> Motor nach 0°
Ist mehr oder weniger das gleiche was ich schon gesagt hatte.
Grüße Uwe