// https://forum.arduino.cc/t/project-works-for-a-while-then-hangs/1451042
// https://wokwi.com/projects/468930747269137409
const int brakePedal = 6;
const int startButton = 7;
const int engineRunningSwitch = 8; //temporary button to simulate CAN
const int RED = 5;
const int GREEN = 4;
const int ignitionRelay = 3;
const int Crank = 2;
//... here booleans are initially false and integers are initially zero
boolean brakePedalState;
boolean ledState;
boolean startButtonCurrent;
boolean startButtonPrevious;
boolean engineRunning;
int startButtonPresses;
//... use unsigned for millis() and timers
unsigned long startTime;
unsigned long debounce = 100;
//...
# define PRESSED LOW
# define NOTPRESSED HIGH
# define ON LOW
# define OFF HIGH
# define LED_ON HIGH
# define LED_OFF LOW
# define RELAY_ON HIGH
# define RELAY_OFF LOW
# define CRANK_ON HIGH
# define CRANK_OFF LOW
void setup() {
Serial.begin(9600);
Serial.println("\nIgnition...\n");
startButtonPresses = 0;
pinMode(brakePedal, INPUT_PULLUP); //Brake pedal switch - switch to earth
pinMode(startButton, INPUT_PULLUP); //Start/Stop button - switch to earth
pinMode(engineRunningSwitch, INPUT_PULLUP); //Start/Stop button - switch to earth
pinMode(RED, OUTPUT); //Direct output to Start button LED
pinMode(GREEN, OUTPUT); //Direct output to Start button LED
pinMode(ignitionRelay, OUTPUT);//Relay
pinMode(Crank, OUTPUT); //Direct output
}
void loop()
{
IgnitionSwitch();
// delay(400); // when printing
}
void IgnitionSwitch()
{
// input
engineRunning = digitalRead(engineRunningSwitch) == PRESSED;
startButtonCurrent = digitalRead(startButton) == PRESSED;
brakePedalState = digitalRead(brakePedal) == PRESSED;
/*
Serial.print(" engine running "); Serial.println(engineRunning ? "YES" : "NO");
Serial.print(" start pressed "); Serial.println(startButtonCurrent ? "YES" : "NO");
Serial.print(" brake pedal "); Serial.println(brakePedalState ? "pressed" : "not pressed");
Serial.println("");
*/
// debounce / edge detection
if (millis() - startTime >= debounce) {
if (startButtonCurrent != startButtonPrevious) {
startTime = millis();
if (startButtonCurrent) { // newly pressed
if (brakePedalState && !engineRunning) {
// brake is pressed and engine is not running:
// go to crank
startButtonPresses = 2;
}
else {
// otherwise, toggle ignition ON/OFF
if (startButtonPresses == 0)
startButtonPresses = 1;
else
startButtonPresses = 0;
}
}
startButtonPrevious = startButtonCurrent;
}
}
// Serial.print(" "); Serial.println(startButtonPresses);
switch (startButtonPresses) {
case 0 : // Ignition OFF
digitalWrite(RED, LED_OFF);
digitalWrite(GREEN, LED_OFF);
digitalWrite(ignitionRelay, RELAY_OFF);
digitalWrite(Crank, CRANK_OFF);
break;
case 1 : // Ignition ON
digitalWrite(RED, engineRunning ? LED_OFF : LED_ON);
digitalWrite(GREEN, engineRunning ? LED_ON : LED_OFF);
digitalWrite(ignitionRelay, RELAY_ON);
digitalWrite(Crank, CRANK_OFF);
break;
case 2 : // Crank engine
digitalWrite(RED, LED_ON);
digitalWrite(GREEN, LED_ON);
digitalWrite(ignitionRelay, RELAY_ON);
if (!engineRunning) {
// Serial.println(" active high start pulse");
digitalWrite(Crank, startButtonCurrent ? CRANK_ON : CRANK_OFF);
}
else {
digitalWrite(Crank, CRANK_OFF);
startButtonPresses = 1; // engine caught: return to run
}
break;
default :
Serial.println("\nRotten Denmark.\n");
while (true);
}
}
ENGINE
->>
RUNNING