Если удерживать кнопку, то срабатывает лишний hold

Всем привет.

Написал код, mode_display_time() - отображение времени, если подержать кнопку (isHold()) - тогда переходим в функцию setup_time() настройка времени. А после еще одного клика butt4.isClick() переходим в основное меню. и так это все работает.

Но если в функции setup_time() - isClick() меняю на isHold(), то не срабатывают прерывания или слишком быстро все срабатывает и получается я проскакиваю setup_time() - выходя в основное меню, а по логике подержал кнопку 1 раз, потом настроил часы и для сохранения подержать надо еще раз.

Пробовал добавлять setTimeout(1000); и в первой функции и второй - не помогает, проскакивает. Почему с 2 -я hold не работает как надо??? Спасибо

void mode_display_time(){
//Здесь отображение времени
...........................


butt4.setTimeout(1000);
if (butt4.isHold()){tone(SPEAKER, 1000, 200); delay(200); tone(SPEAKER, 1500, 200); setnumMenu = 1;} // переход в настройку часов удержание кнопки SET
}


// Настройка основных часов - прибавить 1 час, прибавить минуты.

void setup_time(){
//настройка времени
...........................


if (butt4.isHold()) {tone(SPEAKER, 1000, 400); numMenu = 1; setnumMenu = 0; }; // выход в основное меню
}


void loop(){
//Чтение из rtc
//Чтение кнопок
..........


switch(numMenu)
{
case 0: if ((numMenu == 0 ) && (setnumMenu == 0)) { display_digits_off(); } break; // выключить дисплей
case 1: if ((numMenu == 1 ) && (setnumMenu == 0)) { mode_display_time(); } break; // настройка времени
case 2: if ((numMenu == 2 ) && (setnumMenu == 0)) { onHourRelay(); } break; // настройка "часа" включения реле
case 3: if ((numMenu == 3 ) && (setnumMenu == 0)) { offHourRelay(); } break; // настройка "часа" выключения реле
}

if ((numMenu == 1 ) && (setnumMenu == 1)) { setup_time(); }
if ((numMenu == 2 ) && (setnumMenu == 2)) { editOnHourRelay(); }
if ((numMenu == 3 ) && (setnumMenu == 3)) { editOffHourRelay(); }


if (butt1.isClick()) {tone(SPEAKER, 1000, 10); numMenu = numMenu + 1; if (numMenu > 3) {numMenu = 0;}} // меню 1 показать время - Нажата кнопка MODE
}

Потому что ты входишь в функцию уже с событием isHold у кнопки butt4, вот оно и срабатывает.
Так что - как написал, так оно и работает.
Нужно сбрасывать событие сразу после вхождения в функцию mode_display_time() или менять логику работы.

1 лайк