Функция при бездействии пользователя через определённый промежуток

qourshi
Offline
Зарегистрирован: 02.03.2021

Хочу сделать такую вещь - при вращении энкодера нечего не будет происходить. Но если эконодер оставить в покое и пройдёт период, то запустится функция. Смотрел, изучал, но не понял как это реализовать.

Библиотека энкодера: GyverEncoder

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Однако, программу писать нада.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Делается таймер, да хоть на миллис, при срабатывании которого запускается нужная тебе функция, таймер при этом останавливается. Каждый тик энкодера перезапускает этот таймер. Таким образом, пока крутишь энкодер, "нечего не будет происходить. Но если эконодер оставить в покое и пройдёт период, то запустится функция"

Смотри, изучай, делай ))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

v258 пишет:

Смотри, изучай, делай ))

Подожди, счас он ношкой топнет...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

DetSimen пишет:

v258 пишет:

Смотри, изучай, делай ))

Подожди, счас он ношкой топнет...

Ждемс )))

qourshi
Offline
Зарегистрирован: 02.03.2021

Пытался что-то подобное сделать, сейчас в новом скетче тестану 

qourshi
Offline
Зарегистрирован: 02.03.2021

qourshi пишет:

Пытался что-то подобное сделать, сейчас в новом скетче тестану 

Что-то не заработало, прилагаю код для профф. юзеров. Запускаются две функции сразу.

static bool lock = false; //флаг для таймера
  enc.tick(); //опрос энкодера
  if(enc.isDouble() ) gmode = !gmode; lock = true; //при двойном клике сменяем функцию и включаем таймер
  if(gmode){ modes(); } //смена функции
  else{ gains(); } //смена функции
  
  if(lock && millis() - looktimer >= 5000){
    gmode = !gmode; // меняем режим
    lock = false; // отключаем флаг для таймера
  }
  if(enc.isTurn()){     //сброс таймера при вращении энкодером 
    looktimer = millis;
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

а почему таймер включается только при двойном клике? В первом сообщении вы писали не так

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

В третьей строке косяк - gmode = !gmode; lock true; должны быть убраны в фигурные скобки, иначе lock true; будет выполняться всегда

qourshi
Offline
Зарегистрирован: 02.03.2021

b707 пишет:

а почему таймер включается только при двойном клике? В первом сообщении вы писали не так

Двойной клик запускает у меня менюшку с кейсами. Обрабатывается она отдельной функцией modes();
А основная менюшка gain(); всегда запущена для использования.

qourshi
Offline
Зарегистрирован: 02.03.2021

Начало работать, но функция modes(); теперь запускается на один тик и всё.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

В 12 строке скобки у миллиса потерял

qourshi
Offline
Зарегистрирован: 02.03.2021

Пришлось добавить сброс таймера еще в enc.isDouble(), и всё заработало.
 

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

qourshi пишет:

Пришлось добавить сброс таймера еще в enc.isDouble(), и всё заработало.
 

Ну да. По хорошему вход в меню как раз и запускает таймер. А для этого поменять флаг мало, нужно еще время зафиксировать