Servos steuern mit einem Taster

Hallo zusammen,

ich bringe mir gerade das Programmieren bei und hab deshalb noch kein so großes Wissen. Dennoch macht es mir spaß immer wieder kleinere Projekte zu realisieren =) Ich würde mich sehr freuen wenn ihr mir weiter helfen könntet.

Das Projekt:
Ich habe einen Taster und einen micro Servo 9g.
Mit dem einen Taster würde ich gerne 3 verschiedene Positionen realisieren.
D.h. wird der Taster für 2 Sekunden gedrückt soll der Servo auf Wert 60 fahren und soll so lange da bleiben bis der Taster wieder gedrückt wird.

Wird der Taster 6 Sekunden lang gedrückt wird der Servo auf Wert 120 gefahren.

Wird der Taster 10 Sekunden lang gedrückt wird der Servo auf Wert 180 gefahren.

Ich habe die Funktion “pulseIn” gefunden. Diese macht eigentlich genau dass was ich benötige.
Jedoch funktioniert es nicht in Kombination mit dem Servo.

Ich habe schon alles mögliche versucht, bringe es aber nicht ordentlich zum laufen.
Bitte um Hilfe =)

Herzlichen Dank und Grüße

#include <Servo.h>
Servo myservo;//create servo object to control a servo
int pin = 11;
unsigned long duration;
int c=0;

void setup()
{
  pinMode(pin, INPUT);
  Serial.begin(9600);
    myservo.attach(9);//attachs the servo on pin 9 to servo object
    myservo.write(100);// Servo auf Grundstellung fahren
    delay(1000);//wait for a second
}

void loop()
{
  duration = pulseIn(pin, HIGH, 0);
  c= duration /1000000; // Betätigung des Scahlters in Sekunden
  Serial.print(c);


if (c < 5 && c > 1 );
{
myservo.write(60); // Servo auf Position fahren
delay(1000);//wait 1s
c = 0;
}


if (c < 9 && c > 5 );
{
myservo.write(120); // Servo auf Position fahren
delay(1000);//wait 1s
c = 0;
}


if (c < 13 && c > 9 );
{
myservo.write(180); // Servo auf Position fahren
delay(1000);//wait 1s
c = 0;
}

}

PulseIn blockiert, bis es fertig ist. Damit können die Signale für den Servo nicht generiert werden. Du musst Dir die Millisekunden (millis()) merken, wenn der Taster gedrückt wird und wenn er wieder losgelassen wird. Aus der Differenz kannst Du dann erkennen, wie lange er gedrückt wurde. Wenn der Taster mindestens 2 Sekunden gedrückt werden muss, kannst Du das als entprellen nutzen, sonst musst Du den Taster entprellen. Dazu gibt es Beispiel(e) in der IDE.

Gruß Tommy

Tommy56: PulseIn blockiert, bis es fertig ist. Damit können die Signale für den Servo nicht generiert werden.

Das sollte nicht das Problem sein, da die Servo-Lib die Signale für den Servo rein per Interrupt generiert. Das geht auch während blockierender Funktionen.

Ein wesentliches Problem sind die ';' am Ende der if-Zeilen. Damit funktionieren die ganzen if-Abfragen nicht, und es werden immer alle Blöcke ausgeführt.

Edit: pulseIn scheint mir für Schalterabfragen ungeeignet, da es nicht entprellt. Somit dürfte in der Regel der erste Prellimpuls gemessen werden. Hier müsste hw-mäßig entprellt werden. Die Dauer des Drückens mit millis() selbst zu bestimmen - wie von Tommy vorgeschlagen - ist daher sicher die bessere Methode.