Zwei Lichtschranken - Weiterschaltbedingung möglich?

Habe ich auch mal gemacht.
Ich komme gänzlich ohne Zeiten aus.
Da beide Schranken abgedeckt sind, ist das sogar recht einfach.
Im Code ist ein delay() auskommentiert.
Wenn Du das auf dem Steckbrett machst, mach es rein, dann merkst Du das prellen der Schalter bzw. das stecken der Kontakte nicht so sehr.

Kurze Erklärung:
Ich frage die Pins ab, und merke mir den Zustand. Dann rufe ich die Funktion zur Feststellung der Richtung auf.
Nur wenn sich der Zustand ändert, wird wieder der Zustand gewerkt und das geht wieder von vorn.

Ich hoffe nichts vergessen zu haben.

// Forensketch - Laufrichtung feststellen
// https://forum.arduino.cc/t/zwei-lichtschranken-weiterschaltbedingung-moglich/925089

bool rechtsPin = false;
bool linksPin = false;
const byte photoRechts = 2;
const byte photoLinks = 3;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(photoRechts, INPUT_PULLUP);
  pinMode(photoLinks, INPUT_PULLUP);
}

void loop()
{
  // delay(100);
  if (!digitalRead(photoRechts))
  {
    if (!rechtsPin)
    {
      rechtsPin = true;
      bewegung();
    }
  }
  else
  {
    if (rechtsPin)
    {
      rechtsPin = false;
      bewegung();
    }
  }
  if (!digitalRead(photoLinks))
  {
    if (!linksPin)
    {
      linksPin = true;
      bewegung();
    }
  }
  else
  {
    if (linksPin)
    {
      linksPin = false;
      bewegung();
    }
  }
}

void bewegung()
{
  enum {warten, rechts, links, ausgang, falsch};
  static byte vorwaerts = warten;
  switch (vorwaerts)
  {
    case warten:
      if (rechtsPin)  {vorwaerts = rechts;  Serial.println(F("komme von rechts"));}  // Eintritt von rechts nach links
      if (linksPin)   {vorwaerts = falsch;  Serial.println(F("komme von links"));}   // Eintritt von links nach rechts
      break;
    case rechts:
      if (!rechtsPin) {vorwaerts = warten;  Serial.println(F("gehe nach warten"));}  // geht wieder zurück
      if (linksPin)   {vorwaerts = links;   Serial.println(F("gehe nach links"));}   // geht nach links
      break;
    case links:
      if (!rechtsPin) {vorwaerts = ausgang; Serial.println(F("gehe zum ausgang"));}  // geht nach links
      if (!linksPin)  {vorwaerts = rechts;  Serial.println(F("gehe nach rechts"));}  // geht wieder nach rechts
      break;
    case ausgang:
      if (rechtsPin)  {vorwaerts = links;   Serial.println(F("gehe zurück nach links"));}
      if (!linksPin)     // bin am Ende
      {
        vorwaerts = warten;
        // Hier kann eine Aktion rein
        Serial.println(F("bin durch"));
      }
      break;
    case falsch:
      if (!rechtsPin && !linksPin) {vorwaerts = warten; Serial.println(F("falsche Richtung beendet"));} // geht wieder nach warten
      break;
  }
}