Das Programm dürfte durch die 4 mal define SchrankePin eigentlich nicht kompilieren.
Die Delays blockieren die Tastenerkennung.
Tasten abfragen ohne Entprellung (nicht so schlimm).
So habe ich dein programm verstanden:
- Roter Taster → Vorwarnung (gelbe LED), dann Schranken schließen (4 Motoren/Servos nacheinander), rote LED an
- Grüner Taster → Schranken wieder öffnen
Ich kann es selber nicht testen, aber probiere mal den unteren Code.
Es ist eine leichte Entprellung vorhanden, die Delays sind entfernt, Zeiten sind flexibler wählbar.
Bei den Tastern muss jeweils ein externer Pulldown Widerstand vorhanden sein.
Dirk
CodeBox C
// ---------- Pin-Definitionen ----------
const byte tasterRotPin = 2; // Taster "Schranke schließen"
const byte tasterGruenPin = 12; // Taster "Schranke öffnen"
const byte ledGelbPin = 7; // Warnblinker
const byte ledRotPin = 6; // Dauerlicht, wenn geschlossen
const byte schranke1Pin = 4;
const byte schranke2Pin = 5;
const byte schranke3Pin = 8;
const byte schranke4Pin = 9;
// ---------- Einstellbare Zeiten (ms) ----------
const unsigned long VORWARNZEIT = 3000; // Gelb blinkt, bevor die Schranken zugehen
const unsigned long BLINKINTERVALL = 400; // Blinkgeschwindigkeit Gelb
const unsigned long SCHRANKENVERSATZ = 800; // zeitlicher Abstand zwischen den 4 Schranken
const unsigned long ENTPRELLZEIT = 50; // Taster-Entprellung
// ---------- Zustandsmaschine ----------
enum Zustand { RUHE, WARNEN, SCHLIESSEN, GESCHLOSSEN };
Zustand zustand = RUHE;
unsigned long stateTimer = 0; // Startzeitpunkt des aktuellen Zustands
unsigned long letzterBlink = 0;
bool gelbAn = false;
byte schrankenSchritt = 0;
unsigned long letzteTasterZeit = 0;
void setup() {
pinMode(tasterRotPin, INPUT);
pinMode(tasterGruenPin, INPUT);
pinMode(ledGelbPin, OUTPUT);
pinMode(ledRotPin, OUTPUT);
pinMode(schranke1Pin, OUTPUT);
pinMode(schranke2Pin, OUTPUT);
pinMode(schranke3Pin, OUTPUT);
pinMode(schranke4Pin, OUTPUT);
}
void loop() {
unsigned long jetzt = millis();
switch (zustand) {
case RUHE:
if (tasterGedrueckt(tasterRotPin)) {
zustand = WARNEN;
stateTimer = jetzt;
letzterBlink = jetzt;
gelbAn = false;
}
break;
case WARNEN:
// Gelbe LED blinkt, solange die Vorwarnzeit läuft
if (jetzt - letzterBlink >= BLINKINTERVALL) {
letzterBlink = jetzt;
gelbAn = !gelbAn;
digitalWrite(ledGelbPin, gelbAn ? HIGH : LOW);
}
if (jetzt - stateTimer >= VORWARNZEIT) {
digitalWrite(ledGelbPin, LOW);
digitalWrite(ledRotPin, HIGH);
zustand = SCHLIESSEN;
stateTimer = jetzt;
schrankenSchritt = 0;
}
break;
case SCHLIESSEN:
// Die 4 Schranken nacheinander mit Versatz schließen
if (jetzt - stateTimer >= (unsigned long)schrankenSchritt * SCHRANKENVERSATZ) {
switch (schrankenSchritt) {
case 0: digitalWrite(schranke1Pin, HIGH); break;
case 1: digitalWrite(schranke2Pin, HIGH); break;
case 2: digitalWrite(schranke3Pin, HIGH); break;
case 3: digitalWrite(schranke4Pin, HIGH);
zustand = GESCHLOSSEN;
break;
}
schrankenSchritt++;
}
break;
case GESCHLOSSEN:
// Wartet, bis der grüne Taster gedrückt wird – egal wie lange
if (tasterGedrueckt(tasterGruenPin)) {
digitalWrite(ledRotPin, LOW);
digitalWrite(schranke1Pin, LOW);
digitalWrite(schranke2Pin, LOW);
digitalWrite(schranke3Pin, LOW);
digitalWrite(schranke4Pin, LOW);
zustand = RUHE;
}
break;
}
}
// Liest einen Taster mit einfacher Entprellung
bool tasterGedrueckt(byte pin) {
if (digitalRead(pin) == HIGH) {
unsigned long jetzt = millis();
if (jetzt - letzteTasterZeit > ENTPRELLZEIT) {
letzteTasterZeit = jetzt;
return true;
}
}
return false;
}