Servo per Taster ansteuern und Automatisch zurücksetzen

Hallo zusammen,

ich möchte gerne einen Servo per Taster auf position X fahren lassen, und er soll nach einer bestimmten zeit z.B. 5 Sekunden wieder zurück auf ausgangsposition fahren.

Dazu habe ich den Taster an pin 7 und +5V angeschlossen und den Servo an pin 9.

Hier mal mein Sketch der nicht funktioniert:

#include <Servo.h>
int Taster = 7; 
int val = 0;

int state = 0; 
Servo servo;


 void setup() {
  pinMode(Taster, INPUT);
  servo.attach(9);
  servo.write(0);
  
}
void loop() {

{  val = digitalRead(Taster);
{   if (val == LOW) {  
     state = 1 - state;
     delay(20);
   }
 
  if (state == 1) 
    servo.write(100);

  if (state == 0)
  delay(5000);
    servo.write(0);
    
}}}

Danke für eure Hilfe

Mfg Sebastian

Und warum postest du diese Sache doppelt ?

Auch solltest du genau beschreiben, was funktioniert und was nicht funktioniert.

Zweiten Post gelöscht. Grüße Uwe

Proetter87:
Hallo zusammen,

ich möchte gerne einen Servo per Taster auf position X fahren lassen, und er soll nach einer bestimmten zeit z.B. 5 Sekunden wieder zurück auf ausgangsposition fahren.

Dazu habe ich den Taster an pin 7 und +5V angeschlossen und den Servo an pin 9.

Hast Du einen Pulldown Widerstand an den Taster angeschlossen?

void loop() {

{  val = digitalRead(Taster);
{   if (val == LOW) {  
     state = 1 - state;
     delay(20);
   }

Du machst unnütz 2 Klammern auf.
So wechselst Du alle 20ms den Zustand von state Der Servo fährt nur nicht dauernd hin und her weil Du ein langes delay() drin hast.

if (state == 0) delay(5000);

Vermeide delay() weil es den controller blockiert. Benutze stattdessen millis() siehe blink witout delay Beispiel und Nachtwächtererklährung.

Grüße Uwe

Hallo,

ja der doppelte Post war ein versehen. Hatte eine Fehlermeldung erhalten und dachte er wurde nicht veröffentlicht. "Sorry"

Ja ich habe einen Widerstand am Taster angeschlossen.

delay() ist an sich nicht schlimm da der Baustein nur diese Funktion ausführen soll.

Aber millis() werde ich mir dann auch noch zu Gemüte führen, weil man weiß ja nie vielleicht kommen ja doch noch Funktionen hinzu.

Ich werde es heute Abend nochmal versuchen umzuschreiben. Gebe dann Feedback ob es funktioniert.

Aktuell passiert einfach gar nichts bei diesem Sketch.

Danke schonmal.

Mfg

Sebastian

Hallo,

Mir ist da noch was aufgefallen:

if (val == LOW) { //<- Wenn Du kein INPUT_PULLUP verwendest, musst Du auf ein HIGH "warten", 5v -> Pin7 = HIGH
     state = 1 - state; // Dafür gibt es eine elegantere Lösung aber eines nach dem anderen.

So wie der Code jetzt ausschaut, drückst Du den Taster, dann fährt der Servo auf Pos: 100 und wenn Du nochmaldrückst vergehen 5 Sekunden und dann fährt der Servo zu Pos: 0.
Wenn ich Dich richtig verstanden habe dann soll der Servo nach 5 Sekunden von selber wieder auf Pos: 0 fahren!?

Grüße,
Donny

Hallo Donny,

ja stimmt der Servo soll beim Drücken des Tasters auf 100 fahren und dann nach 5 sek wieder auf Null.

Habe den Sketch jetzt ein bisschen Modifiziert. Aber es passier einfach gar nichts.

#include <Servo.h>
const int Taster = 7; 
int val = 0;

int state = 0; 
Servo servo;


 void setup() {
  pinMode(Taster, INPUT_PULLUP);
  servo.attach(9);
  servo.write(0);
  
}
void loop() {

{  val = digitalRead(Taster);
   if (val == LOW)   
     state = 1 - state;
     delay(20);
    
   }
 
  if (state == 1) 
    servo.write(100);

  if (state == 0)
  delay(5000);
    servo.write(0);
    
}

Als Basis hatte ich diesen Sketch verwendet, der auch Funktioniert. Der Servo fährt per Taster auf 100 Grad und bei neuem drücken wieder auf Null.

#include <Servo.h>
const int Taster = 7; 
int val = 0; // speichert den Zustand des Tasters
int old_val = 0; // speichert den vorherigen wert von val
int state = 0; // 0 = Servo Position eins 1 = Servo Position zwei
Servo servo;
 
 void setup() {
  pinMode(Taster, INPUT_PULLUP);
  servo.attach(9);
  servo.write(0);
}
void loop() {

{  val = digitalRead(Taster); // liest den Input aus und cheked ob er gedrückt ist.
   if ((val == LOW) && (old_val == HIGH)) {   // HIER IST DIE ABFRAGE GEÄNDERT
     state = 1 - state;
     delay(20);
   }
 
  old_val = val; // aktueller val wird zu val alt
 
  if (state == 1) {
    servo.write(100); // Stelle servo auf 180 grad
  }
  else {
    servo.write(0); // stelle servo auf startposition
  }
}}

Irgenwie bekomme ich es nicht hin ihn umzubauen.

Mfg

Sebastian

Blöcke von Anweisungen brauchen { geschweifte Klammern }

Proetter87: Habe den Sketch jetzt ein bisschen Modifiziert. Aber es passier einfach gar nichts. .....

Irgenwie bekomme ich es nicht hin ihn umzubauen.

Dann sieh dir doch einfach mal das Beispiel an, wie da die Klammern sitzen und baue das entsprechend auf.

Hallo,

Ich hab Deinen Code mal einige Kommentare und geschweifte Klammern hinzugefügt, wenn die Schaltung stimmt sollte er funktionieren. Wie ist der Taster verdrahtet, so wie in #0 beschrieben, 5V->Taster->Pin7 mit PullUp PullDown (gegen Masse)?

Du musst echt aufpassen wann Du wo eine geschweifte Klammer setzt.

#include <Servo.h>
const int Taster = 7;
int val = 0;

int state = 0;
Servo servo;

void setup() {
  pinMode(Taster, INPUT_PULLUP); // Wie schaut die Schaltung aus?
  servo.attach(9);
  servo.write(0);

}
void loop() {
//  { // <- funktioniert nicht
    val = digitalRead(Taster);
    if (val == LOW) { // if abfrage begin
      state = 1 - state;
      delay(20);
    } // if abfrage ende

    if (state == 1) servo.write(100); // <- hier geht es ohne {} weil nur EINE Funktion ausgeführt wird.

    if (state == 0) { //<-
      delay(5000);
      servo.write(0);
    } //<-
  } // <- loop ende

ja stimmt der Servo soll beim Drücken des Tasters auf 100 fahren und dann nach 5 sek wieder auf Null.

Um automatisch zurückzufahren fehlt noch was, besser gesagt kann man das leichter verwirklichen. Das ist dann ein Ablauf, nicht mehrere. :slight_smile:

Grüße,
Donny
edit

    val = digitalRead(Taster);
    if (val == LOW) { // if abfrage begin
      state = 1 - state;
      delay(20);
    } // if abfrage ende

Wenn der Taster gedrückt ist, wechselt state 50 mal je Sekunde den Zustand zwischen 0 und 1. Das vermeidest du zwar im weiteren durch dein delay(5000), schön ist es aber nicht. Wozu ist das delay(20) gut, wenn du sowieso auf das delay(5000) angewiesen bist?

In deinem Original-Beispiel hattest du übrigens eine Flankenerkennung drin.

dony: 5V->Taster->Pin7 mit PullUp?

Wofür soll dabei ein PullUp sinnvoll sein? Ich denke eher, ein PullDown würde Sinn machen.

Gruß Tommy

Tommy56: Wofür soll dabei ein PullUp sinnvoll sein? Ich denke eher, ein PullDown würde Sinn machen.

Da hast Du natürlich Recht!

Grüße, Donny

void loop() {

 val = digitalRead(Taster);
   if (val == LOW)   
     state = 1 ; else state=0;
     
    
    
  if (state == 1) 
    servo.write(100);

  if (state == 0)
  delay(5000);
    servo.write(0);
    
}

So müsste es funktionieren.

Muss man den Umweg über die Variable val machen? Geht das nicht auch so?

boolean Grundstellung=true;
void loop() {

 if ((!digitalRead(Taster))&&(Grundstellung))
      { 
        servo.write(100);
       Grundstellung=false;
       }
    else if (!Grundstellung)
       {
         delay(5000);
         servo.write(0);
         Grundstellung=true;
       }
    
}

Hi

Das wird Dir IMMER das Servo auf 0 fahren. In der ersten Runde stellst Du das Servo zwar auf 100, setzt aber 'Grundstellung' auf false. In der nächsten Runde, der Taster ist immer noch gedrückt, stellst Du das Servo wieder auf Null - und wartest jetzt 5 Sekunden.

MfG

Ich dachte der Servo soll bei gedrückter Taste ausfahren und wenn die Taste los gelassen wird, soll der Servo nach 5 Sekunden in die Grundstellung zurück fahren.

boolean verriegelt=false;
void loop() {

if  ((digitalRead(Taster))verriegelt=false;

if ((!digitalRead(Taster))&&(!verriegelt))
      { 

        servo.write(100);
        delay(5000);
        servo.write(0);
        verriegelt=true;
       
       }   
           
}

Jetzt macht er den Zyklus pro Tastendruck nur ein mal - egal wie lange man auf der Taste bleibt.

Also, ich würde die Pins kürzen, damit der Stromfluss eingedämmt wird.
Versuch es einmal.
grüßchen