Один из первых моих проектов на Arduino. Устройство предназначено для использования совместно с ПК или планшетом, для расширения возможностей стандартной клавиатуры.
Резистивные кнопки подключаются к аналоговому входу A0, при нажатии кнопки на АЦП контроллера появляется определённый уровень напряжения и эмулируется нажатие клавиатурной клавиши.
Описание библиотеки MouseKeyboard.
Я использовал данный контроллер для обработки нажатий резистивного подрулевого джойстика в автомобиле. Обрабатываются клавиши управление громкостью и Mute, переключения треков(при коротком нажатии) и перемотки(при удержании), а также воспроизведение/пауза (при длительном нажатии) и ALT+TAB при коротком. Можно назначить большое количество других клавиш или их комбинаций.
В данной схеме можно изменить количество кнопок, подобрав сопротивления резисторов.
int analogPin=0; //пин для подключения кнопок
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;
void setup()
{
Keyboard.begin();
}
void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
//********************** Громкость ************************************
if(data<=175 && flag == 0) // все кнопки отпущены
{
eventTime=millis();
}
// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
if(millis()-eventTime>10 && millis()-eventTime<499 && data>=881 && data<=901 && flag == 0)
{
Remote.increase();
flag = 5;
delay(10);
Remote.clear();
}
// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
if(millis()-eventTime>500 && data>=881 && data<=901 && flag == 5 || data>=881 && data<=901 && flag == 3)
{
Remote.increase(); // действие после удержание кнопки, Увеличить громкость каждые 0,1 секунды
flag = 3;
Remote.clear();
delay(100);
}
// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
if(millis()-eventTime>10 && millis()-eventTime<499 && data>=961 && data<=981 && flag == 0)
{
Remote.decrease();
flag = 6;
delay(10);
Remote.clear();
}
// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
if(millis()-eventTime>500 && data>=961 && data<=981 && flag == 6 || data>=961 && data<=981 && flag == 3)
{
Remote.decrease(); // действие после удержание кнопки, Уменьшить громкость каждые 0,1 секунды
flag = 3;
Remote.clear();
delay(100);
}
//********************** AltTab + Play/pause ************************************
// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
if(millis()-eventTime>10 && millis()-eventTime<499 && data>=490 && data<=510)
{
flag = 1;
}
if(data<=175 && flag == 1 && pauseMillis == 0) // действие после короткого нажатия кнопки, Alt+Tab
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
if(data<=175 && flag == 1 && pauseMillis != 0) // действие после короткого повторного нажатия кнопки, Alt+Tab
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
if(pauseMillis && millis()-pauseMillis >= 800 && data<=175) // && flag == 7 && data<=175)
{
flag = 0;
pauseMillis = 0;
Keyboard.releaseAll();
}
// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
if(millis()-eventTime>500 && data>=490 && data<=510 && flag == 1)
{
Remote.play_pause(); // действие после удержание кнопки, воспроизведение / пауза
flag = 0;
delay(10);
Remote.clear();
}
//********************** Next и Fast Forward ************************************
// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
if(millis()-eventTime>10 && millis()-eventTime<499 && data>=644 && data<=664)
{
flag = 2;
}
if(data<=175 && flag == 2) // действие после короткого нажатия кнопки, Next
{
Remote.next();
flag = 0;
delay(10);
Remote.clear();
}
// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
if(millis()-eventTime>500 && data>=644 && data<=664 && flag == 2 || data>=644 && data<=664 && flag == 3)
{
Remote.forward(); // действие после удержание кнопки, Fast Forward
flag = 3;
Remote.clear();
delay(100);
}
//********************** Previous и Rewind ************************************
// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
if(millis()-eventTime>10 && millis()-eventTime<499 && data>=775 && data<=795)
{
flag = 4;
}
if(data<=175 && flag == 4) // действие после короткого нажатия кнопки, Previous
{
Remote.previous();
flag = 0;
delay(10);
Remote.clear();
}
// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
if(millis()-eventTime>500 && data>=775 && data<=795 && flag == 4 || data>=775 && data<=795 && flag == 3)
{
Remote.rewind(); // действие после удержание кнопки, Rewind
flag = 3;
Remote.clear();
delay(100);
}
if(data<=175 && flag == 3 || data<=175 && flag == 5 || data<=175 && flag == 6) // действие после отпускания кнопки
{
flag = 0;
}
}
Скачать скетч: