/* Program: Remote Car Start
*/
//EQUATES
//Inputs
int signal_on = 2; //"ON" signal inputed to pin 2
int oil_sens = 3; //Vehicle RPM sensor inputted to pin 3
int parking_brake = 4;
int braking_ped = 5; //Vehicle Brake Pedal inputted to pin 5
//Outputs
int on_ctrl = 11; //Ignition Control Relay controlled by pin 8
int start_ctrl = 10; //Start Control Relay controlled by pin 9
int acc_ctrl = 12; //Accessory Control Relay controlled by pin 11
int flashlights = 9;
unsigned long start_time; //Variable used to store the time at which the starter is engaged
char data = 0; //Variable used to store data received via the serial port
int buttonState;
unsigned long timePress = 0;
unsigned long timePressLimit = 0;
int clicks = 0;
//DEFINITIONS
void setup() {
pinMode(oil_sens, INPUT);
pinMode(signal_on, INPUT); //Define pin inputs and outputs
pinMode(parking_brake, INPUT_PULLUP);
pinMode(braking_ped, INPUT);
pinMode(on_ctrl, OUTPUT);
pinMode(start_ctrl, OUTPUT);
pinMode(acc_ctrl, OUTPUT);
pinMode(flashlights, OUTPUT);
interrupts();
Serial.begin(9600); //Initialize the serial port with a baud rate of 9600
}
//PROGRAM
//Loop function: Wait for a START command to be received (command via serial port or
//voltage applied to signal_on pin)
void loop() {
buttonState = digitalRead(signal_on);
if (buttonState == HIGH) {
delay(500);
Serial.print("Button Pressed: ");
clicks++;
Serial.println(clicks);
if (clicks == 1) {
timePress = millis();
timePressLimit = timePress + 3000;
} else if (clicks == 3 && millis() < timePressLimit) {
Serial.println("Button Pressed 3 Times: Starting");
begin();
timePress = 0;
timePressLimit = 0;
clicks = 0;
}
}
if (clicks <= 2 && timePressLimit != 0 && millis() > timePressLimit) {
Serial.println("Button Pressed 1 or 2 Times");
timePress = 0;
timePressLimit = 0;
clicks = 0;
} else if (Serial.available() > 0) //Check if any serial data is available
{
data = Serial.read(); //Set "data" variable to currently available serial data
check(); //Go to "check" funtion if serial data is available
}
}
//Check function: Test for proper character set from BT
void check() {
if (data == 's') //Check if an "s" has been sent
{
begin(); //Begin start sequence if "s" has been sent
} else {
Serial.println("Invalid Command"); //If anything other than an "s" has been sent, send "Invalid Command" error message
loop(); //Return to beginning of program
}
}
//Begin function: Turn on accessory and ignition
void begin() {
digitalWrite(flashlights, HIGH);
delay(300);
digitalWrite(flashlights, LOW);
p_brake(); //Go to "p_brake" funciton
}
//parking_brake function: Check if the vehicle is on the parking break position.
// Continue if vehicle is on parking breake. Exit start sequence if vehicle is not on the parking break.
void p_brake() {
if (digitalRead(parking_brake) == LOW) //Continue only if vehicle is on parking breake
{
start(); //Start vehicle if on parking breake
} else {
Serial.println("Vehicle Not on Parking Brake"); //If in gear, send "Vehicle Not on Parking Brake" error message
vehicle_off(); //Exit start sequence if not on the parking break
}
}
//Start function: Engage starter only if engine is not already running.
void start() {
digitalWrite(acc_ctrl, HIGH); //Turn accessory OFF
delay(1000);
digitalWrite(on_ctrl, HIGH);
delay(2000); //2 second delay
if (digitalRead(oil_sens) == HIGH)
{
disengage_starter(); //Go to Starter_engaged function
}
else
{
Serial.println("Oil Light is OFF");
vehicle_off();
}
}
//Disengage_starter function: Disengage the starter.
void disengage_starter() {
digitalWrite(start_ctrl, HIGH);
delay(500);
if (digitalRead(oil_sens) == LOW)
{
digitalWrite(start_ctrl, LOW); //Disengage the starter
Serial.println("Engine Running");
digitalWrite(flashlights, HIGH); //Turn flashlights ON
start_time = millis();
vehicle_off_sense(); //Go to vehicle_off_sense function
}
else {
vehicle_off();
}
}
//Vehicle_off_sense function: Waits for an "off" signal to be sent while the engine is running.
//If no "off" signal is received, turns off the vehicle after 10 minutes has elapsed since the engine start.
void vehicle_off_sense() {
if (digitalRead(braking_ped) == HIGH) //Check if braking pedal is pushed
{
Serial.println("Vehicle OFF -- Braking Pedal Pushed"); //Send "Vehicle OFF -- Braking Pedal Pushed" message if braking pedal pushed
vehicle_off(); //Turn vehicle off if braking pedal pushed
} else if (start_time + 600000 < millis()) //Check if 10 minutes has elapsed since engine start
{
Serial.println("Vehicle OFF -- Automatic Timeout"); //Send "Vehicle OFF -- Automatic Timeout" message if engine has been
//running for 10 minutes
vehicle_off(); //Turn vehicle off if engine is running for 10 minutes
} else if (Serial.available() > 0) //Check if a signal has been sent via serial data
{
data = Serial.read(); //Store serial sent serial data
if (data == 'o') //Check if signal sent is an OFF command ("o")
{
Serial.println("Vehicle OFF -- User Commanded"); //Send "Vehicle OFF -- User Commanded" message if serial data is the OFF
//command ("o")
vehicle_off(); //Turn vehicle off if OFF command is sent via serial data
}
} else if (digitalRead(signal_on) == HIGH) //Check if OFF command has been sent via BT module
{
Serial.println("Vehicle OFF -- User Commanded"); //Send "Vehicle OFF -- User Commanded" message if OFF
//command was sent
vehicle_off(); //Turn vehicle off if OFF command was sent via BT module
} else {
vehicle_off_sense(); //Repeat this function if none of the above conditions have been met
}
}
//Vehicle_off function: Turns the vechile off and starts the whole program over
void vehicle_off() {
Serial.println("Vehicle OFF");
digitalWrite(on_ctrl, LOW); //Turn ignition OFF
digitalWrite(acc_ctrl, LOW); //Turn accessory OFF
digitalWrite(start_ctrl, LOW);
digitalWrite(flashlights, LOW); //Turn flashlights OFF
loop(); //Repeat program (look for start command)\
}