Arduino Servo per Taste zeitgesteuert

Hallo Zusammen,

bin gerade was am verzweifeln.
Habe hier einen tollen Sketch im Forum gefunden und wollte den für meine Zwecke etwas passend machen.
Leider bekomme ich es so nicht hin sondern versaue es mir immer nur.

Hat da jemand eine Idee wie ich aus zwei Tastern einen Taster zeitgesteuert hinbekomme ?
Also tasten auf Pin 2 dann läuft der Servo in die Endposition und nach 6 Sek läuft dieser wieder in die Ausgangsposition.

Ich bin sonst schon mit einem Ne555 oder Funktionsgenerator dran aber wollte das gerne alles in einem Sketch unterbringen aber da versagen meine Programmierkenntnisse.

Hier der Sketch:

#include <MobaTools.h>
 
const byte Weiche_Gerade = 40;           // Endlage des Servos wenn Weiche auf Gerade
const byte Weiche_Mitte = 40;            // Mittellage
const byte Weiche_Abzweig = 80;         // Endlage des Servos wenn Weiche auf Abzweig
byte Weiche_soll = Weiche_Gerade;        // Speichervariable für die aktuelle Lage
const byte Stellzeit_Servo_Weiche = 7;  // Stellgeschwindigkeit Weiche
const byte Pin_Servo = 9;                // Servo an PIN 3
 

const byte Pin_Taster = 2;               // Taster an PIN 4
const byte entprellzeit = 20;     // Zeitintervall der Tasterabfrage
boolean taster_gedrueckt = 0;     // Speichervariable für den Tasterzustand
boolean last_tasterzustand = 0;   // zur Erkennung der Flanke
MoToTimer Entprellen;             // Timer-Objekt zum Entprellen
 
MoToServo servo;
 
void setup()
{ // Definition des Taster PINS
  pinMode(Pin_Taster, INPUT_PULLUP);          // wird nur 1x im Setup gemacht

  servo.attach(Pin_Servo, true);              // Aktivierung ServoPin - mit automatischer Abschaltung
  servo.setSpeed( Stellzeit_Servo_Weiche );   // Servogeschwindigkeit einstellen
  servo.write(Weiche_Mitte);                  // Servo fährt in Mittelstellung
  delay(500);                                 // Warten das der Servo die Stellung erreicht hat
 
  servo.write(Weiche_Gerade);
}
 

void loop()
{
  if ( !Entprellen.running() )
  { 
    Entprellen.setTime( entprellzeit );                   // Entprellzeit neu setzen
    taster_gedrueckt = ! digitalRead( Pin_Taster );       // invertiert mit ! wegen INPUT_PULLUP
        if ( taster_gedrueckt == 0 ) last_tasterzustand = 0;  // Zur Flankenerkennung 'gedrückt'
  }
 
  
  if ( taster_gedrueckt == 1 && last_tasterzustand == 0 )
  {
    last_tasterzustand = taster_gedrueckt;              // zur Flankenerkennung
    
  
    if ( Weiche_soll == Weiche_Abzweig )
    { 
      Weiche_soll = Weiche_Gerade;
    } else {
      Weiche_soll = Weiche_Abzweig;
    }
    servo.write(Weiche_soll);         // Servo auf neue Position fahren.
  }
 
}

Vielleicht erbarmt sich ja ein Fachkundiger.
Würde mich freuen um mal wieder etwas Licht am Tunnel sehen.

Schönen Gruß und bleibt gesund
Marc

Hallo Marc,
Du musst dir einen 2. Timer anlegen für die Zeit bis das Servo wieder zurückfahren soll. Den startest Du mit dem Tastendruck ( zusammen mit dem Aufruf zum Stellen des Servo ).
Wenn der Timer abgelaufen ist, fährst Du das Servo wieder zurück.
Etwa so ( ungetestet ):

#include <MobaTools.h>
 
const byte Weiche_Gerade = 40;           // Endlage des Servos wenn Weiche auf Gerade
const byte Weiche_Mitte = 40;            // Mittellage
const byte Weiche_Abzweig = 80;         // Endlage des Servos wenn Weiche auf Abzweig
byte Weiche_soll = Weiche_Gerade;        // Speichervariable für die aktuelle Lage
const byte Stellzeit_Servo_Weiche = 7;  // Stellgeschwindigkeit Weiche
const byte Pin_Servo = 9;                // Servo an PIN 3
 

const byte Pin_Taster = 2;               // Taster an PIN 4
const byte entprellzeit = 20;     // Zeitintervall der Tasterabfrage
boolean taster_gedrueckt = 0;     // Speichervariable für den Tasterzustand
boolean last_tasterzustand = 0;   // zur Erkennung der Flanke
MoToTimer Entprellen;             // Timer-Objekt zum Entprellen
MoToTimer rueckfahren;            // Timerobjekt für das Zurückfahrendes Servo
const int rueckfahrzeit = 6000;   // Zeit nach dem das Servo wieder zurückfährt 
MoToServo servo;
 
void setup()
{ // Definition des Taster PINS
  pinMode(Pin_Taster, INPUT_PULLUP);          // wird nur 1x im Setup gemacht

  servo.attach(Pin_Servo, true);              // Aktivierung ServoPin - mit automatischer Abschaltung
  servo.setSpeed( Stellzeit_Servo_Weiche );   // Servogeschwindigkeit einstellen
  servo.write(Weiche_Mitte);                  // Servo fährt in Mittelstellung
  delay(500);                                 // Warten das der Servo die Stellung erreicht hat
 
  servo.write(Weiche_Gerade);
}
 

void loop()
{
  if ( !Entprellen.running() )
  { 
    Entprellen.setTime( entprellzeit );                   // Entprellzeit neu setzen
    taster_gedrueckt = ! digitalRead( Pin_Taster );       // invertiert mit ! wegen INPUT_PULLUP
        if ( taster_gedrueckt == 0 ) last_tasterzustand = 0;  // Zur Flankenerkennung 'gedrückt'
  }
 
  
  if ( taster_gedrueckt == 1 && last_tasterzustand == 0 )
  {
    last_tasterzustand = taster_gedrueckt;              // zur Flankenerkennung
    
    rueckfahren.setTime( 6000 );         // Zeit für das Zurückfahren starten
    servo.write(Weiche_Abzweig);         // Servo auf Position fahren.
  }
  
  if ( rueckfahren.expired() ) 
  {                                     // rueckfahrzeit abgelaufen
    servo.write(Weiche_Gerade);         // Servo zurückdrehen
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.