Help with my Generator controller

I need help with the code i wrote to control my generator. I wrote this code and it works perfectly but now im wanting to add a counter for if after 3 failed attempts to start it will quit trying to start the generator and turn on an alarm


 int timer1 = 700;
 int timer2 = 1000;
 int timer3 = 5000;
 int timer4 = 10000;
 int timer5 = 30000;
 const int buttonPin1 = 10;
 int buttonState = 0;
void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);         //Reset
  pinMode(3, OUTPUT);         //Fuel Pump Primer
  pinMode(4, OUTPUT);         //Starter Relay
  pinMode(5, OUTPUT);         //Output Power From Generator Control Relay
  pinMode(7, OUTPUT);         //Kill Switch Relay
  pinMode(10, INPUT);         //Generator Running Relay
  pinMode(13, OUTPUT);        //On Board LED
  pinMode(buttonPin1, INPUT);
  Serial.println("SYSTEM STARTUP");
  delay(timer2);
  Serial.println ("KILL SWITCH OFF");
  digitalWrite(7, HIGH);
  delay(timer3);
  Serial.println ("FUEL LINE PRIMING");
  digitalWrite(3, HIGH);
  delay(timer5);
  digitalWrite(3, LOW);
  Serial.println ("DONE PRIMING FUEL LINE");
  delay(timer3);
  Serial.println ("STARTER ENGAGED");
  digitalWrite(4, HIGH);
  delay(timer3);
  Serial.println ("STARTER DISENGAGED");
  digitalWrite(4, LOW);
  delay(timer4); 
  buttonState = digitalRead(buttonPin1);

 if(buttonState == HIGH){

Serial.println ("SYSTEM RUNNING"); 
digitalWrite(5, HIGH);
}else{
  
  Serial.println ("ERROR DURING STARTUP SEQUENCE - SYSTEM RESTARTING");
  digitalWrite(5, LOW);
  delay(timer1);
  digitalWrite(7, LOW);
  delay(timer3);
  digitalWrite(2, HIGH);
 
}
}
void loop(){
  buttonState = digitalRead(buttonPin1);
  
  if(buttonState == LOW){
    Serial.println ("ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING");
    digitalWrite(5, LOW);
    delay(timer1);
    digitalWrite(7, LOW);
    delay(timer3);
    digitalWrite(2, HIGH);
  }else{ 
  digitalWrite(13, HIGH);
  delay(timer1);
  digitalWrite(13, LOW);
  delay(timer1);
}
}

Like i said at the beginning this code works just fine the way it is right now. Any help to steer me in the right direction is greatly appreciated.

With that logic, you will have to reset the Arduino to ever start the generator, again.

Hello wild_d
Take some time and ask the WWW for state sequencer aka FSM.

possible rearranging your in this manner might do the trick! :wink:
(Compiles, NOT tested!)

int timer1 = 700;
int timer2 = 1000;
int timer3 = 5000;
int timer4 = 10000;
int timer5 = 30000;
const int buttonPin1 = 10;
int buttonState = 0, restarts = 0;

void SystemStart() {
  Serial.println("SYSTEM STARTUP");
  delay(timer2);
  Serial.println ("KILL SWITCH OFF");
  digitalWrite(7, HIGH);
  delay(timer3);
  Serial.println ("FUEL LINE PRIMING");
  digitalWrite(3, HIGH);
  delay(timer5);
  digitalWrite(3, LOW);
  Serial.println ("DONE PRIMING FUEL LINE");
  delay(timer3);
  Serial.println ("STARTER ENGAGED");
  digitalWrite(4, HIGH);
  delay(timer3);
  Serial.println ("STARTER DISENGAGED");
  digitalWrite(4, LOW);
  delay(timer4);

  buttonState = digitalRead(buttonPin1);

  if (buttonState == HIGH) {
    Serial.println ("SYSTEM RUNNING");
    digitalWrite(5, HIGH);
    restarts = 0;
  }
}
void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);         //Reset
  pinMode(3, OUTPUT);         //Fuel Pump Primer
  pinMode(4, OUTPUT);         //Starter Relay
  pinMode(5, OUTPUT);         //Output Power From Generator Control Relay
  pinMode(7, OUTPUT);         //Kill Switch Relay
  pinMode(10, INPUT);         //Generator Running Relay
  pinMode(13, OUTPUT);        //On Board LED
  pinMode(buttonPin1, INPUT);

  SystemStart();

}
void loop() {
  buttonState = digitalRead(buttonPin1);

  if (buttonState == LOW && restarts < 3) {
    Serial.print("ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING ");
    Serial.print( ++restarts, DEC);
    Serial.println (" OF 3");
    digitalWrite(5, LOW);
    delay(timer1);
    digitalWrite(7, LOW);
    delay(timer3);
    digitalWrite(2, HIGH);
    SystemStart();
  } else {
    digitalWrite(13, HIGH);
    delay(timer1);
    digitalWrite(13, LOW);
    delay(timer1);
    Serial.println("FAILED TO RESTART!");
  }
}

hope that helps....

Hi,
Does your generator motor have an oil pressure switch?
It is worth monitoring that so you don't run with low oil pressure or a failure to start.
Or does the "Generator Running" input connect to the oil pressure switch?

Tom... :smiley: :+1: :coffee: :australia:

Hi,
You might make your code easier to read if you give your pin numbers, variable names.

You could do this;


byte ResetPin = 2;
byte PumpPrimerPin = 3;
byte StarterRelayPin = 4;
byte GenControlRelayPin = 5;
byte KillSwitchRelayPin = 7
byte GenRunningPin = 10
byte OnBoardLEDPin = 13;

//Then in void setup()

 pinMode(ResetPin, OUTPUT);         //Reset
  pinMode(PumpPrimerPin, OUTPUT);         //Fuel Pump Primer
  pinMode(StarterRelayPin, OUTPUT);         //Starter Relay
  pinMode(GenControlRelayPin, OUTPUT);         //Output Power From Generator Control Relay
  pinMode(KillSwitchRelayPin, OUTPUT);         //Kill Switch Relay
  pinMode(GenRunningPin, INPUT);         //Generator Running Relay
  pinMode(OnBoardLEDPin, OUTPUT);        //On Board LED

That way if you need to change pin allocations, you only need to do it in one place, not many places.

Tom... :smiley: :+1: :coffee: :australia:

No there is not an oil pressure switch all there is is a low oil switch that activates the kill switch all it is is a 6500 watt portable generator that I installed in my cargo trailer that has living quarters and a shop area this generator is set up to be a fail over in the event that the batteries for the inverter go too low or the inverter all together shuts down

Thank you for the info I will try that whenever I get time after work I will let you know the results

Thank you for the suggestion I will implement it into future projects that require multiple pins

Yep i know that. I need it to do that for if it needs to start and doesnt while im not home. If im home and it doesnt start after 3 attempts i can stop it manually.

I disconnected the starter and fuel pump relays from the board to imitate the generator not starting to see what the board would do and the serial monitor shows me thia

"
12:00:17.917 -> SYSTEM STARTUP
12:00:18.902 -> KILL SWITCH OFF
12:00:23.934 -> FUEL LINE PRIMING
12:00:53.977 -> DONE PRIMING FUEL LINE
12:00:58.941 -> STARTER ENGAGED
12:01:03.970 -> STARTER DISENGAGED
12:01:13.971 -> ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING 1 OF 3
12:01:21.153 -> SYSTEM STARTUP
12:01:22.140 -> KILL SWITCH OFF
12:01:27.156 -> FUEL LINE PRIMING
12:01:57.211 -> DONE PRIMING FUEL LINE
12:02:02.186 -> STARTER ENGAGED
12:02:07.200 -> STARTER DISENGAGED
12:02:17.231 -> ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING 1 OF 3
12:02:24.374 -> SYSTEM STARTUP
12:02:25.399 -> KILL SWITCH OFF
12:02:30.381 -> FUEL LINE PRIMING
12:03:00.448 -> DONE PRIMING FUEL LINE
12:03:05.430 -> STARTER ENGAGED
12:03:10.455 -> STARTER DISENGAGED
12:03:20.438 -> ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING 1 OF 3
12:03:26.128 -> ⸮SYSTEM STARTUP
12:03:28.618 -> KILL SWITCH OFF
12:03:33.630 -> FUEL LINE PRIMING
12:04:03.687 -> DONE PRIMING FUEL LINE
12:04:08.670 -> STARTER ENGAGED
12:04:13.686 -> STARTER DISENGAGED
12:04:23.714 -> ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING 1 OF 3
12:04:30.891 -> SYSTEM STARTUP
12:04:31.876 -> KILL SWITCH OFF
12:04:36.901 -> FUEL LINE PRIMING
"

I ran the code with a slide switch to simulate the button input and it is worked as expected:

@sherzaad thanks for using the wokwi.

When I played with it, I could get the system running. But the logic then goes to repeated messages about a failure to do just that, viz:

DONE PRIMING FUEL LINE
STARTER ENGAGED
STARTER DISENGAGED
SYSTEM RUNNING
FAILED TO RESTART!
FAILED TO RESTART!
FAILED TO RESTART!
FAILED TO RESTART!

I flip the switch to HIGH, looks like that means it is running. Then the test

  if (buttonState == LOW && restarts < 3)…

is always false. There needs to be a recognition and handling of success, I think.

Or a user manual. :wink:

a7

Thanks to sherzaad i was able to figure it out he steered me in the right direction. The reset pin connected to pin 2 was throwing it in a loop and it wasnt counting up. And thanks to TomGeorge for helping me organize my code. Here is a copy of it for y'all to try:

int timer2 = 5000;
int timer3 = 10000;
const int buttonPin1 = 10;
int buttonState = 0, restarts =0;
byte PrimerPin = 3;
byte StarterPin = 4;
byte OutputPin = 5;
byte KillSwPin = 7;
byte GenRunningPin = 10;
byte RunningLEDPin = 11;
byte LEDPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(PrimerPin, OUTPUT);         //Fuel Pump Primer
  pinMode(StarterPin, OUTPUT);        //Starter Relay
  pinMode(OutputPin, OUTPUT);         //Output Power From Generator Control Relay
  pinMode(KillSwPin, OUTPUT);         //Kill Switch Relay
  pinMode(GenRunningPin, INPUT);      //Generator Running Relay
  pinMode(LEDPin, OUTPUT);            //On Board LED
  pinMode(RunningLEDPin, OUTPUT);
  pinMode(buttonPin1, INPUT);

  SystemStart();

}
void SystemStart() {
  Serial.println("SYSTEM STARTUP");
  delay(timer1);
  Serial.println ("KILL SWITCH OFF");
  digitalWrite(KillSwPin, HIGH);
  delay(timer1);
  Serial.println ("FUEL LINE PRIMING");
  digitalWrite(PrimerPin, HIGH);
  delay(timer3);
  digitalWrite(PrimerPin, LOW);
  Serial.println ("DONE PRIMING FUEL LINE");
  delay(timer2);
  Serial.println ("STARTER ENGAGED");
  digitalWrite(StarterPin, HIGH);
  delay(timer2);
  Serial.println ("STARTER DISENGAGED");
  digitalWrite(StarterPin, LOW);
  delay(timer3);
  buttonState = digitalRead(buttonPin1);
}
void loop() {
  buttonState = digitalRead(buttonPin1);
  if (buttonState == HIGH){
  digitalWrite(OutputPin, HIGH);}
  
  if (buttonState == HIGH){
  digitalWrite(RunningLEDPin, HIGH);
  delay(timer3);
  digitalWrite(RunningLEDPin, LOW);
  delay(timer1);
  Serial.println ("SYSTEM RUNNING");
  delay(timer2);}
  
  if (buttonState == LOW && restarts < 3) {
  Serial.print("ERROR IN ELECRTICAL SYSTEM - SYSTEM RESTARTING ");
  Serial.print( ++restarts, DEC);
  Serial.println (" OF 3");
  digitalWrite(OutputPin, LOW);
  delay(timer1);
  digitalWrite(KillSwPin, LOW);
  SystemStart();
  } 

  if (buttonState == LOW){
  digitalWrite(LEDPin, HIGH);
  delay(timer3);
  digitalWrite(LEDPin, LOW);
  delay(timer1);
  Serial.println("FAILED TO START!");
  delay(timer2);
  }
}

Now all i have to do is implement my gsm module to text me when its trying to start, restart, and fails to start along with a display to see what the serial monitor is doing without the computer attached

also timer 1 didnt show up. Its value is 1000

Hi,
How have you got the button switch connected.
If between input pin an 5V, do you have a 10K pull down resistor between input pin and gnd?
If between input pin an gnd, do you have a 10K pull down resistor between input pin and 5V?

You cannot leave a programmed input pin open circuit, just connecting and disconnecting it from a source does not make it go from HIGH to LOW input or vice versa.

Thanks.. Tom... :smiley: :+1: :coffee: :australia:

yes i have a 10k resistor between pin 10 and gnd with the signal from the contacts of the relay between pin 10 and 5v

Ok so i got the OLED screen to work but i had to do it like this to make a count down timer to show up on the screen. is there a way to simplify it so its not such a long code?

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     4
Adafruit_SSD1306 display(OLED_RESET);
int timer1 = 1000;
int timer2 = 5000;
int timer3 = 10000;
int timer4 = 3000;
const int buttonPin1 = 10;
int buttonState = 0, restarts =0;
                           //green wire 5vdc
                           //black wire com gnd
                           //white wire 12vdc
byte PrimerPin = 3;        //orange wire
byte StarterPin = 4;       //blue wire
byte OutputPin = 5;        //brown/brown white
byte KillSwPin = 7;        //gray wire
byte GenRunningPin = 10;   //yellow wire
byte RunningLEDPin = 13;   //onboard led
byte LEDPin = 11;          //red wire

void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  pinMode(PrimerPin, OUTPUT);         //Fuel Pump Primer
  pinMode(StarterPin, OUTPUT);        //Starter Relay
  pinMode(OutputPin, OUTPUT);         //Output Power From Generator Control Relay
  pinMode(KillSwPin, OUTPUT);         //Kill Switch Relay
  pinMode(GenRunningPin, INPUT);      //Generator Running Relay
  pinMode(LEDPin, OUTPUT);            //On Board LED
  pinMode(RunningLEDPin, OUTPUT);
  pinMode(buttonPin1, INPUT);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);  
  display.setCursor(1,1);
  display.print("HELLO WILD D W5WDI");  
  display.setCursor(1,10);
  display.print("DESIGNED & PROGRAMED");
  display.setCursor(1,20);
  display.print("BY W5WDI WITH HELP");
  display.display();
  display.clearDisplay();
  delay(timer2);
  display.setCursor(1,1);
  display.print("FROM THE GOOD PEOPLE");
  display.setCursor(1,10);
  display.print("FROM THE ARDUINO.CC");
  display.setCursor(1,20);
  display.print("COMMUNITY FORUM");
  display.display();
  display.clearDisplay();
  delay(timer2);
  SystemStart();

}
void SystemStart() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  display.print("SYSTEM STARTUP");
  display.display();
  Serial.println("SYSTEM STARTUP");
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  Serial.println ("KILL SWITCH OFF");
  display.print ("KILL SWITCH OFF");
  display.display();
  display.clearDisplay();
  digitalWrite(KillSwPin, HIGH);
  delay(timer1);
  digitalWrite(PrimerPin, HIGH);
  Serial.println ("FUEL LINE PRIMING");
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("10");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("9");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("8");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("7");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("6");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("5");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("4");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("3");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("2");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("FUEL LINE PRIMING");
  display.setCursor(1,10);
  display.print ("1");
  display.display();
  display.clearDisplay();
  delay(timer1);
  digitalWrite(PrimerPin, LOW);
  display.setCursor(1,1);
  Serial.println ("DONE PRIMING FUEL LINE");
  display.print ("PRIMING FUEL LINE    DONE");
  display.display();
  display.clearDisplay();
  delay(timer1);
  digitalWrite(StarterPin, HIGH);
  Serial.println ("STARTER ENGAGED");
  display.setCursor(1,1);
  display.print ("STARTER ENGAGED");
  display.setCursor(1,10);
  display.print ("5");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("STARTER ENGAGED");
  display.setCursor(1,10);
  display.print ("4");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("STARTER ENGAGED");
  display.setCursor(1,10);
  display.print ("3");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("STARTER ENGAGED");
  display.setCursor(1,10);
  display.print ("2");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("STARTER ENGAGED");
  display.setCursor(1,10);
  display.print ("1");
  display.display();
  display.clearDisplay();
  delay(timer1);
  digitalWrite(StarterPin, LOW);
  display.setCursor(1,1);
  Serial.println ("STARTER DISENGAGED");
  display.print ("STARTER DISENGAGED");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("10");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("9");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("8");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("7");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("6");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("5");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("4");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("3");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("2");
  display.display();
  display.clearDisplay();
  delay(timer1);
  display.setCursor(1,1);
  display.print ("VERIFYING IF RUNNING");
  display.setCursor(1,10);
  display.print ("1");
  display.display();
  display.clearDisplay();
  delay(timer1);
  buttonState = digitalRead(buttonPin1);
}
void loop() {
  buttonState = digitalRead(buttonPin1);
  if (buttonState == HIGH){
  display.clearDisplay();
  display.setTextSize(.5);
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  digitalWrite(OutputPin, HIGH);
  digitalWrite(RunningLEDPin, HIGH);
  Serial.println ("SYSTEM RUNNING");
  display.print ("SYSTEM RUNNING");
  display.display();
  display.clearDisplay();
  }
  
  if (buttonState == LOW && restarts < 3) {
  Serial.print("ERROR DURING STARTUP - SYSTEM RESTARTING ");
  display.setCursor(1,1);
  display.print("STARTING FAILURE");
  display.setCursor(1,10);
  display.print("SYSTEM RESTARTING");
  display.setCursor(1,20);
  display.print( ++restarts, DEC);
  Serial.println (" OF 3");
  display.print (" OF 3");
  display.display();
  display.clearDisplay();
  delay(timer4);
  digitalWrite(OutputPin, LOW);
  delay(timer1);
  digitalWrite(KillSwPin, LOW);
  SystemStart();
  } 

  if (buttonState == LOW){
  digitalWrite(LEDPin, HIGH);
  Serial.println("FAILED TO START!");
  display.setCursor(1,1);
  display.print("FAILED TO START!");
  display.setCursor(1,10);
  display.print("PLEASE CYCLE");
  display.setCursor(1,20);
  display.print("MAIN POWER");
  display.display();
  display.clearDisplay();
  }
}

Hi,
In the IDE, press [ CTRL] [ T ] to auto format your code.
It will detent your functions to make it easier to read your code.

Thanks.. Tom.. :smiley: :+1: :coffee: :australia:

THX that helped