А мне показалось более удобным что вроде идеи Деда из #38 только без цикла как такового, считать количество попыток в 10 миллисекундном прерывании таймера.
типа
volatile byte key=0;
.....
static byte k1cnt;
if (k1cnt > 4) {if (digitalRead(but1) == 0) {k1cnt++; if (k1cnt> 120) {k1cnt-=20;key=1;};}
else {if (k1cnt > 5) key=1; if ((k1cnt > 60) & (k1cnt< 120) )key=5; k1cnt=0;};}
else if (digitalRead(but1) == 0) k1cnt++;
Логика - если более 50 мс имеем замкнутую кнопку отдаем в глобальной переменной key значение короткого нажатия, после использования в основном теле программы key обнуляем. Если кнопка нажата более 600 мс и меньше 1200 мс отдаём значение длинного нажатия. Если кнопка удерживается более 1200 мс пулемётом выдаёт короткое нажатие каждые 200 мс.