Pages: [1]   Go Down
Author Topic: PushButton-Hilfe benötigt  (Read 447 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
    }
  }
« Last Edit: December 27, 2012, 01:26:57 pm by uwefed » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 58
Posts: 3046
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okey danke ich werds mal machen
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21631
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: December 27, 2012, 01:43:26 pm by uwefed » Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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°
 

Logged

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

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21631
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-wink smiley-wink
Grüße Uwe
Logged

Pages: [1]   Go Up
Jump to: