Hilfe bei Schrittkette

Chippo:
Die Flag setzt du oben einmal auf true, dies wird ja nur einmal zu Beginn ausgeführt, wenn der Arduino Strom bekommt.

Ich habe die Zeile
einmal = true;
vergessen :blush:

// falls Not Aus rein, millis einfügen, delay raus

const byte pin1B1 = A5; // kapazitiver Sensor
const byte pin2B1 = A4; // Magazin oben/unten
const byte pin3B1 = 2; //Reed "Klemmen" eingefahren
const byte pin3B2 = 3; //Reed "Klemmen" ausgefahren
const byte pin1A1 = 4; // Zylinder "Klemmen"
const byte pin2A1 = 5; // Zylinder "Sperren"
const byte pin3A1 = 6; // Zylinder "Schieben"
const byte pin4A2 = 7; // Zylinder "Sichern"
const byte pin4B1 = 8; // Reed "Sperren" eingefahren
const byte pin4B2 = 9; // Reed "Sperren" ausgefahren
const byte pin5B1 = 10; // Reed "Schieben" eingefahren
const byte pin5B2 = 11; // Reed "Schieben" ausgefahren
const byte pin6B1 = 12; // Reed "Sichern" eingefahren
const byte pin6B2 = 13; // Reed "Sichern" susgefahren
//const byte pinS1 = A0; // Schalter EIN/AUS, noch nicht eingefügt, evtl später

enum States {
  stateRuhestellung, stateSperren, stateKlemmen, stateSichernWeg, stateSchieben, stateSchiebenRein, stateSichernHoch, stateKlemmenWeg, stateSperrenWeg
}; // die einzelnen Schritte

//mState = machine State
States mState = stateRuhestellung;              //der Startpunkt der Schrittkette
bool einmal = true;

void setup() {

  Serial.begin(9600);

  pinMode(pin1A1, OUTPUT);
  pinMode(pin2A1, OUTPUT);
  pinMode(pin3A1, OUTPUT);
  pinMode(pin4A2, OUTPUT);
  pinMode(pin1B1, INPUT);
  pinMode(pin2B1, INPUT);
  pinMode(pin3B1, INPUT);
  pinMode(pin3B2, INPUT);
  pinMode(pin4B1, INPUT);
  pinMode(pin4B2, INPUT);
  pinMode(pin5B1, INPUT);
  pinMode(pin5B2, INPUT);
  pinMode(pin6B1, INPUT);
  pinMode(pin6B2, INPUT);

  digitalWrite(pin1A1, LOW); // bei Neustart Grundstellung
  digitalWrite(pin2A1, LOW);
  digitalWrite(pin3A1, LOW);
  digitalWrite(pin4A2, HIGH);

  Serial.println(F("Start"));
}

void loop() {
  // mit "when" Schalter abfragen? Switch case nur solange Schalter Ein?
  switch (mState)
  {
    case stateRuhestellung:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin2A1, LOW);
          Serial.println(F("Ruhestellung"));
        }
        if (digitalRead(pin1B1) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateSperren; // der nächste Schritt
        }
      }
      break;

    case stateSperren:
      {
        if (einmal)
        {
          einmal = false;
          Serial.println(F("Sperren"));
        }
        if (!digitalRead(pin1B1) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateKlemmen;
        }
      }
      break;

    case stateKlemmen:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin2A1, HIGH); // Zylinder soll ausfahren
          Serial.println(F("Klemmen"));
        }
        if (digitalRead(pin4B2) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateSichernWeg;
        }
      }
      break;

    case stateSichernWeg:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin1A1, HIGH);
          Serial.println(F("SichernWeg"));
        }
        if (digitalRead(pin3B2) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateSchieben;
        }
      }
      break;

    case stateSchieben:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin4A2, LOW);
          Serial.println(F("Schieben"));
        }
        if (digitalRead(pin6B1) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateSchiebenRein;
        }
      }
      break;

    case stateSchiebenRein:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin3A1, HIGH);
          Serial.println(F("SchiebenRein"));
        }
        if (digitalRead(pin5B2) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateSichernHoch;
        }
      }
      break;

    case stateSichernHoch:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin3A1, LOW);
          Serial.println(F("SichernHoch"));
        }
        if (digitalRead(pin5B1) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateKlemmenWeg;
        }
      }
      break;

    case stateKlemmenWeg:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin4A2, HIGH);
          Serial.println(F("KlemmenWeg"));
        }
        if (digitalRead(pin6B2) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateSperrenWeg;
        }
      }
      break;

    case stateSperrenWeg:
      {
        if (einmal)
        {
          einmal = false;
          digitalWrite (pin1A1, LOW);
          Serial.println(F("SperrenWeg"));
        }
        if (digitalRead(pin3B1) && digitalRead(pin2B1))
        {
          einmal = true;
          mState = stateRuhestellung;
        }
      }
      break;
  }
}

Wird es nun verständlicher?

Meist haben bistabile Relais keine 100% ED
Warum auch... sind ja auch nur StromStoßRelais....

Darum:
Wenn ein Endschalter nicht funktioniert, erreicht wird, bleibt dein Automat stehen und das Relais kann durchbrennen.

hmm, ok. An so etwas habe ich noch gar nicht gedacht, bzw war mir nicht bewusst. Werde mich da auf jeden Fall noch mal genauer informieren.
Werde mir da auf jeden Fall was überlegen, evtl muss ich dann doch andere Relais verwenden.
Was die Sicherheit angeht, habe ich mich noch gar nicht mit beschäftigt, wird aber auf jeden Fall der nächste Schritt. Bauteile verstehen und überprüfen, was kann passieren, wie kann ich es verhindern/absichern.
Mit der VDE Prüfung wollte/muss ich mich eh auch noch mal beschäftigen. Aber gerade was die solche oben genannten Möglichkeiten betrifft habe ich noch zu wenig Erfahrung. Solche Tipps sind auf jeden Fall Gold wert für mich :slight_smile:

Ich habe die Zeile
einmal = true;
vergessen :blush:

Habe es schon fast vermutet, aber jetzt verstehe ich es :slight_smile: Gefällt mir von der Idee her

evtl muss ich dann doch andere Relais verwenden.

Warum?
So ein bisschen Timing, ist für deinen UNO, doch ein Klacks.
Ok, für dich vielleicht noch nicht, aber für den UNO schon.
Das kommt.....