// проект 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; 
        */
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module