Hier wäre dann mein Sketch:
const int seilSch = 12; // Seilzugschalter
const int endSchO = 11; // Endschalter Oben
const int endSchU = 10; // Endschalter Unten
const int extSch = 9; // Extern Hoch
const int lichtSchr = 8; // Lichtschranke
int drehrichtungMot = 6;
int powerMot = 5; // Spannung Motor
int status_seilSch = 0;
int status_endSchO = 0;
int status_endSchU = 0;
int status_extSch = 0;
int status_lichtSchr = 0;
const byte kabine_oben = 0;
const byte kabine_unten = 1;
const byte fahrt_nach_unten = 2;
const byte fahrt_nach_oben = 3;
const byte unterbrechung = 4;
const byte start = 5;
int state = start;
const long prellzeit = 50;
unsigned long previousMillis = 0;
void setup() {
pinMode (seilSch, INPUT);
pinMode (endSchO, INPUT);
pinMode (endSchU, INPUT);
pinMode (extSch, INPUT);
pinMode (lichtSchr, INPUT);
pinMode (drehrichtungMot, OUTPUT); //Relais K5
digitalWrite (powerMot, HIGH);
pinMode (powerMot, OUTPUT); // Relais K4
}
void loop() {
status_seilSch = digitalRead (seilSch);
status_endSchO = digitalRead (endSchO);
status_endSchU = digitalRead (endSchU);
status_extSch = digitalRead (extSch);
status_lichtSchr = digitalRead (lichtSchr);
unsigned long currentMillis = millis();
switch (state) {
case start:
digitalWrite (powerMot, HIGH);
if (status_seilSch == HIGH || status_extSch == HIGH) {
state = fahrt_nach_oben;
}
case kabine_oben:
digitalWrite (powerMot, HIGH);
if (status_seilSch == HIGH || status_extSch == HIGH) {
state = fahrt_nach_unten;
}
break;
case fahrt_nach_unten:
digitalWrite (drehrichtungMot, HIGH);
if (currentMillis - previousMillis >= prellzeit){
previousMillis = currentMillis;
digitalWrite (powerMot, LOW);
}
if (status_lichtSchr == HIGH) {
state = unterbrechung;
}
if (status_endSchU == HIGH) {
state = kabine_unten;
}
break;
case kabine_unten:
digitalWrite (powerMot, HIGH);
if (status_seilSch == HIGH || status_extSch == HIGH) {
state = fahrt_nach_oben;
}
break;
case fahrt_nach_oben:
digitalWrite (drehrichtungMot, LOW);
if (currentMillis - previousMillis >= prellzeit){
previousMillis = currentMillis;
digitalWrite (powerMot, LOW);
}
if (status_endSchO == HIGH) {
state = kabine_oben;
}
break;
case unterbrechung:
while (status_lichtSchr == HIGH) {
digitalWrite (powerMot, HIGH);
}
if (status_lichtSchr == LOW) {
state = fahrt_nach_oben;
}
break;
} // END switch state
} // END Loop
Ich habe jetzt mal einen case start definiert und am Anfang "state = start" gesetzt.
Das Thema Sicherheit durch die Lichtschranke sollte eigtl auch so passen. Der Motor steht, solange etwas unterbricht. Wenn die Unterbrechung weg ist, dann Fahrt nach oben.
Keine Delays mehr, die Schaltpause zwischen Drehrichtung und Saft auf den Motor mit millis () umgesetzt.
Über ein kurzes Feedback, ob das alles so Sinn macht würde ich mich freuen.
Grüße,
Steve