// проект AMF
#define TIMER_INPUT 5
#define TIMER_MAINS 15
#define TIMER_GEN 15
#define TIMER_STARTER 7
#define TIMER_AIR 10
#define STARTUP_ATTEMPT 3
#define REST_START 5
uint32_t tmr_input = 0;
uint32_t tmr_mains = 0;
uint32_t tmr_gen = 0;
uint32_t tmr_starter = 0;
uint32_t tmr_air = 0;
uint32_t tmr_rest = 0;
uint32_t tmr6 = 0;
uint32_t tmr7 = 0;
bool flagM0 = false; // mains
bool flagM1 = false; // gen
bool flagM2 = false; // oil
bool flagM3 = false; // manual
bool flagM4 = false;
bool flagM5 = false;
bool flagM6 = false;
bool flagM7 = false;
bool flagM8 = false;
bool flag_Alarm; // reset
bool flag_Alarm_2 = false; //reset flag
#define Fuel 35
byte PinsInput [] = {13, 18, 19, 26, 4}; // mains_v, gen_v, oil, reset, manual
byte PinsOutput [] = {25, 23, 27, 32, 33}; //mains, gen, ignition, starter, air
int fuel_l = 0;
int stat = 0;
int flag[5]; //flag - 0 mains, flag - 1 gen, flag - 2 oil, flag - 3 reset
int Fun_state (int var1, int var2, int var3); //var1 - mains, var2 - gen, var3 - oil
int starts;
//int Pin_Input_Set ();
//int Pin_Output_Set ();
void setup() {
//Pin_Input_Set ();
for (int i = 0; i < sizeof(PinsInput); i++) {
pinMode(PinsInput[i], INPUT_PULLUP);
flag[i] = !digitalRead(PinsInput[i]);
//flag[i] = status[i];
}
pinMode(Fuel, INPUT);
//Pin_Output_Set ();
for (int i = 0; i < sizeof(PinsOutput); i++) {
pinMode(PinsOutput[i], OUTPUT);
digitalWrite(PinsOutput[i], LOW);
}
Serial.begin(9600);
}
void loop() {
uint32_t sec = millis() / 1000ul; // полное количество секунд
int timeHours = (sec / 3600ul); // часы
int timeMins = (sec % 3600ul) / 60ul; // минуты
int timeSecs = (sec % 3600ul) % 60ul; // секунды
fuel_l = analogRead(Fuel);
Serial.print("Fuel - ");
Serial.print(stat);
Serial.println();
Serial.println(starts);
if (flag[4]) {
Serial.println("Manual mode");
}
for (int i = 0; i < sizeof(PinsInput); i++) {
flag[i] = !digitalRead(PinsInput[i]);
//flag[i] = status[i];
Serial.print("Flag - ");
Serial.print(i+1);
Serial.print(" - ");
Serial.print(flag[i]);
Serial.println();
}
if (flag[3]) {
flag_Alarm_2 = true;
Serial.print("Reset - ");
Serial.println(flag[3]);
}
stat = Fun_state(flag[0], flag[1], flag[2]);
switch (stat) {
case 1:
if (sec - tmr_input >= TIMER_INPUT) {
tmr_gen = sec;
tmr_starter = sec;
tmr_air = sec;
tmr_rest = sec;
Serial.print("Active-mains-true, gen-false- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[1], LOW);
if (flag[0] && sec - tmr_mains >= TIMER_MAINS) {
digitalWrite(PinsOutput[0], HIGH);
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
digitalWrite(PinsOutput[4], LOW);
}
tmr_input = sec;
//tmr0 = sec;
}
break;
case 2:
if (sec - tmr_input >= TIMER_INPUT) {
tmr_gen = sec;
tmr_starter = sec;
tmr_air = sec;
tmr_rest = sec;
Serial.print("Active-mains-true, gen-true- ");
Serial.print(stat);
Serial.println();
if (flag[4]) {
digitalWrite(PinsOutput[1], LOW);
Serial.println("Manual mode");
}
//tmr0 = sec;
if (flag[0] && sec - tmr_mains >= TIMER_MAINS) {
digitalWrite(PinsOutput[0], HIGH);
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
digitalWrite(PinsOutput[4], LOW);
}
tmr_input = sec;
}
break;
case 3:
if (sec - tmr_input >= TIMER_INPUT) {
tmr_mains = sec;
tmr_starter = sec;
tmr_air = sec;
tmr_rest = sec;
Serial.print("Active-mains-false, gen-true- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
if (sec - tmr_gen >= TIMER_GEN) {
if (flag[4] ) {
digitalWrite(PinsOutput[1], HIGH);
Serial.println("Manual mode");
}
digitalWrite(PinsOutput[1], HIGH);
}
tmr_input = sec;
}
break;
case 4:
if (sec - tmr_input >= TIMER_INPUT) {
tmr_mains = sec;
tmr_gen = sec;
tmr_starter = sec;
tmr_air = sec;
tmr_rest = sec;
Serial.print("Active-Start Atempt - ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
//if (starts < STARTUP_ATTEMPT && flag[3] == HIGH) {
// starts ++;
// digitalWrite(PinsOutput[2], HIGH); // Ignition On
if (flag_Alarm_2 && starts <= STARTUP_ATTEMPT) {
Serial.println("No Alarm");
//for (int i = 0; i <= STARTUP_ATTEMPT; i++) {
//if (!flag[2]) {
Serial.println("Oil Ok");
digitalWrite(PinsOutput[2], HIGH); // Ignition On
delay(1000);
//if (sec - tmr2 >= REST_START) {
digitalWrite(PinsOutput[4], HIGH); // Air On
digitalWrite(PinsOutput[3], HIGH); // Starter On
delay(7000);
//if (flag[1] || sec - tmr3 >= TIMER_STARTER) {
digitalWrite(PinsOutput[3], LOW);
delay(200);
Serial.println("atempts");
starts ++;
}
//tmr_input = sec;
}
else {
flag_Alarm_2 = false;
Serial.print("Alarm - ");
Serial.println(flag_Alarm);
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
digitalWrite(PinsOutput[4], LOW);
}
break;
case 0:
if (sec - tmr_input >= TIMER_INPUT) {
tmr_input = sec;
tmr_mains = sec;
tmr_gen = sec;
tmr_starter = sec;
tmr_air = sec;
tmr_rest = sec;
Serial.print("Active - Default - ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
digitalWrite(PinsOutput[4], LOW);
}
break;
default:
if (sec - tmr_input >= TIMER_INPUT) {
tmr_input = sec;
tmr_mains = sec;
tmr_gen = sec;
tmr_starter = sec;
tmr_air = sec;
tmr_rest = sec;
Serial.print("Active - Default - ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
digitalWrite(PinsOutput[4], LOW);
}
break;
}
}
int Fun_state (int var1, int var2, int var3) {
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;
}
/*
int Pin_Input_Set () {
for (int i = 0; i < sizeof(PinsInput); i++) {
pinMode(PinsInput[i], INPUT_PULLUP);
status[i] = !digitalRead(PinsInput[i]);
flag[i] = status[i];
}
}
int Pin_Output_Set () {
for (int i = 0; i < sizeof(PinsOutput); i++) {
pinMode(PinsOutput[i], OUTPUT);
digitalWrite(PinsOutput[i], LOW);
}
}
*/
//for (int i = 0; i < INPUTS; i++) {
// pinMode(pins[mains1 + i], INPUT_PULLUP);
// pinMode(pins[Mains_br_1 + i], OUTPUT);
// digitalWrite(pins[Mains_br_1 + i], LOW);
//}
/*uint32_t tmr; Таймер, который после срабатывания переключает период на другой, например включаем реле на 10 секунд каждые 60 минут
bool flag;
#define period1 10*1000L
#define period2 60*60*1000L
void setup() {
}
void loop() {
if (millis() - tmr >= (flag ? period1 : period2)) {
tmr = millis();
flag = !flag;
// ваш код
}
//Serial.print("Flag - " + status[i] + flag[i]);
//status[i] = status[i++];
//flag[i] = flag[i++];
}
*/
//Serial.print("Active state - ");
//Serial.print(stat);
//Serial.println();
/*
if (sec - tmr >= (flag8 ? TIMER_INPUT : TIMER_MAINS1)) {
flag8 = !flag8;
tmr = sec;
digitalWrite(PinsOutput[0], flag8);
}*/
/*
if (!digitalRead(MAINS1)) { // ищем разницу
uint32_t tmr = 0;
millis() - tmr >= TIMER_INPUT;
flag1 = 1;
tmr = millis();
}
else flag1 = 0;
*/