Сообщение от
Chip
Спасибо за программу, очень помогла в начале.
Но если пользователь захочет использовать ардуино ещё как-то (а он захочет, т.к. использовать всего один вход из двух десятков это расточительство), то этот код работать нормально не будет.
Нужно оформить данный процесс как стейтмашину, примерно так как сделал я (привожу часть кода для длинного и короткого нажатия):
PHP код:
switch( state )
{
case 0: // nothing pressed
key = decode_button( analogRead( WHEELBUT ) );
if( key > 0 )
{
state = 1;
time = millis();
}
break;
case 1: // key down
if( decode_button( analogRead( WHEELBUT ) ) == key )
{
if( millis() - time > 50 ) { state = 2; time = 0; }
break;
}
state = 0;
key = 0;
time = 0;
break;
case 2: // one press
if( time == 0 )
{
Serial.println( key, DEC );
time = millis();
}
if( decode_button( analogRead( WHEELBUT ) ) == key )
{
if( millis() - time > 250 ) { state = 3; time = 0; }
break;
}
state = 0;
key = 0;
time = 0;
break;
case 3: // key hold (multipress)
if( time == 0 )
{
Serial.println( key, DEC );
time = millis();
}
if( decode_button( analogRead( WHEELBUT ) ) == key )
{
if( millis() - time > 75 ) { state = 3; time = 0; }
break;
}
state = 0;
key = 0;
time = 0;
break;
}
Функция decode_button возвращает ноль если кнопка не нажата, и код кнопки если нажата.
Переменные key, state и time изначально инициализируются нулем.
Меняя константы 50 (время исключения дребезга), 250 (время перед началом повтора), 75 (1000/75=частота повтора) можно настроить реакцию под себя.