Ah - gut, wie gesagt ich habs nicht so mit struct ;(
Ich hab das mit den Abbruchbedingungen auch anders gedacht - und gemacht.
Ich hab den:
so interpretiert, das jederzeit auf jede Schalterstellung reagiert werden und der Abbruch initiiert werden soll.
Da der TO noch nicht da war, geb ich meinen mal zum Besten.
Eigentlich kommentiere ich sonst auch, aber ich denke, das der selbstredend ist.
Es sind einige serielle Ausgaben drin und wie immer viele Klammern. Da ich anders formatiere, sieht es viel aus - ist es nicht... ![]()
Wichtig war mir, das zum Start schon geprüft wird, ob die Schalter in Grundstellung sind. Die Zeiten habe ich mal etwas länger gemacht, damit mir mit nem Draht ne Kontrollmöglichkeit bleibt...
Na dann...
const byte schalter[] = {8, 5, 2};
const byte led[] = {9, 6, 3};
const byte ledWeiss = 12;
boolean pcON = false;
const unsigned long reaktionsZeit = 80000; // zeiten in ms
const unsigned long pausenZeit[] = {6000, 6000};
enum {wartenAufStart, warteZeitEins, reaktionsZeitEins, warteZeitZwei, // einzelne Schritte...
reaktionsZeitZwei, richtig, abbruch, neuStart
} status = wartenAufStart;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
for (byte b = 0; b < sizeof(led) / sizeof(led[0]); b++)
{
Serial.print(F("setze LED: "));
Serial.println(b);
pinMode(led[b], OUTPUT);
}
ledStart();
for (byte b = 0; b < sizeof(schalter) / sizeof(schalter[0]); b++)
{
Serial.print(F("setze SchalterPin: "));
Serial.println(schalter[b]);
pinMode(schalter[b], INPUT_PULLUP);
}
if (leseSchalter() != 0b11111111) status = abbruch;
}
void loop()
{
static unsigned long lastmillis = 0;
byte x = leseSchalter();
switch (status)
{
case wartenAufStart:
{
Serial.println(F("WarteaufStart"));
if (x == 0b11111110) // Schalter eingeschaltet
{
lastmillis = millis();
status = warteZeitEins;
}
else if (x != 0b11111111) status = abbruch;
}
break;
case warteZeitEins:
Serial.println(F("WarteZeit1"));
if (x == 0b11111110)
{
if (millis() - lastmillis >= pausenZeit[0])
{
status = reaktionsZeitEins;
}
}
else
{
status = abbruch;
}
break;
case reaktionsZeitEins:
Serial.println(F("ReaktionsZeit1"));
if (x == 0b11111100)
{
lastmillis = millis();
status = warteZeitZwei;
}
else if ((millis() - lastmillis > pausenZeit[0] + reaktionsZeit) || (x != 0b11111110))
{
status = abbruch;
}
break;
case warteZeitZwei:
Serial.println(F("WarteZeit2"));
if (x == 0b11111100)
{
if (millis() - lastmillis >= pausenZeit[1])
{
status = reaktionsZeitZwei;
}
}
else
{
status = abbruch;
}
break;
case reaktionsZeitZwei:
Serial.println(F("ReaktionsZeit2"));
if (x == 0b11111000)
{
status = richtig;
}
else if ((millis() - lastmillis > pausenZeit[1] + reaktionsZeit) || (x != 0b11111100))
{
status = abbruch;
}
break;
case richtig:
Serial.println(F("Hier ist alles schick"));
digitalWrite(ledWeiss, HIGH);
status = neuStart;
break;
case abbruch:
Serial.println(F("Abbruch"));
// gebe Signalton
tone(13, 1319, 850);
delay (100);
noTone(13);
status = neuStart;
break;
case neuStart:
Serial.println(F("NeuStart"));
// prüfe auf alle Schalter aus
if (leseSchalter() == 0b11111111)
{
ledStart();
status = wartenAufStart;
}
break;
}
}
void ledStart()
{
for (byte b = 0; b < sizeof(led) / sizeof(led[0]); b++)
{
digitalWrite(led[b], HIGH);
delay(500);
digitalWrite(led[b], LOW);
}
}
byte leseSchalter()
{
byte schalterStellung = 0b11111111;
for (byte b = 0; b < sizeof(schalter) / sizeof(schalter[0]); b++)
{
if (!digitalRead(schalter[b]))
{
bitClear(schalterStellung, b);
digitalWrite(led[b], HIGH);
}
else
digitalWrite(led[b], LOW);
}
Serial.println(schalterStellung, BIN);
delay(30);
return schalterStellung;
}