Go Down

Topic: PushButton-Hilfe benötigt (Read 484 times) previous topic - next topic

Martin1990

Dec 27, 2012, 03:13 pm Last Edit: Dec 27, 2012, 07:26 pm by uwefed Reason: 1
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:


Code: [Select]
#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);
    }
  }

michael_x

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)

Martin1990

Okey danke ich werds mal machen

uwefed

#3
Dec 27, 2012, 07:40 pm Last Edit: Dec 27, 2012, 07:43 pm by uwefed Reason: 1
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:
Code: [Select]
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

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°


Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed


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

Go Up