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;
}
}