#include <Arduino.h>
#include <GyverOS.h>
GyverOS<2> OS;  // указать макс. количество задач
#define verh 27
#define niz 14
volatile uint32_t timerDREBIZG;
uint32_t timerOUT;
uint32_t timerANIMATstup;
uint32_t timerANIMATlest;
volatile bool intFlagN = false;// срабатывание датчика низ
volatile bool intFlagV = false;// срабатывание датчика верх
 bool DEYSTVIEflag = false;//включаем 1 или выключаем 0
 bool ANIMALflag = false;// крутим анимацыю 1 или ни чего ни делаем 0
  bool NVflag = false;// какой датчик сработал последним тоесть фексируем направление низ 0 верх 1


#define kolSTUPEN 16 //количество ступенек
#define kolLEDS 47 //количество светодиодов на одной ступеньке
#define KOLkadrov 10 //количество кадров uint8_t
#define vremyaKADRA 100 //время кадра в милисекундах
#define vremyaPEREKL 400 //время перехода по ступенькам милисекундах
#define vremaAKTIVNOSTI 10000 // через сколько тушим




void IRAM_ATTR PreyvanV() {
    detachInterrupt(verh);
    timerDREBIZG=millis();
    intFlagV=true;
}
void IRAM_ATTR PreyvanN() {
    detachInterrupt(niz);
    timerDREBIZG=millis();
    intFlagN=true;
}
void AnimalLESTNICA();


void setup() {
Serial.begin(115200);
 pinMode(2, OUTPUT);
  // подключаем задачи (порядковый номер, имя функции, период в мс)
  OS.attach(0, AnimalLESTNICA, vremyaPEREKL);
 attachInterrupt(verh, PreyvanV, RISING);
 attachInterrupt(niz ,PreyvanN, RISING);
}




void loop() {
  OS.tick();  // вызывать как можно чаще, задачи выполняются здесь
  if((intFlagN || intFlagV) && (millis()-timerDREBIZG>100)){ // если сработал датчик
if(intFlagV){
   intFlagV=false; //если верхний
   Serial.println("включаем с верху вниз");
   attachInterrupt(verh, PreyvanV, RISING);
   NVflag=1;
  }else{          // иначе нижний
    intFlagN=false;
   Serial.println("включаем с низу в верх");
   attachInterrupt(niz, PreyvanN, RISING);
   NVflag=0;
  }
  ANIMALflag=true;
  DEYSTVIEflag=true;
   timerOUT=millis();
  }
  if(DEYSTVIEflag && (millis()-timerOUT > vremaAKTIVNOSTI ) ){  
    Serial.print("выключаем ");
    ANIMALflag=true;
    DEYSTVIEflag=false;
    if(NVflag) {Serial.println("в низ");} else {Serial.println("в верх");}
  }


}
void AnimalLESTNICA() {
  static bool n_flag;
  static bool v_flag;
  static uint8_t n=0;
  static uint8_t v=kolSTUPEN-1;
  if(!ANIMALflag)return;
  if(NVflag)v_flag=true; else n_flag=true;
 
   Serial.print(n);
  Serial.print("\t");  // табуляция
  Serial.println(v);
  if (n==v){
      n=0;
      v=kolSTUPEN-1;
      ANIMALflag=false;
      n_flag=false;
      v_flag=false;
      return;
    }
    if(v>n && v_flag)v--;  
    if(n<v && n_flag)n++;
   
  return;
}