// проект AMF
#define TIMER_INPUT 8
#define TIMER_GEN 8
#define TIMER_ALARM 4
#define STARTUP_ATTEMPT 2
#define TIMER_STARTER 7
#define TIMER_AIR 5
#define Fuel 35
//#define TIMER_REST 5
uint32_t tmr_input = 0;
uint32_t tmr_alarm = 0;
uint32_t tmr_gen = 0;
uint32_t tmr_starter = 0;
uint32_t tmr_air = 0;
//uint32_t tmr_rest = 0;
bool Reset_Alarm; // reset
bool Starts_Alarm = true; //reset flag
bool Flag_case_1 = true;
//bool Flag_case_3 = true;
bool Flag_case_4 = true;
bool flag_start_del = true;
byte PinsInput [] = {13, 18, 19}; // mains_v, gen_v, reset, , 19, 26, 4,
byte PinsOutput [] = {25, 23, 27, 32}; //ignition, starter, air, , 32, 33
int flag[3]; //flag - 0 mains, flag - 1 gen, flag - 2 reset
int Fun_state (); //var1 - mains, var2 - gen, var3 - reset
int starts;
int fuel_l = 0;
int stat = 0;
void setup() {
for (int i = 0; i < sizeof(PinsInput); i++) {
pinMode(PinsInput[i], INPUT_PULLUP);
flag[i] = !digitalRead(PinsInput[i]);
}
pinMode(Fuel, INPUT);
for (int i = 0; i < sizeof(PinsOutput); i++) {
pinMode(PinsOutput[i], OUTPUT);
digitalWrite(PinsOutput[i], LOW);
}
Serial.begin(9600);
}
void loop() {
fuel_l = analogRead(Fuel);
fuel_l = map (fuel_l, 0, 4095, 0, 100);
Serial.print("Fuel - ");
Serial.print(fuel_l);
Serial.print(" %");
Serial.println();
for (int i = 0; i < sizeof(PinsInput); i++) {
flag[i] = !digitalRead(PinsInput[i]);
Serial.print("Flag - ");
Serial.print(i+1);
Serial.print(" - ");
Serial.print(flag[i]);
Serial.println();
}
uint32_t sec = millis() / 1000ul; // mills to seconds
stat = Fun_state(flag[0], flag[1]);
if (flag[2] && sec - tmr_alarm >= TIMER_ALARM) {
Serial.println("Reset Alarm ");
digitalWrite(PinsOutput[3], LOW);
Flag_case_4 = true;
starts = 0;
Starts_Alarm = true;
//tmr_alarm = sec;
}
switch (stat) {
case 1:
case 2:
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
if (Flag_case_1 && sec - tmr_input >= TIMER_INPUT) {
Serial.print("Active-mains-YES, gen-NO or YES, stat- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
Flag_case_1 = false;
starts = 0;
//tmr_input = sec;
}
Flag_case_4 = true;
tmr_alarm = sec;
tmr_gen = sec;
tmr_air = sec;
tmr_starter = sec;
break;
/*case 2:
Serial.print("Active-mains-YES, gen-YES, stat - ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
starts = 0;
break; */
case 3:
delay (100);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
Serial.print("Active-mains-NO, gen-YES, stat - ");
Serial.print(stat);
Serial.println();
Flag_case_1 = true;
Flag_case_4 = true;
tmr_input = sec;
tmr_alarm = sec;
tmr_gen = sec;
tmr_air = sec;
tmr_starter = sec;
tmr_rest = sec;
//digitalWrite(PinsOutput[0], LOW);
//digitalWrite(PinsOutput[1], LOW);
//digitalWrite(PinsOutput[2], LOW);
//starts = 0;
break;
case 4:
if (Flag_case_4 && sec - tmr_gen >= TIMER_GEN) {
Serial.print("Active-mains-NO, gen-NO, stat - ");
Serial.print(stat);
Serial.println();
Serial.print("Active-Start Atempt - ");
Serial.print(starts);
Serial.println();
if (!flag[1] && Starts_Alarm && starts <= STARTUP_ATTEMPT) {
Serial.println("No Alarm for start");
digitalWrite(PinsOutput[0], HIGH); // Ignition On
digitalWrite(PinsOutput[2], HIGH); // Air On
if (flag_start_del && sec - tmr_air >= TIMER_AIR) {
delay (100);
Serial.println("READY START");
tmr_starter = sec;
//tmr_air = sec;
flag_start_del = false;
digitalWrite(PinsOutput[1], HIGH); // Starter On
}
if (!flag_start_del && sec - tmr_starter >= TIMER_STARTER) {
delay (100);
Serial.println("REST");
//tmr_starter = sec;
tmr_air = sec;
digitalWrite(PinsOutput[1], LOW);
starts ++;
//tmr_starter = sec;
flag_start_del = true;
}
//tmr_air = sec;
Serial.println("atempts");
//starts ++;
}
else {
Starts_Alarm = false;
Flag_case_4 = false;
tmr_starter = sec;
tmr_air = sec;
Serial.print("Alarm - Starts atemps full");
Serial.println();
digitalWrite(PinsOutput[3], HIGH);
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
}
//tmr_starter = sec;
//tmr_air = sec;
}
Flag_case_1 = true;
tmr_input = sec;
break;
case 0:
default:
delay (100);
Serial.print("Active - Default");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
Flag_case_1 = true;
Flag_case_4 = true;
tmr_input = sec;
tmr_alarm = sec;
tmr_gen = sec;
tmr_air = sec;
tmr_starter = sec;
break;
/*default:
if (sec - tmr_input >= TIMER_INPUT) {
Serial.print("Active - Default - ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
}
break; */
}
}
int Fun_state (int var1, int var2) {
int var4;
if (var1 == HIGH && var2 == LOW) {
var4 = 1;
}
else if (var1 == HIGH && var2 == HIGH) {
var4 = 2;
}
else if (var1 == LOW && var2 == HIGH) {
var4 = 3;
}
else if (var1 == LOW && var2 == LOW) {
var4 = 4;
}
else var4 = 0;
return var4;
}