Один из первых моих проектов на Arduino. Устройство предназначено для использования совместно с ПК или планшетом, для расширения возможностей стандартной клавиатуры.

Резистивная клавиатура на Arduino pro micro

http://forumupload.ru/uploads/0019/8b/c2/7/145872.jpg

Резистивные кнопки подключаются к аналоговому входу 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;
  }   
}

https://radioaktiv.ru/shems/avto_moto/2 … -pro-micro - источник

Отредактировано polysiv (26.09.2022 15:40:05)