// проект AMF
//#define TIMER_INPUT 5
#define TIMER_MAINS1 5
#define TIMER_MAINS2 5
#define TIMER_COUPLING 10
#define TIMER_GEN 3
#define PERIOD1 3
uint32_t tmr0 = 0;
uint32_t tmr1 = 0;
uint32_t tmr2 = 0;
uint32_t tmr3 = 0;
uint32_t tmr4 = 0;
uint32_t tmr5 = 0;
uint32_t tmr6 = 0;
uint32_t tmr7 = 0;
bool flagM0 = false;
bool flagM1 = false;
bool flagM2 = false;
bool flagM3 = false;
bool flagM4 = false;
bool flagM5 = false;
bool flagM6 = false;
bool flagM7 = false;
bool flagM8 = false;
bool flagM9 = false;
byte PinsInput [] = {27, 13, 19};
byte PinsOutput [] = {32, 33, 25, 26};
byte status[3];
int stat = 0;
int flag[3];
int Fun_state (int var1, int var2, int var3);
void setup() {
for (int i = 0; i < sizeof(PinsInput); i++) {
pinMode(PinsInput[i], INPUT_PULLUP);
status[i] = !digitalRead(PinsInput[i]);
flag[i] = status[i];
}
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; // секунды
for (int i = 0; i < sizeof(PinsInput); i++) {
status[i] = !digitalRead(PinsInput[i]);
flag[i] = status[i];
Serial.print("Flag - ");
Serial.print(i+1);
Serial.print(" - ");
Serial.print(flag[i]);
Serial.println();
}
stat = Fun_state(flag[0], flag[1], flag[2]);
//for (int i = 0; i < sizeof(status); i++) {
// Serial.print("Flag - ");
// Serial.print(i+1);
// Serial.print(" - ");
// Serial.print(flag[i]);
// Serial.println();
//}
if (stat == 1) {
flagM2 = false; //stat 2
tmr2 = sec;
flagM3 = false;
tmr3 = sec;
flagM4 = false; //stat 3
tmr4 = sec;
flagM5 = false;
tmr5 = sec;
flagM6 = false; //stat 4
tmr6 = sec;
flagM7 = false;
tmr7 = sec;
Serial.print("Active- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
if (!flagM0 && sec - tmr0 >= TIMER_MAINS1) {
flagM0 = true;
digitalWrite(PinsOutput[0], HIGH);
}
if (!flagM1 && sec - tmr1 >= TIMER_MAINS2) {
flagM1 = true;
digitalWrite(PinsOutput[1], HIGH);
}
}
else if (stat == 2) {
flagM0 = false; //stat 1
tmr0 = sec;
flagM1 = false;
tmr1 = sec;
flagM4 = false; //stat 3
tmr4 = sec;
flagM5 = false;
tmr5 = sec;
flagM6 = false; //stat 4
tmr6 = sec;
flagM7 = false;
tmr7 = sec;
Serial.print("Active- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[3], LOW);
if (flagM8 && !flagM9) {
digitalWrite(PinsOutput[2], LOW);// выполнить действие
flagM8 = false;
}
if (!flagM2 && sec - tmr2 >= TIMER_MAINS1) {
flagM2 = true;
digitalWrite(PinsOutput[0], HIGH);
}
if (!flagM3 && sec - tmr3 >= TIMER_COUPLING) {
flagM3 = true;
digitalWrite(PinsOutput[2], HIGH);
}
flagM9 = true;
}
else if (stat == 3) {
flagM0 = false; //stat 1
tmr0 = sec;
flagM1 = false;
tmr1 = sec;
flagM2 = false; //stat 2
tmr2 = sec;
flagM3 = false;
tmr3 = sec;
flagM6 = false; //stat 4
tmr6 = sec;
flagM7 = false;
tmr7 = sec;
Serial.print("Active- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[3], LOW);
if (flagM8 && !flagM9) {
digitalWrite(PinsOutput[2], LOW);// выполнить действие
flagM8 = false;
}
if (!flagM4 && sec - tmr4 >= TIMER_MAINS2) {
flagM4 = true;
digitalWrite(PinsOutput[1], HIGH);
}
if (!flagM5 && sec - tmr5 >= TIMER_COUPLING) {
flagM5 = true;
digitalWrite(PinsOutput[2], HIGH);
}
flagM9 = true;
}
else if (stat == 4) {
flagM0 = false; //stat 1
tmr0 = sec;
flagM1 = false;
tmr1 = sec;
flagM2 = false; //stat 2
tmr2 = sec;
flagM3 = false;
tmr3 = sec;
flagM4 = false; //stat 3
tmr4 = sec;
flagM5 = false;
tmr5 = sec;
Serial.print("Active- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
if (!flagM8 && flagM9) {
digitalWrite(PinsOutput[2], LOW);// выполнить действие
flagM9 = false;
}
if (!flagM6 && sec - tmr6 >= TIMER_GEN) {
flagM6 = true;
digitalWrite(PinsOutput[3], HIGH);
}
if (!flagM7 && sec - tmr7 >= TIMER_COUPLING) {
flagM7 = true;
digitalWrite(PinsOutput[2], HIGH);
}
flagM8 = true;
}
else {
flagM0 = false; //stat 1
tmr0 = sec;
flagM1 = false;
tmr1 = sec;
flagM2 = false; //stat 2
tmr2 = sec;
flagM3 = false;
tmr3 = sec;
flagM4 = false; //stat 3
tmr4 = sec;
flagM5 = false;
tmr5 = sec;
flagM6 = false; //stat 4
tmr6 = sec;
flagM7 = false;
tmr7 = sec;
flagM8 = false;
flagM9 = false;
Serial.print("Active- ");
Serial.print(stat);
Serial.println();
digitalWrite(PinsOutput[0], LOW);
digitalWrite(PinsOutput[1], LOW);
digitalWrite(PinsOutput[2], LOW);
digitalWrite(PinsOutput[3], LOW);
}
}
int Fun_state (int var1, int var2, int var3) {
int var4;
if (var1 == HIGH && var2 == HIGH) {
var4 = 1;
}
else if (var1 == HIGH && var2 == LOW) {
var4 = 2;
}
else if (var1 == LOW && var2 == HIGH) {
var4 = 3;
}
else if (var1 == LOW && var2 == LOW && var3 == HIGH) {
var4 = 4;
}
else var4 = 0;
return var4;
}
//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;
*/