Пауза на millis, не могу реализовать

доброго дня. сделал эмулятор клавиатуры на nano. суть в том что бы по нажиманию кнопки, ардуинка эмулировала ряд нажатий клавиш клавиатуры (как макрос). в целом успех получен, устройство работает но скетч написан с помощью delay. это в принципе мой первый опыт с ардуино и программированием. проблема в том что иногда программа не срабатывает вообще или не срабатывает полностью. мне кажется это связано с delay. своего ума как заменить на millis мне не хватает, все примеры в сети на светодиодах, работают постоянно и циклично. а мне нужно чтобы только по нажатию. я не прошу сделать за меня, я прошу у сообщества подсказку, как заменить delay на millis.

#include <EasyHID.h>
#include <GyverButton.h>

GButton btn0 (7,HIGH_PULL, NORM_OPEN);

void setup() {
  HID.begin();
  btn0.setDebounce(60); // антидребезг
  btn0.setTimeout(600); //таймаут зажатия

}

void loop() {
  btn0.tick();

if (btn0.isSingle()){ // одиночное нажатие кнопки

  Keyboard.click(KEY_F12);
  delay(60);
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.click(KEY_TAB);
  Keyboard.releaseAll();   
  delay(60);
  Keyboard.click(KEY_F12);
  delay(60);
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.click(KEY_TAB);
  Keyboard.releaseAll();

}
if (btn0.isHolded()){ //удерживание кнопки
   Keyboard.click(KEY_F11);
  delay(60);
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.click(KEY_TAB);
  Keyboard.releaseAll();   
  delay(60);
  Keyboard.click(KEY_F11);
  delay(60);
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.click(KEY_TAB);
  Keyboard.releaseAll();
}
if (btn0.isDouble()){  //двойное нажатие кнопки
   Keyboard.click(KEY_F10);
  delay(60);
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.click(KEY_TAB);
  Keyboard.releaseAll();   
  delay(60);
  Keyboard.click(KEY_F10);
  delay(60);
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.click(KEY_TAB);
  Keyboard.releaseAll();
}
HID.tick();
}

за основу взял библиотеки алекса гайвера HID устройства и использования кнопки. через монитор порта подобрал оптимальные значения антидребезга и задержки между кликами для определения зажатия. в идеале нужно было сделать что бы после альтаба delay был больше, чтобы комп успевал отработать, но тогда скетч практически не срабатывал

1 лайк

это чё такое?
подсказка - ёёё

1 лайк

спасибо, исправил

вот имено здесь на форуме миллион записей по этому вопросу-ищите и обрящете

Не вижу смысла в такой программе заменять delay(). Зачем?

Там везде условия не те, у людей скетч работает постоянно в цикле, у меня по кнопке. Если ткнете меня в подходящую тему то буду только признателен

Работает, но не стабильно. Через какое то время начинаются глюки, то срабатывает через промежуток времени (2-5 сек), то не срабатывает вовсе, то может сработать но только частично

Ваш пример довольно сложен для начального знакомства с заменой delay.
Для “нормальной” работы надо понимать какие задержки на что влияют, где они допустимы, а где нет.
Например в описании библиотеки EasyHID.h написано,
HID.tick(); // Поллинг шины (вызывать не реже, чем раз в 10мс)
У вас же в коде много delay(60); и тем не менее, как вы пишите, все равно как то работает.

Если ошибки связаны с редким вызовом HID.tick(); , то можно попробовать добавить в скетч функцию
void yield() {
HID.tick();
}
Тогда HID.tick(); будет дополнительно вызываться во время delay().

Подскажите пожалуйста, по логике если нажатия кнопки не было, то и цикл не должен заходить в те ветви где есть delay? И по той же логике опрос кнопки не должен попадать в те моменты когда идёт delay? Или все равно каким то образом эти паузы отрабатываются даже без нажатия кнопки?

Не должны.

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