solrac3f:
besser gesagt eine schnelles stoppen. Wo im Programm wäre es am besten unterzubringen?
Aaaalso. Nehmen wir das NOT mal raus, kannst Du einen Stop einbauen...
Ein solcher Stop soll angelehnt an ein NOT-Halt sein. 
Damit musst Du sicherstellen, das der Stop auch ausgelöst wird, wenn die Leitung kaputt ist.
Die Leitung ist kaputt, wenn es auf der Leitung zum STOP-Schalter einen Kurzschluss gibt oder einen Kabelbruch.
Dazu erst mein Schaltbild.
Ist nen Spannungsteiler der mit einem NC und einem eingebauten Widerstand im Gehäuse bei Kabelbruch oder ausgelöstem Schalter den Pin HIGH zieht.
Bei einem Kurzschluss oder Ausfall der positoiven Spannung wird nach LOW gezogen.
Die Mitte soll irgendwo in der Mitte liegen 
+5V
|
+-+
| |
+-+
|
A0 o PIN
|
#######
# | #
# +-+ #
# | | # Widerstand
# +-+ #
# | #
# o #
# |+ # Schalter (NC)
# o #
####### im Gehäuse
|
GND
Ich hab den von mir gelieferten Code angepasst.
Abgefragt wird A0 (Spannungsteiler).
Die Abfrage kann zu jeder Zeit erfolgen.
Sie MUSS vor der Auswahl des schritt erfolgen.
Sie SOLL immer dann erfolgen, wenn eine Funktion aufgerufen wird, die ggfls. nen Moment Zeit braucht.
Die Schrittkette ist erweitert. Bitte unbedingt lesen, was einkommentiert ist.
const byte sensorLinksEnd = 2;
const byte sensorRechtsEnd = 3;
const byte startPin = 4;
const byte stopPin = 5;
const byte relaisLinks = 6;
const byte relaisRechts = 7;
const byte HaltPin = A0;
enum {relaisAn, relaisAus};
enum {warten, on, rechts, haltrechts, links, haltlinks, off, stoppen, stoppenEnde};
byte schritt = warten;
byte zyklus = 20;
const byte maxzyklus = 20;
void setup() {
Serial.begin(115200);
Serial.println(F("Start...."));
pinMode(sensorLinksEnd, INPUT);
pinMode(sensorRechtsEnd, INPUT);
pinMode(startPin, INPUT);
pinMode(stopPin, INPUT);
pinMode(relaisLinks, OUTPUT);
digitalWrite(relaisLinks, relaisAus);
pinMode(relaisRechts, OUTPUT);
digitalWrite(relaisRechts, relaisAus);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
schritt = schnellHalt(schritt);
schrittkette();
}
void schrittkette()
{
static unsigned long lastmillis;
const unsigned long pauseZeit = 5000; // in ms
if (digitalRead(stopPin))
{
schritt = off;
}
switch (schnellHalt(schritt))
{
case warten:
if (digitalRead(startPin))
{
zyklus = 0;
schritt = on;
}
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAus);
break;
case on:
digitalWrite(LED_BUILTIN, HIGH);
schritt = rechts;
break;
case rechts:
digitalWrite(relaisRechts, relaisAn);
if (digitalRead(sensorRechtsEnd))
{
digitalWrite(relaisRechts, relaisAus);
schritt = haltrechts;
lastmillis = millis();
}
break;
case haltrechts:
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAus);
if (millis() - lastmillis > pauseZeit)
{
schritt = links;
}
break;
case links:
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAn);
if (digitalRead(sensorLinksEnd))
{
digitalWrite(relaisLinks, relaisAus);
schritt = haltlinks;
lastmillis = millis();
}
break;
case haltlinks:
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAus);
if (millis() - lastmillis > pauseZeit)
{
if (zyklus == maxzyklus)
{
schritt = off;
}
else
{
zyklus++; // Die Zeile hat gefehlt
schritt = rechts;
}
}
break;
case off:
digitalWrite(LED_BUILTIN, LOW);
schritt = warten;
break;
case stoppen:
anhalten();
schritt=stoppen;
if (schnellHalt(stoppenEnde) != stoppen) // Es wird geprüft, ob stoppenEnde möglich ist
{ // kommt "stoppen" zurück, geht es nicht weiter
// Hier muss etwas rein, was nach dem Rückstellen ausgelöst werden kann
// Und dann einen definierten schritt zurück gibt
schritt=stoppenEnde;
}
break;
case stoppenEnde: // Wenn der Stopp nicht mehr gilt UND zurück gefahren,
schritt = off; // gehe an definierten Zustand off
break;
}
}
byte schnellHalt(byte aktuell) // Diese Funktion bekommt den aktuellen Schritt übergeben
{
if (analogRead(HaltPin) > 450 && analogRead(HaltPin) < 550) // Spannungsteiler OK?
{
return aktuell; // Wenn ja, ist der Kontakt noch geschlossen
}
else
{
anhalten();// Wenn nein, ist ausgelöst
}
return stoppen;
}
void anhalten()
{
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAus);
}