PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   Резистивные кнопки под андроид (http://pccar.ru/showthread.php?t=18478)

armlive 20.01.2014 22:23

Цитата:

Сообщение от ilya174 (Сообщение 283923)
Это для Arduino Leonardo, у меня UNO

А действие кода на две команды пробовал прописать?
Внутри стоит, поэкспериментировать не могу, но я бы на действие кнопки к примеру сделал
если нажата кнопка ALT, то отправляем и код кнопки TAB.
тяжело вспомнить азы программирования, когда 15 лет этим уже не занимался
Код:

LastKeyPressed = CH_TAB;
        buf[0] = (код клавиши альт);
        buf[2]=CH_TA)B;
        LastTimeKeyPressed = TimeKeyPressed;
    Serial.write(buf, 8);       
    releaseKey();       
      }

Но я бы сделал на оборот
Код:

LastKeyPressed = CH_LEFT_ALT;
        buf[0] = (код клавиши TAB);
        buf[2]=CH_LEFT_ALT;
        LastTimeKeyPressed = TimeKeyPressed;
    Serial.write(buf, 8);       
    releaseKey();       
      }


ilya174 21.01.2014 21:06

Так пробовал. На windows 7 окна переключаются, причем ни как если с клавиатуры нажимать ALT+TAB появляется маленькое окошко с запущенными программами и там уже выбираешь нужное окно, а просто идет перебор открытых окон как на XP. Но вот андроид почему-то никак не реагирует на такую комбинацию.

Andrey_61 21.01.2014 23:25

Народ, на тему Alt+Tab не совсем верный алгоритм.
Надо не отправлять Alt+Tab постоянно, а зажать Alt и удерживая его отправлять Tab

вот кусок моего кода при получении команды с ИК-пульта (требуется доп библиотека Timer.h)
Код для Leonardo, но думаю можно адаптировать и под UNO

Код:

boolean altTabFirstPress = HIGH; //Первое нажатие alt+tab
int altTabTimer; //Таймер ALT+TAB

....
    if(событие){ 
      if(boolean(altTabFirstPress)==HIGH){ //Если это нажатие первое
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер (1000мс) сброса ALT+TAB
        altTabFirstPress = LOW; //Сбрасываем переменную
        Keyboard.press(KEY_ALT); //Нажимаем Alt
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Alt
      }
      else{ //Если это нажатие НЕ первое
        timer.stop(altTabTimer); //Останавливаем таймер сброса ALT+TAB
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Tab
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер сброса ALT+TAB снова     
      }
....

//отпускаем Alt+Tab
void resetAltTab (){
  altTabFirstPress = HIGH; //Устанавливаем переменную
  Keyboard.releaseAll(); //Отпускаем все кнопки, для UNO как я понимаю придется прописать каждую кнопку отдельно
}


armlive 21.01.2014 23:48

Я нашел, что в андроиде есть своя одна команда для этих целей,
Цитата:

APP_SWITCH (RECENT_APP) – вызов панели «Недавние» с возможностью переключаться между приложениями (либо вызов диспетчера приложений в зависимости от прошивки. APP_SWITCH или RECENT_APP зависит от производителя и прошивки, так в HTC это APP_SWITCH, а в Gigabyte Gsmart это RECENT_APP)
Надо найти методом подбора в нексусе

ilya174 22.01.2014 08:18

Цитата:

Сообщение от armlive (Сообщение 284063)
Я нашел, что в андроиде есть своя одна команда для этих целей,

Надо найти методом подбора в нексусе

Обе команды пробовал в нексусе- не заработало.

armlive 22.01.2014 11:12

Цитата:

Сообщение от ilya174 (Сообщение 284094)
Обе команды пробовал в нексусе- не заработало.

Я же написал, нужно подбирать из тех, что есть в нексусе

Chubaka885 11.02.2014 09:38

Цитата:

Сообщение от Andrey_61 (Сообщение 284055)
Народ, на тему Alt+Tab не совсем верный алгоритм.
Надо не отправлять Alt+Tab постоянно, а зажать Alt и удерживая его отправлять Tab

вот кусок моего кода при получении команды с ИК-пульта (требуется доп библиотека Timer.h)
Код для Leonardo, но думаю можно адаптировать и под UNO

Код:

boolean altTabFirstPress = HIGH; //Первое нажатие alt+tab
int altTabTimer; //Таймер ALT+TAB

....
    if(событие){ 
      if(boolean(altTabFirstPress)==HIGH){ //Если это нажатие первое
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер (1000мс) сброса ALT+TAB
        altTabFirstPress = LOW; //Сбрасываем переменную
        Keyboard.press(KEY_ALT); //Нажимаем Alt
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Alt
      }
      else{ //Если это нажатие НЕ первое
        timer.stop(altTabTimer); //Останавливаем таймер сброса ALT+TAB
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Tab
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер сброса ALT+TAB снова     
      }
....

//отпускаем Alt+Tab
void resetAltTab (){
  altTabFirstPress = HIGH; //Устанавливаем переменную
  Keyboard.releaseAll(); //Отпускаем все кнопки, для UNO как я понимаю придется прописать каждую кнопку отдельно
}


Почему то ругается на timer.after.... Говорит что timer не декларирован. Хотя библиотеку Timer скопировал в либы программы. В начале скетча добавил Timer.h

Chubaka885 22.02.2014 22:32

А кто нибудь реализовал на одной резистивной кнопке одиночное нажатие и удержание? Не поделитесь. А то никак не могу догнать как сделать(((

Вот вроде сделал, но при нажатии и удержании функция по одиночному нажатию всё равно сначала проходит.

Код:

int buttonPin=6; //пин для резистивных кнопок
int data;
int flag=0;
long previousMillis = 0;
int val=0;

void setup()
{
 Keyboard.begin();
 Serial.begin(9600);
}

void loop()
{
 data=analogRead(buttonPin); //читаем значение нажатой кнопки
 Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
 
  if (data<=900) //если нажата любая из кнопок начинается отсчёт
  {
    if (millis() -previousMillis >200)   
    {
      previousMillis = millis();   
      val++;

//кнопка громкости +
      if (data>=210 && data<=232 && flag==0 && val==1)  //одиночное нажатие
      {
      Remote.increase(); //прибавить громкость на ед.
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data>=210 && data<=232 && val>=2)  // удержание
      {
      Remote.increase(); //прибавлять громкость до отпускания
      Remote.clear();
      val=0;
      }

//кнопка громкости -
      if (data>=460 && data<=488 && flag==0 && val>=1 && val<=3)  //одиночное нажатие
      {
      Remote.decrease(); //убавить громкость на ед.
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data>=460 && data<=488 && val>=4)  //удержание
      {
      Remote.decrease(); //убавлять громкость до отпускания
      Remote.clear();
      val=0;
      }

//кнопка следующий трек
      if (data==0 && flag==0 && val==1)  //одиночное нажатие
      {
      Remote.next(); //следующий трек
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data==0 && val>=2)  //удержание
      {
      Remote.forward(); //перемотка вперёд
      Remote.clear();
      val=0;
      }
 
//кнопка предидущий трек
      if (data>=76 && data<=92 && flag==0 && val>=1 && val<=5)  //одиночное нажатие
      {
      Remote.previous(); //предидущий трек
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data>=76 && data<=92 && val>=6)  //удержание
      {
      Remote.rewind(); //перемотка назад
      Remote.clear();
      val=0;
      }
   
//кнопка приглушения звука
      if (data>=565 && data<=594 && flag==0)  //нажата кнопка
      {
      Remote.mute();
      Remote.clear();
      flag=1;
      val=0;
      }
    }
  }
//не нажата не одна из кнопок
  if (data>=950 && data<=960 && flag==1)
  {
  flag=0;
  }
}


lti1 22.02.2014 23:26

Цитата:

Сообщение от Chubaka885 (Сообщение 288404)
А кто нибудь реализовал на одной резистивной кнопке одиночное нажатие и удержание? Не поделитесь. А то никак не могу догнать как сделать(((

Вот вроде сделал, но при нажатии и удержании функция по одиночному нажатию всё равно сначала проходит.

Алгоритм такой: короткое нажатие, более 100 и менее 500 миллисекунд - Play/pause; длинное, более 500 миллисекунд - Mute.
Тоже самое с Next и Fast Forward, Previous и Rewind. При удержании увеличения и уменьшения громкости, увеличивает или уменьшает громкость на 10 делений в секунду, а при коротком нажатии, менее 500 миллисекунд - увеличивает или уменьшает громкость на 1 деление.
Код:

int analogPin=0;
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;

void setup()
{
Keyboard.begin();
}

void loop()
{
  data=analogRead(analogPin); //читаем значение нажатой кнопки
 
//********************** Громкость ************************************

  if(data<=100 && flag == 0) // все кнопки отпущены
  {
    eventTime=millis();
  }

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=600 && data<=630 && flag == 0) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    Remote.increase();
    flag = 5;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=600 && data<=630 && flag == 5 || data>=600 && data<=630 && flag == 3) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.increase(); // действие после удержание кнопки, Увеличить громкость каждые 0,1 секунды
    flag = 3;
    Remote.clear();
    delay(100);
  }

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=500 && data<=530 && flag == 0) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    Remote.decrease();
    flag = 6;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=500 && data<=530 && flag == 6 || data>=500 && data<=530 && flag == 3) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.decrease(); // действие после удержание кнопки, Уменьшить громкость каждые 0,1 секунды
    flag = 3;
    Remote.clear();
    delay(100);
  }
 
//********************** Play/pause и Mute ************************************   

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=920 && data<=960) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 1;
  }

  if(data<=100 && flag == 1) // действие после короткого нажатия кнопки, воспроизведение / пауза
  {
    Remote.play_pause();
    flag = 0;
    delay(10);
    Remote.clear();
  }
 
  if(millis()-eventTime>500 && data>=920 && data<=960 && flag == 1) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.mute(); // действие после удержание кнопки, приглушение звука
    flag = 0;
    delay(10);
    Remote.clear();
  }
//********************** Next и Fast Forward ************************************   
   
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=815 && data<=845) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 2;
  }
 
  if(data<=100 && flag == 2) // действие после короткого нажатия кнопки, Next
  {
    Remote.next();
    flag = 0;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=815 && data<=845 && flag == 2 || data>=815 && data<=845 && flag == 3) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.forward(); // действие после удержание кнопки, Fast Forward
    flag = 3;
    Remote.clear();
    delay(100);
  }
//********************** Previous и Rewind ************************************   
   
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=700 && data<=740) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 4;
  }
 
  if(data<=100 && flag == 4) // действие после короткого нажатия кнопки, Previous
  {
    Remote.previous();
    flag = 0;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=700 && data<=740 && flag == 4 || data>=700 && data<=740 && flag == 3) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.rewind(); // действие после удержание кнопки, Rewind
    flag = 3;
    Remote.clear();
    delay(100);
  }
 
  if(data<=100 && flag == 3 || data<=100 && flag == 5 || data<=100 && flag == 6) // действие после отпускания кнопки
  {
    flag = 0;
  } 
}


Chubaka885 23.02.2014 17:56

lti1 Большое спасибо!! Всё заработало как надо.

Осталось, вместо play/pause сделать AltTab. Попробую сам.

И ещё. Не подскажите, существует ли команда HID переключения папок в аудиоплеере?


Часовой пояс GMT +4, время: 23:32.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot