#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;
}