PushButton-Hilfe benötigt

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

P.S. Ich hatte schon eine Idee mit Variablen:

#include <Servo.h>

Servo meinServo;
int MotorPin = 9;
int buttonPin = 2;
int buttonState = 0;
int Tuer = 0;

void setup()
  {       
  pinMode(buttonPin, INPUT);
  meinServo.attach(MotorPin);
  delay(1);
  meinServo.write(1);
  delay(1);
  }

void loop()
  {  
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
    { 
    Tuer = Tuer+1;
    }
  else
    {
    Tuer=Tuer;
    }
  if(Tuer>2)
    {
    Tuer=0;
    }
  else
    {
    Tuer=Tuer;
    }
  if(Tuer==1)
    {
    meinServo.write(255);
    delay(100);
    }
  else
    {
    meinServo.write(0);
    delay(100);
    }
  }

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)

Okey danke ich werds mal machen

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.

Grüße Uwe

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°

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