Показать сообщение отдельно
Старый 22.02.2014, 23:26   #209
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

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

Вот вроде сделал, но при нажатии и удержании функция по одиночному нажатию всё равно сначала проходит.
Алгоритм такой: короткое нажатие, более 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;
   }   
}

Последний раз редактировалось lti1; 23.02.2014 в 16:36.
lti1 вне форума   Ответить с цитированием