Eine generelle Frage zu Programmaufbau, Merker und millis

Hallo zusammen,

ich komme aus dem RC Modellbau und nach langer Zeit möchte ich mal wieder etwas mit dem Arduino machen. Es geht dabei um eine 16 Kanal Schaltkarte. Von der Funke kommen 2 Kanäle mit je 8 PWM Werten. Diese möchte ich auswerten und dann entsprechende Funktionen schalten. Ich habe sowas vor langer Zeit mal zum laufen bekommen, allerdings mit den bösen Delay Befehlen und das möchte ich nun ändern und verbessern. Zunächst für nur einen Kanal, also 8 Funktionen.

Was schon mal gut funktioniert, ist das Auslesen des Signals, und das korrigieren mit einem vorher festgestellten Wert( Min=1000, Mitte=1500, Max=2000). Soll bedeuten, wenn der Mittelwert beim einschalten statt 1500 nur 1450 ist, merkt er sich das und korrigiert die danach eingelesenen Werte automatisch.

Jetzt die generelle Frage zum Programmaufbau. Sollte ich mich mit der IF Funktion durch alle Punkte arbeiten oder die switch case Variante wählen?

Ich habe beide Varianten versucht und im Sketch ist eine davon auskommentiert

#include <MobaTools.h>


MoToServo meinServo1;
MoToServo meinServo2;

int Anker1busy = 0;
int Anker2busy = LOW;
int statAnker1unten = 0;
int statAnker2unten = LOW;

int statAnkersenk1 = LOW;
int statAnkersenk2 = LOW;
int statAnkerheb1 = LOW;
int statAnkerheb2 = LOW;


int IN1 = 2;
int IN2 = 3;

int servoPin1 = 4;  //int CH1 = 4;  //const int
int servoPin2 = 5;  //int CH2 = 5;  //const int

int var = 0;

// ************ PWM Variablen ******************
int CH1inputValue;              // Speichert die ausgelesene Pulsbreite in us vom Kanal 1
int CH2inputValue;              // Speichert die ausgelesene Pulsbreite in us vom Kanal 2
int PWM1;
int PWM2;
int PWM1OK;
int PWM2OK;
int CH1PWMcorrection;           // PWM-Korrekturwert für Nullstellung von Kanal 1
int CH2PWMcorrection;           // PWM-Korrekturwert für Nullstellung von Kanal 2
const int negativ = -1;

// ************ Timer Variablen ******************
unsigned long Ankertimer1 = 0;  // Anker fallen lassen  previousMillis
unsigned long Ankertimer2 = 0;  // Anker fallen lassen  previousMillis
const long Ankerinterval11 = 10000;
const long Ankerinterval12 = 3000;


void setup() {
  // put your setup code here, to run once:

  pinMode (IN1, INPUT);
  pinMode (IN2, INPUT);

  pinMode(servoPin1, OUTPUT);
  pinMode(servoPin2, OUTPUT);

  Serial.begin(9600);

  meinServo1.attach(servoPin1); //Servo an Pin 4
  meinServo1.setSpeed( 0 );    // Verfahrgeschwindigkeit einstellen
  meinServo1.write(90);

  meinServo2.attach(servoPin2); //Servo an Pin 5
  meinServo2.setSpeed( 0 );    // Verfahrgeschwindigkeit einstellen
  meinServo2.write(90);


  PWMcorrection();

  Serial.println("SETUP PWM CH1: ");
  Serial.println(PWM1OK);
  Serial.println(CH1PWMcorrection);
  Serial.println(PWM1OK + CH1PWMcorrection);

}

void loop() {

  readRCinput();

  Serial.println("PWM CH1: ");
  Serial.println(PWM1);
  Serial.println("Anker busy");
  Serial.println(Anker1busy);
  Serial.println("Anker unten");
  Serial.println(statAnker1unten);

  /*
    if (Anker1busy == LOW)
    {
    Serial.println("LOW");
    }
    if (Anker1busy == HIGH)
    {
    Serial.println("HIGH");
    }
    Serial.println("Anker unten");
    if (statAnker1unten == LOW)
    {
    Serial.println("LOW");
    }
    if (statAnker1unten == HIGH)
    {
    Serial.println("HIGH");
    }

  */

  
    // *****************Variante ohne Delay mit case **************


      if (PWM1 > 950 && PWM1 < 1050 )
      {
       var = 1;
      }
      if (PWM1 > 1950 && PWM1 < 2050 )
      {
       var = 2;
      }


  
  switch (var) {
    case 1:
        meinServo1.write(20);
        Anker1busy = 1;
      
      unsigned long currentMillis1 = millis();
      if (currentMillis1 - Ankertimer1 >= Ankerinterval11)
      {
        Ankertimer1 = currentMillis1;
        meinServo1.write(90);
        
      }
      var = 0;
      Anker1busy = 0;
      statAnker1unten = 1;
      break;

      case 2:
      meinServo1.write(160);
      Anker1busy = 0;
      statAnker1unten = 0;
      break;
  }
}
      /*
            case 2:
            meinServo2.write(150);
               //    statAnkerheb1 = HIGH;
                   unsigned long currentMillis2 = millis();
                   if (currentMillis2 - Ankertimer2 >= Ankerinterval12) {  // Falls mehr als 1000 ms vergangen sind
                   Ankertimer2 = currentMillis2;
                   meinServo2.write(90);
              //     statAnkerheb1 = LOW;
                   var = 0;
                   }
                   break;
            default:
            break;
            }

      */

/*

      // *****************Variante ohne Delay ohne case **************
      if (PWM1 > 950 && PWM1 < 1050 && (Anker1busy == 0) && (statAnker1unten == 0))
      {
        meinServo1.write(20);
        Anker1busy = 1;
      }
      unsigned long currentMillis1 = millis();
      if (currentMillis1 - Ankertimer1 >= Ankerinterval11)
      {
        Ankertimer1 = currentMillis1;
        meinServo1.write(90);
        Anker1busy = 0;
        statAnker1unten = 1;
      }



      if (PWM1 > 1950 && PWM1 < 2050 && (Anker1busy == 0) && (statAnker1unten == 1))
      {
        meinServo1.write(160);
        Anker1busy = 1;
      }
      unsigned long currentMillis2 = millis();
      if (currentMillis2 - Ankertimer2 >= Ankerinterval12) {  // Falls mehr als 1000 ms vergangen sind
        Ankertimer2 = currentMillis2;
        meinServo1.write(90);
        Anker1busy = 0;
        statAnker1unten = 0;

      }
*/
  

  // ========== PWM Korrekturwerte für CH1 und CH2 ermitteln ==========

  void PWMcorrection() {

    CH1PWMcorrection = 0;      // PWM-Korrekturwert für Nullstellung von Kanal 1 auf 0 setzen
    CH2PWMcorrection = 0;      // PWM-Korrekturwert für Nullstellung von Kanal 2 auf 0 setzen

    int PWM1IN = pulseIn(IN1, HIGH);
    if (PWM1IN > 900 && PWM1IN < 2100)
      PWM1OK = PWM1IN;

    int PWM2IN = pulseIn(IN2, HIGH);
    if (PWM2IN > 900 && PWM2IN < 2100)
      PWM2OK = PWM2IN;

    if (PWM1OK > 1500)
      CH1PWMcorrection = (PWM1OK - 1500);
    CH1PWMcorrection = (CH1PWMcorrection * negativ);
    if (PWM1OK < 1500)
      CH1PWMcorrection = (1500 - PWM1OK);

    if (PWM2OK > 1500)
      CH2PWMcorrection = (PWM2OK - 1500);
    CH2PWMcorrection = (CH2PWMcorrection * negativ);
    if (PWM2OK < 1500)
      CH2PWMcorrection = (1500 - PWM2OK);
  }


  // ========== PWM Werte einlesen und plausibel ?  ==========

  void readRCinput() {

    int PWM1IN = pulseIn(IN1, HIGH); //Read PWM Pulse
    if (PWM1IN > 900 && PWM1IN < 2100)
      PWM1OK = PWM1IN;
    PWM1 = (PWM1OK + CH1PWMcorrection);

    int PWM2IN = pulseIn(IN2, HIGH); //Read PWM Pulse
    if (PWM2IN > 900 && PWM2IN < 2100)
      PWM2OK = PWM2IN;
    PWM2 = (PWM2OK + CH2PWMcorrection);
  }

Welche Methode würdet ihr wählen und warum? Zu erwähnen ist noch das die Funktionen später noch Merker bekommen sollen um zu entscheiden ob ein Ausgang ein oder ausgeschaltet werden soll. Im aktuellen Fall wird ein Servo für den Ankerfall angesteuert. bei pwm1000 soll das Servo von 90 auf 0 Grad gehen und eine Zeit stehen bleiben. (Anker mit Kette im Freifall) , danach zurück auf 90 Grad. Durch pwm2000 dreht der Servo auf 180 Grad und ein Motor wird über einen Endschalter eingeschaltet, der den Anker wieder hochzieht. Nach einer Zeit X soll das Servo wieder auf 90 Grad gehen.

Sehr viel Text und irgendwie nicht einfach zu erklären, dazu die ganzen neuen Begrifflichkeiten, aber ich hoffe man kann zumindest Ansatzweise verstehen was ich beabsichtige.

Vielen Dank und Gruß Thomas

Da gibts noch ganz viel, aber der hier fiel mir gleich ins Gesicht :slight_smile:

Du machst Dir das zu aufwendig.
switch unterstützt Wertebereiche.
Kurz umgeschrieben kommt raus:

  // *****************Variante ohne Delay mit case **************
  /*
        if (PWM1 > 950 && PWM1 < 1050 )
        {
         var = 1;
        }
        if (PWM1 > 1950 && PWM1 < 2050 )
        {
         var = 2;
        }

  */
  switch (PWM1)
  {
    case 950 ... 1050:
      meinServo1.write(20);
      Anker1busy = 1;
      unsigned long currentMillis1 = millis();
      if (currentMillis1 - Ankertimer1 >= Ankerinterval11)
      {
        Ankertimer1 = currentMillis1;
        meinServo1.write(90);
      }
      var = 0;
      Anker1busy = 0;
      statAnker1unten = 1;
      break;
    case 1950 ... 2050:
      meinServo1.write(160);
      Anker1busy = 0;
      statAnker1unten = 0;
      break;
  }
}

Da gibts bestimmt noch ganz viel. Aber dazu muss ich erstmal reinschauen und verstehen, was da zusammen gehört :wink:

Frage: Deine status-Variablen koennen nur 2 Zustände abbilden oder bekommen die auch Werte jenseits von 0/1?

1 Like

Hi,

ah das erste Licht ist aufgegangen :slight_smile: Ich dachte immer case müssten ganze Zahlen sein und keine Bereiche. Danke schon mal für die Erleuchtung.
Die Status Variablen haben nur 2 Zustände das ist richtig.

Ich habe immer so abgefragt:

  if (pwm1 > 950 && pwm1 < 1050 && (stat1 == LOW) && (mem1 == 0))

stat1 war nur der Merker ob der Kanal schon EIN ist, mem1 ist ein Merker für Memory. Die Funke hat nur Taster. Für eine Hupe ok, aber Beleuchtung z.B. soll ja an bleiben bis sie explizit wieder ausgeschaltet wird.

Das Arbeiten mit Bereichen ist noch nicht Standard für alle Compiler, aber unser gcc kann es. Bei anderen C++ Compilern muss das noch nicht sein.

Gruß Tommy

Nee... noch viel schlimmer :slight_smile: Da geht auch 'a' oder 'a' ... 'z' - oder irgendwie sowas :slight_smile:

Das ist natürlich sehr komfortabel und die Zwischenschritte zum aufbereiten entfallen.

Ich habe das jetzt mal umgesetzt:

// ************ Timer Variablen ******************
unsigned long Ankertimer1 = 0;  // Anker fallen lassen  previousMillis
unsigned long Ankertimer2 = 0;  // Anker fallen lassen  previousMillis
const long Ankerinterval11 = 5000;
const long Ankerinterval12 = 3000;



      switch (PWM1)
  {
    case 950 ... 1050:
      meinServo1.write(20);
      Anker1busy = 1;
      unsigned long currentMillis1 = millis();
      if (currentMillis1 - Ankertimer1 >= Ankerinterval11)
      {
        Ankertimer1 = currentMillis1;
        meinServo1.write(90);
      }
      Anker1busy = 0;
      statAnker1unten = 1;
      break;
      
    case 1950 ... 2050:
      meinServo1.write(160);
      Anker1busy = 1;
      unsigned long currentMillis2 = millis();
      if (currentMillis2 - Ankertimer2 >= Ankerinterval12)
      {
        Ankertimer2 = currentMillis2;
        meinServo1.write(90);
      }
      Anker1busy = 0;
      statAnker1unten = 0;
      break;
  }
}

Beim betätigen des ersten Tasters dreht der Servo auf die 20 Grad, bleibt dort aber stehen und dreht nicht auf 90 Grad zurück. Solange das nicht passiert ist dürfte Anker1busy und statAnker1unten eigentlich nicht auf 0 bzw 1 gehen oder? Anker1busy soll ja zeigen das noch etwas in Arbeit ist. Erst wenn das abgeschlossen ist, ist der Anker auch sicher unten.

Ich überleg noch, was da was ist und wie das zusammenhängt.
Denn ich komme hiermit nicht klar:

Vermutlich daher, das vorher dazwischen Dein delay() war.
Das musst Du jetzt ganz anders denken.
Denn derzeit wird nicht nur ankerbusy sofort wieder 0, sondern der Servo bekommt oben ein 160 und wenn das Intervall um ist ein 90, um sofort wieder ein 160 mit dem nächsten Umlauf zu bekommen.

Ich überleg nur grade, ob Deine ganzen Zustände gebraucht werden.

meinServo1 ist also ein Anker, der bei 160 eingeholt und bei 90 ausgelegt ist?
Mit jedem auslösen wird das PWM-Signal erzeugt und übertragen.
Was ist der Auslöser -> Ein Schalter oder ein Taster?
Wenn ein Taster, soll vermutlich beim ersten auslösen eine Aktion (Kette ausfahren) und beim nächsten auslösen die andere Aktion (Kette einholen) gestartet werden.
Wenn nicht, erklärs mal, auf was der Servo reagieren und was er dabei machen soll.

Hallöchen,

klar erkläre ich das gerne noch mal genauer. Ich habe einen 1-0-1 Taster an der Fernsteuerung.
Das Servo steht in seiner Nullstellung bei 90 Grad. Durch tippen des Tasters nach oben, soll der Servo auf 20 Grad drehen und dort z.B. 5s verharren. Eine mechanische Sperre wird gelöst und in dieser Zeit fällt der Anker ins Wasser. Danach dreht der Servo wieder auf seine Nullstellung bei 90 Grad. Durch tippen des Tasters nach unten, soll der Servo auf 160 Grad drehen. Hier sitzt ein mechanischer Schalter, der über einen Motor die Ankerkette wieder aufrollt. Das dauert z.B. 3s. Danach dreht der Servo wieder auf seine Nullstellung bei 90 Grad zurück. Wann immer der Servo nicht auf 90Grad steht, soll "Anker1busy" gesetzt sein. Das soll quasi verhindern, das man aufrollt, obwohl der Anker noch nicht gefallen ist.

aah... Ok, jetzt hab ichs verstanden.
Las mir mal nen Moment - ich mach hier grad noch was anderes fertig, aber ich denke die Logik zusammen zu bekommen :slight_smile:

Sehr gerne. Mit delay ist das natürlich einfach, jedoch kommen noch so paar andere Sachen wie ein Wassermelder hinzu der natürlich direkt reagieren soll und nicht durch ein delay geblockt wird. Wasser ist schnell :sunglasses:

1 Like

Wenn ich den massiv umschreibe ist das auch ok?
Du verwendest 2 PWM-Eingänge. Es könnten zwei Anker sein, spielt aber eigentlich keine Rolle, denn beide Kanäle machen das Selbe. Ich würde mich erstmal nur auf einen konzentrieren - warum erklär ich später.

Dann ist noch der "Korrekturfaktor".
Den würde ich nicht verwenden.
Wenn der Joy in der Mittelstellung pendelt, ist das nicht so problematisch, das kann man abfangen. Aber wenn der beim Start schon an irgendeiner Auslöseposition ist, könnte das evtl. zu Problemen führen.

Ich versuch mal was,...

Ich muss es nach dem umschreiben nur auch noch verstehen können um es bei nachfolgenden Projekten anpassen zu können. Ich verwende 2 Eingänge das ist richtig. An jedem Eingang werden 4 Taster also insgesamt 8 Zustände eingelesen. Also etwa so:
Taster 1 = Anker1 fallen / Anker 1 aufrollen
Taster 2 = Anker2 fallen / Anker 2 aufrollen
Taster 3 = Licht 1 / Licht 2
Taster 4 = Licht 3 / Licht 4
Wie gesagt es sind 1-0-1 Taster

1 Like

Ich erklär das dann schon. :wink:
Jetzt nur die Logik - nicht mehr. Der ist jettz auf das notwenidgste gekürzt, das ich das verstehe...
Also: In einer Richtung fährt der Anker runter.
Ist der dann unten, wird der Merker gesetzt.
Und erst dann kannst den wieder hochfahren.
Erst wenn der oben ist, kannst den wieder runter fahren.
Möglicherweise hab ich die Tasterstellungen vertauscht.

Wenn das geht, dann wird das erweitert, das mit dem auslösen ein Timer gestartet und nach Ablauf des Timers die Variable ankerPosition gesetzt wird.
(achso Code müsste ich mit ranhängen :slight_smile: )

#include <MobaTools.h>

MoToServo ankerServo;                 // wir machen das erstmal nur mit Einem
constexpr byte ankerServoPin {4};          //int CH1 = 4;  //const int
constexpr byte ankerPwmIn {2};

constexpr byte ankerAuslegen {20};    // ServoPosition
constexpr byte ankerNeutral {90};
constexpr byte ankerEinholen {160};


constexpr bool ausgelegt {false};
constexpr bool eingeholt {!ausgelegt};
bool ankerPosition = eingeholt;

uint16_t ankerPwm;

//const int negativ = -1;

// ************ Timer Variablen ******************
unsigned long Ankertimer1 = 0;  // Anker fallen lassen  previousMillis
const long Ankerinterval11 = 10000;

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode (ankerPwmIn, INPUT);
  pinMode(ankerServoPin, OUTPUT);
  ankerServo.attach(ankerServoPin);
  ankerServo.setSpeed(0);
  while (ankerServo.read() != ankerEinholen) // Ausgangstellung ist eingolter Anker
  {
    ankerServo.write(ankerEinholen);
  }
  ankerServo.write(90);
}

void loop()
{
  readRCinput();
  switch (ankerPwm)
  {
    case 900 ... 1250:
      if (ankerPosition == ausgelegt)                // Merker steht unten
      {
        if (ankerServo.read() != ankerEinholen)      // Und der Anker ist noch nicht oben
        {
          ankerServo.write(ankerEinholen);           // Dann hol den erstmal hoch
        }
        else                                         // Anker hat oberen Punkt erreicht
        {
          ankerPosition = eingeholt;                 // Position merken
        }
      }
      break;
    case 1650 ... 2100:
      if (ankerPosition == eingeholt)                // Merker steht oben
      {
        if (ankerServo.read() != ankerAuslegen)      // Und der Anker ist noch nicht unten
        {
          ankerServo.write(ankerAuslegen);           // Dann las den erstmal ab
        }
        else                                         // Anker hat unteren Punkt erreicht
        {
          ankerPosition = ausgelegt;                 // Position merken
        }
      }
      break;
  }
}
//
void readRCinput()
{
  int PWM1IN = pulseIn(ankerPwmIn, HIGH); //Read PWM Pulse
  if (PWM1IN > 900 && PWM1IN < 2100)
  { ankerPwm = PWM1IN; }
}

Servus,

von der Logik her ist es genau so, das ist richtig. Ich habe dein Prog mal auf den Arduino gespielt, aber verstehen tue ich es nicht wirklich. Der Servo steht ausser in der setup loop nie auf seiner Neutralstellung. Ich weiß deine Mühe sehr zu schätze, doch im Moment bin ich da überfordert :nerd_face:

Diese Ansteuerung des Servos ist auch speziell für dieses eine Boot. Viel häufiger kommt es vor das ich Lichter schalte. Ich war eben versucht die ganzen dalays und pulsein zu eliminieren. Das habe ich bisher immer so gemacht (mit delay und pulsein):

  stat1 = digitalRead(CH1);
  if (pwm1 > 950 && pwm1 < 1050 && (stat1 == LOW) && (mem1 == 0))
  {
    digitalWrite (CH1, HIGH);
    delay(10);
    do {
      pwm1 = pulseIn(2, HIGH, 20000);
      delay(50);
    }
    while (( pwm1) < 1050 );
    digitalWrite(CH1, LOW);
  }

  if (pwm1 > 950 && pwm1 < 1050 && (stat1 == LOW) && (mem1 == 1))
  {
    digitalWrite (CH1, HIGH);
    delay(10);
    do {
      pwm1 = pulseIn(2, HIGH, 20000);
      delay(50);
    }
    while (pwm1 < 1050 );
  }
  //Memory = 1 also an, dann weiter im prog
  if (pwm1 > 950 && pwm1 < 1050 && (stat1 == HIGH) && (mem1 == 1))
  { digitalWrite(CH1, LOW);
    delay(10);
    do {
      pwm1 = pulseIn(2, HIGH, 20000);
      delay(50);
    }
    while (pwm1 < 1050 );
  }
  • In der ersten if fragt er die pwm ab. stat1=low (licht ist aus) und mem1 =0(kein Memory) dann geht pin CH1 kurz auf High und dann wieder auf low.
  • In der zweiten if fragt er wieder. stat1=low (licht ist aus) und mem1 = 1 dann ist memory gesetzt und der Pin CH1 bleibt high.
  • dritte if ist, wenn stat1=high (licht ist an) und mem1=1 (Memory) dann pin CH2 auf low setzen.

Das ist wahrscheinlich sehr spartanisch, aber ich verstehe zumindest was er gerade tut. Die do und while Teile sind eigentlich nur um zu merken das der Taster wieder gehen gelassen wurde und er aus der Schleife kann.

Das ist richtig!
Die kommt nämlich jetzt - ich musste nur sicher gehen, das die Logik stimmt.
Na denn.
Wenn Du den Joy loslässt, muss die Zeit abgelaufen sein, damit der in die Neutralstellung geht.

#include <MobaTools.h>

MoToServo ankerServo;                 // wir machen das erstmal nur mit Einem
constexpr byte ankerServoPin {4};          //int CH1 = 4;  //const int
constexpr byte ankerPwmIn {2};

constexpr byte ankerAuslegen {20};    // ServoPosition
constexpr byte ankerNeutral {90};
constexpr byte ankerEinholen {160};

constexpr uint32_t fiveSecond {5000};
constexpr uint32_t twoSecond {2000};
constexpr bool ausgelegt {false};
constexpr bool eingeholt {!ausgelegt};

bool ankerPosition = eingeholt;

uint16_t ankerPwm;

uint32_t ankerStartTime;
//const int negativ = -1;

// ************ Timer Variablen ******************
unsigned long Ankertimer1 = 0;  // Anker fallen lassen  previousMillis
const long Ankerinterval11 = 10000;

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode (ankerPwmIn, INPUT);
  pinMode(ankerServoPin, OUTPUT);
  ankerServo.attach(ankerServoPin);
  ankerServo.setSpeed(0);
  while (ankerServo.read() != ankerEinholen) // Ausgangstellung ist eingolter Anker
  {
    ankerServo.write(ankerEinholen);
  }
  ankerServo.write(90);
}

void loop()
{
  readRCinput();
  switch (ankerPwm)
  {
    case 900 ... 1250:
      if (ankerPosition == ausgelegt)                // Merker steht unten
      {
        if (ankerServo.read() != ankerEinholen)      // Und der Anker ist noch nicht oben
        {
          ankerServo.write(ankerEinholen);           // Dann hol den erstmal hoch
          ankerStartTime = millis();
        }
        else                                         // Anker hat oberen Punkt erreicht
        {
          ankerPosition = eingeholt;                 // Position merken
        }
      }
      break;
    case 1650 ... 2100:
      if (ankerPosition == eingeholt)                // Merker steht oben
      {
        if (ankerServo.read() != ankerAuslegen)      // Und der Anker ist noch nicht unten
        {
          ankerServo.write(ankerAuslegen);           // Dann las den erstmal ab
          ankerStartTime = millis();
        }
        else                                         // Anker hat unteren Punkt erreicht
        {
          ankerPosition = ausgelegt;                 // Position merken
        }
      }
      break;
    default:
      uint32_t myTime = millis() - ankerStartTime;
      if (ankerServo.read() == ankerAuslegen)
      {
        ankerPosition = ausgelegt;
      }
      if (ankerServo.read() == ankerEinholen)
      {
        ankerPosition = eingeholt;
      }
      if ((myTime > fiveSecond && ankerPosition == eingeholt) ||
          (myTime > twoSecond && ankerPosition == ausgelegt))
      {
        ankerServo.write(ankerNeutral);
      }
      break;
  }
}
//
void readRCinput()
{
  int PWM1IN = pulseIn(ankerPwmIn, HIGH); //Read PWM Pulse
  if (PWM1IN > 900 && PWM1IN < 2100)
  { ankerPwm = PWM1IN; }
}

Und wenn der das tut, dann erklär ich das und wir bauen den für den zweiten Anker :slight_smile:
Wichtig sind jetzt nur die beiden Zeiten fiveSeconds und twoSeconds. Die heissen nachher irgendwie so, das die zum auslöseden Ereignis passen...

Ich setze mich morgen noch mal dran. Vielen Dank erst mal und dir noch einen schönen Abend.
Gruß Thomas

Man liest sich. :wink:

Guten Morgen,
ich habe gerade die Sequenz getestet. Das funktioniert wunderbar. Ich habe die PWM Werte in den cases getauscht, das sie meiner gewünschten Belegung des Tasters an der Funke entsprechen. Ich versuche jetzt mal das eigenständig auf 2 Anker umzuschreiben, wobei jeder seine eigenen Positionen und Zeiten verwendet. Ich bin mal selbst gespannt :grin:

Hallo suschi77

Poste mal ein paar Bilder von deinem Projekt.

Guten Morgen, du meinst von der Mechanik des Ankerfalls?