Hi
Der Weg sieht schon ganz gut aus.
Du musst sämtliche Variablen bekannt machen!
Woher soll der Kompiler wissen, wie groß state werden kann?
Mindestens in loop als static - von Da ist's nicht weit weg zu direkt global.
Hier Mal mein Versuch:
//Foren-Sketch
// https://forum.arduino.cc/index.php?topic=681966.msg4587720#msg4587720
//Pin-Zuordnung
const byte pin_gn = 13;
const byte pin_ge = 12;
const byte pin_ro = 11;
const byte pin_s1 = 2;
const byte pin_s2 = 4;
//Zuordnung, welcher Pegel AN bedeutet
const bool _AN = HIGH;
const bool _AUS = !_AN;
//Zuordnung, welcher Pegel eine unterbrochene Lichtschranke darstellt
const bool _BETAETIGT = LOW;
const bool _UNBETAETIGT = !_BETAETIGT;
void setup() {
pinMode(pin_gn, OUTPUT);
pinMode(pin_ge, OUTPUT);
pinMode(pin_ro, OUTPUT);
pinMode(pin_s1, INPUT);
pinMode(pin_s2, INPUT);
digitalWrite(pin_gn, _AN); //Start-Zustand, Einfahrt erlaubt
digitalWrite(pin_ge, _AUS);
digitalWrite(pin_ro, _AUS);
}
//Ampel soll eine Rennstrecke sperren, wenn ein Fahrzeug sich auf Dieser befindet
//und wieder frei geben, wenn Dieses Diese verlassen hat.
void loop() {
byte static ampelstatus = 0;
switch (ampelstatus) {
case 0://Ampel Grün, wartet auf Einfahrt
if (digitalRead(pin_s1) == _BETAETIGT) {
ampelstatus++;
digitalWrite(pin_gn, _AUS); //Wechsel von GN auf GE
digitalWrite(pin_ge, _AN);
}
break;
case 1://Ampel Rot, Fahrzeug in Rennstrecke
if (digitalRead(pin_s1) == _UNBETAETIGT) {
ampelstatus++;
digitalWrite(pin_ge, _AUS); //Wechsel von GE auf RO
digitalWrite(pin_ro, _AN);
}
break;
case 2://Ampel auf Gelb, Fahrzeug am Ziel
if (digitalRead(pin_s2) == _BETAETIGT) {
ampelstatus++;
digitalWrite(pin_ge, _AN); //Wechsel von RO auf RO-GE
}
break;
case 3://Ampel auf Grün, Fahrzeug hat Strecke verlassen
if (digitalRead(pin_s2) == _UNBETAETIGT) {
ampelstatus++;
digitalWrite(pin_ge, _AUS); //Wechsel auf GN
digitalWrite(pin_ro, _AUS);
digitalWrite(pin_gn, _AN);
}
break;
default: ampelstatus = 0; //ungültiger Status wird auf 0 umgebrochen
}
}
/*
Auf Uno/Nano:
Der Sketch verwendet 1122 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, 2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
*/
Versuche zu verstehen, was ich wo mache.
Auch hat es durchaus einen Sinn, keine 'magic numbers' im Sketch stehen zu lassen.
Alle Zahlen, Die irgendwo gebraucht werden, deklariert man am Anfang des Sketch - so hat diese Zahl einen Namen und kann auch einfachst angepasst werden.
Alles, was konstant ist - auch so deklarieren: mit 'const'.
Die Pin-Zuordnung wird sich während der Laufzeit nicht ändern - also warum nicht fest im Code verbauen lassen? (der Kompiler kann so Zeug prima weg optimieren).
Wenn's als Variable bleibt, ändert Die sich zwar auch nie, aber der Wert des Pin wird jedes Mal aus dem Speicher ausgelesen - Das braucht Zeit und Platz (sowohl für die Variable, wie für den auslesenden Code).
MfG
PS: Drück in der IDE Mal STRG+T - Das rückt den Code auf Klammer-Ebene ein.
Auch setze ich öffnende Klammern gerne in die Zeile der IF/FOR/whatever, wie um ELSE in die gleiche Zeile.
So bleibt der Code kompakt.