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 timer, data_save, data_key, timer_alt_tab;
uint16_t data, counter;
uint8_t pinb_state, pinb_state_save, pind_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(0, 0, 1);
}
void mouse_wheel_down() {
Mouse.move(0, 0, -1);
}