// проект AMF
//#include <TM1637.h>
//const int CLK = 2;
//const int DIO = 3;
//TM1637 tm(CLK, DIO);
const float BETA = 3950;
#define TIMER_INPUT 5
#define TIMER_GEN 8
#define TIMER_ALARM 7
#define STARTUP_ATTEMPT 2
#define TIMER_STARTER 5
#define TIMER_AIR 7
#define Fuel 35
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;
bool Reset_Alarm; // reset
bool Starts_Alarm = true; //reset flag
bool Flag_case_1 = true;
bool Flag_case_4 = true;
bool flag_start_del = true;
bool last_reset = false;
bool btn_state = false;
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);
uint32_t sec = millis() / 1000ul;
tmr_input = sec;
tmr_alarm = sec;
tmr_gen = sec;
tmr_air = sec;
tmr_starter = sec;
}
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();
int analogValue = analogRead(Fuel);
float celsius = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
Serial.print("Temperature: ");
Serial.print(celsius);
Serial.println(" ℃");
delay(100);
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]);
btn_state = flag[2];
if (flag[2] && !Starts_Alarm && sec - tmr_alarm >= TIMER_ALARM) {
if (btn_state && !last_reset) {
Serial.println("Reset Alarm ");
digitalWrite(PinsOutput[3], LOW);
last_reset = true;
Flag_case_4 = true;
starts = 0;
Starts_Alarm = true;
tmr_air = sec;
tmr_starter = sec;
//tmr_alarm = sec;
}
}
if (!btn_state && last_reset) {
last_reset = false;
//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;
}
Flag_case_4 = true;
//Starts_Alarm = true;
starts = 0;
//tmr_alarm = sec;
tmr_gen = sec;
tmr_air = sec;
tmr_starter = sec;
break;
case 3:
digitalWrite(PinsOutput[0], HIGH); // Ignition On
digitalWrite(PinsOutput[1], LOW); // Air off
digitalWrite(PinsOutput[2], LOW); // starter off
//delay(100);
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;
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
delay(1000);
if (flag_start_del && sec - tmr_air >= TIMER_AIR) {
Serial.println("REST READY");
tmr_starter = sec;
flag_start_del = false;
digitalWrite(PinsOutput[1], HIGH); // Starter On
}
if (!flag_start_del && sec - tmr_starter >= TIMER_STARTER) {
Serial.println("STARTED");
tmr_air = sec;
flag_start_del = true;
digitalWrite(PinsOutput[1], LOW); // starter off
starts ++;
}
}
else {
Starts_Alarm = false;
Flag_case_4 = false;
tmr_starter = sec;
tmr_air = sec;
tmr_alarm = 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);
}
}
Flag_case_1 = true;
tmr_input = sec;
break;
case 0:
default:
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;
}
}
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;
}