du musst unbedingt das debuggen lernen!
Das ist eine Methode, zu sehen, wie der Code abgearbeitet wird, welchen Wert eine Variable wo hat etc.
Beim Arduino ist die einfachste Möglichkeit zum Debugging die Ausgabe von Werten über den Seriellen Monitor.
Du solltest also hinter jeden case Befehl einen Serial.print() setzen, der dir Ausgibt, wo der Code steht.
also:
case Start:
Serial.println("Start");
...
case Ignition:
Serial.println("Ignition");
Wenn du das getan hast, und die Ausgabe ansiehst, wirst du folgendes feststellen:
Ausgabe / Aktion
Wait
Wait
Wait
Wait / "high" signal anlegen
Start
ACC
ACC
ACC
...
Der Code springt also aus "Wait" raus, rennt durch "Start" durch und geht sofort in "ACC".
Wenn du das weißt, kannst du auch den Fehler schnell finden....
Noch ein Hinweis zu den LEDs:
Ich würde die Ansteuerung aus der Statemachine rausnehmen. In den case-Pfade nur eine Statusvariable setzen: "LED1 = Blinken; LED2 = AN" und dann ausserhalb der Statemachine eine Funktion, die die LEDs entsprechend ansteuert.
So eine Funktion könnte z.B. so aussehen:
void LEDs_setzen(){
static unsigned long lastchange = 0;
const int Blinkdauer = 500;
static boolean BlinkHL;
if (millis()- Blinkdauer > lastchange){ // Blinkrhytmus erzeugen
lastchange = millis();
BlinkHL = !BlinkHL;
}
for (int i = 0; i<4; i++){
if (LED_Status[i] == AN) digitalWrite(LED_PIN[i],HIGH);
if (LED_Status[i] == AUS) digitalWrite(LED_PIN[i],LOW);
if (LED_Status[i] == BLINK) digitalWrite(LED_PIN[i],BlinkHL);
}
}
ungetesteter Code!
dafür musst du die LED-Pins in einem Array vereinbaren, und auch ein Array für den Zustand der einzelnen LEDs:
const int LED_PIN[4] = {2,3,4,5};
byte LED_Status[4];
enum LED_Stati {AN, AUS, BLINK };
in der loop steht dann nur:
LEDs_setzen();
und die einzelnen LEDs werden geschaltet mit
LED_Status[1] = BLINK;