Показать сообщение отдельно
Старый 12.08.2017, 01:17   #95
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
По умолчанию

Las42kuz, пробуйте. Схема подключения резистивных кнопок здесь.
PHP код:
/*
вывод 1 энкодера к выводу 3 ардуино
вывод 2 энкодера к выводу 4 ардуино
общий вывод энкодера к выводу GND ардуино
резестивные кнопки к выводу A0 ардуино
*/
//****************** Здесь необходимо указать свои значения ***************

#define analogPin             0         // пин для подключения кнопок, по умолчанию A0

/* возможные действия
vol_up_action()    Увеличить громкость
vol_down_action() Уменьшить громкость
next_action()   Следующий трек
forward_action()  Предыдущий трек
previous_action() Перемотка вперед
rewind_action()   Перемотка назад
play_pause_action() Play/Pause
mute_action()   Приглушение звука
alt_tab_action()  Alt + Tab
home_action()   Переход на домашний экран
play_action()   Play
pause_action()    Pause
stop_action()   Stop
power_action()    Питание (Включить или выключить экран)
mouse_wheel_up()  Вращение колеса мыши от себя
mouse_wheel_down()  Вращение колеса мыши на себя
*/
// только на кнопках 1-4 при удержании действие повторяется 10 раз в секунду

#define encoder_up vol_up_action()      // действие на энкодер
#define encoder_down vol_down_action()      // действие на энкодер
#define key_1_press vol_up_action()      // действие на короткое нажатие кнопки 1 
#define key_1_holding vol_up_action()      // действие на удержание кнопки 1 
#define key_2_press vol_down_action()    // действие на короткое нажатие кнопки 2
#define key_2_holding vol_down_action()    // действие на удержание кнопки 2
#define key_3_press next_action()        // действие на короткое нажатие кнопки 3
#define key_3_holding forward_action()     // действие на удержание кнопки 3
#define key_4_press previous_action()    // действие на короткое нажатие кнопки 4
#define key_4_holding rewind_action()      // действие на удержание кнопки 4
#define key_5_press play_pause_action()  // действие на короткое нажатие кнопки 5
#define key_5_holding mute_action()        // действие на удержание кнопки 5
#define key_6_press alt_tab_action()     // действие на короткое нажатие кнопки 6
#define key_6_holding home_action()        // действие на удержание кнопки 6
#define key_7_press mouse_wheel_up()     // действие на короткое нажатие кнопки 7
#define key_7_holding                      // действие на удержание кнопки 7
#define key_8_press mouse_wheel_down()   // действие на короткое нажатие кнопки 8
#define key_8_holding                      // действие на удержание кнопки 8
#define key_9_press                      // действие на короткое нажатие кнопки 9
#define key_9_holding                        // действие на удержание кнопки 9

#define release_button        1023  // значение при отпущенных кнопках
#define button_release_range  50  // диапазон значения + - при отпущенных кнопках
#define button_range          10  // диапазон значения нажатых кнопок + -
#define time_holding          500 // время для удержания кнопок в миллисекундах
#define time_tinkling         30  // время исключающее дребезг контактов в миллисекундах
#define key_1                 1500  // значение кнопки 1
#define key_2                 1500  // значение кнопки 2
#define key_3                 1500  // значение кнопки 3
#define key_4                 1500  // значение кнопки 4
#define key_5                 1500  // значение кнопки 5
#define key_6                 1500  // значение кнопки 6
#define key_7                 1500  // значение кнопки 7
#define key_8                 1500  // значение кнопки 8
#define key_9                 1500  // значение кнопки 9
//**************************************************************************

uint32_t timerdata_savedata_keytimer_alt_tab;
uint16_t datacounter;
uint8_t pinb_statepinb_state_savepind_state;

void setup() {
  
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)  
  
Keyboard.begin();
  
Mouse.begin();
  
DDRD &= ~(1<<0);
  
PORTD |= (1<<0);
  
DDRD &= ~(1<<4);
  
PORTD |= (1<<4);
}

void loop() {
  
data analogRead(analogPin);
  if((
millis() - timer) > 5) {
    
timer millis();
  
encoder();
    
key();
  }
  if((
millis() - timer_alt_tab) == 1000) {
    
Keyboard.release(KEY_LEFT_ALT);
  }
}

void encoder() {
  if ((
PIND B00010001) != B00010001 && (PIND B00010001)!= B00000000) {
    if ((
PIND B00010001) == B00010000 && pind_state == B00000001) {
      
encoder_up;
    }
    else if ((
PIND B00010001) == B00000001 && pind_state == B00010000) {
      
encoder_down;
    }
    
pind_state = (PIND B00010001); 
  }
  else if ((
PIND B00010001) == B00010001) {
    
pind_state B00000000
  }
}

void key() {
  if(
data >= release_button button_release_range && data <= release_button button_release_range) { // кнопки отпущены
    
if(counter > (time_tinkling 5) && counter < (time_holding 5)) { // короткое нажатие какой-либо кнопки и больше времени исключающее дребезг
      
data_key data_save counter;
      if(
data_key >= (key_1 button_range) && data_key <= (key_1 button_range)) {
        
key_1_press;
      }
      if(
data_key >= (key_2 button_range) && data_key <= (key_2 button_range)) {
        
key_2_press;
      }
      if(
data_key >= (key_3 button_range) && data_key <= (key_3 button_range)) {
        
key_3_press;
      }
      if(
data_key >= (key_4 button_range) && data_key <= (key_4 button_range)) {
        
key_4_press;
      }
      if(
data_key >= (key_5 button_range) && data_key <= (key_5 button_range)) { 
        
key_5_press;
      }
      if(
data_key >= (key_6 button_range) && data_key <= (key_6 button_range)) {
        
key_6_press;
      }
      if(
data_key >= (key_7 button_range) && data_key <= (key_7 button_range)) {
        
key_7_press;
      }
      if(
data_key >= (key_8 button_range) && data_key <= (key_8 button_range)) {
        
key_8_press;
      }
      if(
data_key >= (key_9 button_range) && data_key <= (key_9 button_range)) {
        
key_9_press;
      }
    }
    
data_save 0;
    
counter 0;
  }
  else { 
// нажата какая-то кнопка
    
counter++;
    
data_save data_save data;
    if(
counter >= (time_holding 5)) { // удержание какой-либо кнопки
      
data_key data_save counter;
      if((
counter 20) == 0) { // действие повторяется 10 раз в секунду, пока кнопка нажата
        
if(data_key >= (key_1 button_range) && data_key <= (key_1 button_range)) {
          
key_1_holding;
        }
        if(
data_key >= (key_2 button_range) && data_key <= (key_2 button_range)) {
         
key_2_holding;
        }
        if(
data_key >= (key_3 button_range) && data_key <= (key_3 button_range)) {
          
key_3_holding;
        }
        if(
data_key >= (key_4 button_range) && data_key <= (key_4 button_range)) {
         
key_4_holding;
        }
      }
      if(
counter == (time_holding 5)) { // действие выполняется 1 раз при удержании
        
if(data_key >= (key_5 button_range) && data_key <= (key_5 button_range)) {
         
key_5_holding;
        }
        if(
data_key >= (key_6 button_range) && data_key <= (key_6 button_range)) {
         
key_6_holding;
        }
        if(
data_key >= (key_7 button_range) && data_key <= (key_7 button_range)) {
         
key_7_holding;
        }
        if(
data_key >= (key_8 button_range) && data_key <= (key_8 button_range)) {
         
key_8_holding;
        }
        if(
data_key >= (key_9 button_range) && data_key <= (key_9 button_range)) {
         
key_9_holding;
        }
      }
    }
  }
}

void vol_up_action() {
  
Remote.increase();
  
Remote.clear();
}
void vol_down_action() {
  
Remote.decrease();
  
Remote.clear();
}
void next_action() {
  
Remote.next();
  
Remote.clear();
}
void forward_action() {
  
Remote.forward();
  
Remote.clear();
}
void previous_action() {
  
Remote.previous();
  
Remote.clear();
}
void rewind_action() {
  
Remote.rewind();
  
Remote.clear();
}
void play_pause_action() {
  
Remote.play_pause();
  
Remote.clear();
}
void mute_action() {
  
Remote.mute();
  
Remote.clear();
}
void alt_tab_action() {
  if((
millis() - timer_alt_tab) > 1000) {
    
Keyboard.press(KEY_LEFT_ALT);
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
timer_alt_tab millis();
  }
  else {
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
timer_alt_tab millis();
  }
}
void home_action() {
  
Remote.home();
  
Remote.clear();
}
void play_action() {
  
Remote.play();
  
Remote.clear();
}
void pause_action() {
  
Remote.pause();
  
Remote.clear();
}
void stop_action() {
  
Remote.stop();
  
Remote.clear();
}
void power_action() {
  
Remote.power();
  
Remote.clear();
}

void mouse_wheel_up() {
  
Mouse.move(001);
}

void mouse_wheel_down() {
  
Mouse.move(00, -1);

lti1 вне форума   Ответить с цитированием