/*************************************
Glow Plug Controller Software
Written by Robert Calhoun
Contributions Joseph Shumaker
07/10/2023
* ***********************************
https://forum.arduino.cc/t/while-loop-and-timer-advice/1202439/11?u=davex
*/
#include <Arduino.h>
const int temperaturePin = A0;
const int alternatorPin = A1;
const int starterPin = A2;
const int relayControlPin = 6;
const bool VERBOSE = true;
bool preglowComplete = false; // Flag to indicate if pre-glow sequence is complete
bool starterglowComplete = false; // Flag to indicate if starter-glow sequence is complete
bool afterglowComplete = false; // Flag to indicate if after-glow sequence is complete
int relayOnTime = 0; // Variable to hold the relay "on" time
float calculateVoltage(int sensorValue) {
float voltage = sensorValue * (3.3 / 1024.0); // Convert the analog value to voltage
return voltage;
}
void setup() {
pinMode(relayControlPin, OUTPUT);
pinMode(starterPin, INPUT_PULLUP);
pinMode(alternatorPin, INPUT_PULLUP);
if (VERBOSE)Serial.begin(115200);
}
void loop() {
//------------------------------------------------------------------------------
if (!preglowComplete) {
float voltage = calculateVoltage(analogRead(temperaturePin));
// Check if voltage is within valid range for temperature sensor
if (voltage >= 0.0 && voltage <= 3.2) {
// Switch case statement based on voltage ranges
switch (int(voltage * 100)) {
case 282 ... 320:
relayOnTime = 24;
break;
case 208 ... 281:
relayOnTime = 16;
break;
case 123 ... 207:
relayOnTime = 10;
break;
default:
relayOnTime = 0;
break;
}
// Activate the relay circuit with the calculated relayOnTime
if (VERBOSE)Serial.println("delay 500");
delay(500);
if (VERBOSE)Serial.println("relay on");
digitalWrite(relayControlPin, HIGH);
delay(relayOnTime * 1000);
if (VERBOSE)Serial.println("relay off");
digitalWrite(relayControlPin, LOW);
if (VERBOSE)Serial.println("preglow complete true 1");
preglowComplete = true;
} else {
// Failsafe warning signal, if we lose temp sensor(R2), voltage 3.3v
for (int i = 0; i < 5; i++) {
if (VERBOSE)Serial.println("failsafe relay on");
digitalWrite(relayControlPin, HIGH);
delay(1000);
if (VERBOSE)Serial.println("failsafe relay off");
digitalWrite(relayControlPin, LOW);
delay(2000);
}
if (VERBOSE)Serial.println("failsafe relay on");
digitalWrite(relayControlPin, HIGH);
delay(10000);
if (VERBOSE)Serial.println("failsafe relay off");
digitalWrite(relayControlPin, LOW);
preglowComplete = true;
if (VERBOSE)Serial.println("preglow complete true 2");
}
}
//----------------------------------------------------------------------------
// Starter signal detected, activate the relay control pin
if ((!starterglowComplete) && (digitalRead(starterPin)) == HIGH) {
delay(250);
if (VERBOSE)Serial.println("relay on for starter");
digitalWrite(relayControlPin, HIGH);
if (digitalRead(starterPin) == LOW) {
if (VERBOSE)Serial.println("relay off for starter");
digitalWrite(relayControlPin, LOW);
starterglowComplete = true; // Exit starter-glow mode
if (VERBOSE)Serial.println("starterglowComplete = true");
}
}
//-----------------------------------------------------------------------------
// Alternator signal detected, engine has started
if ((!afterglowComplete) && (digitalRead(alternatorPin)) == HIGH) {
if (VERBOSE)Serial.println("afterglow? ");
float voltage = calculateVoltage(analogRead(temperaturePin)); // Read temp sensor
if (voltage > 1.23) { // Check if temperature less the 140*F
delay(250);
if (VERBOSE)Serial.println("relay on for afterglow");
digitalWrite(relayControlPin, HIGH); // If temp less then 140*F, turn relay on for xx-sec
delay(5000);
if (VERBOSE)Serial.println("relay off for afterglow");
digitalWrite(relayControlPin, LOW);
afterglowComplete = true; // Exit after-glow mode
if (VERBOSE)Serial.println("afterglow complete");
}
}
//-------------------------------------------------------------------------------
}
// Program Complete