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


Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Устройства ввода > Резистивные кнопки

Ответ
 
Опции темы
Старый 15.06.2015, 18:15   #1
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
Question Encoder + Arduino + Резистивные кнопки

В принципе в машине минимальный набор кнопок для любого кар-писишника это: Vol+, Vol-, AltTab, Previous и Rewind.Что на форуме уже реализовано в сообщении уважаемого lti1

есть ещё куча примеров и уроков как здесь на форуме так и на просторах инета о том как прикрутить энкодер к ардуине
например вот http://www.pccar.ru/showthread.php?t=20222

Теперь для меня встал вопрос как это объединить в один скетч и что бы это всё работало как клавиатура при подключении к любому PC в том числе и планшету. Прошу помощи знающих и ведающих програмированием

Последний раз редактировалось admin; 27.03.2017 в 02:07.
TransF вне форума   Ответить с цитированием
Старый 16.06.2015, 02:08   #2
s.m.
Гуру
 
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
s.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to behold
По умолчанию

теория
http://arduino.ru/forum/programmirov...ra-pod-android

коды клавиш

https://code.google.com/p/androhid/wiki/Keycodes

ардуина годится любая, которая подключается напрямую к USB, без всяких USB-Serial мостов (FT232, CH340 etc.)

Читаем ссылки до полного просветления. Задаем вопросы, хотя там и так все понятно: прикидываемся USB-клавой, скетчем обрабатываем кнопки и энкодер, посылаем нужные сканкоды клавиатуры. Будет работать в любом аппарате на Андроид с поддержкой OTG.
__________________
Мой проект: Citroen Xsara Android CarPC

Последний раз редактировалось admin; 27.03.2017 в 02:07.
s.m. вне форума   Ответить с цитированием
Старый 16.06.2015, 15:17   #3
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
По умолчанию

Спасибо за ликбез, но это я всё читал и ничего непонятно. Мои знания в програмировании заканчиваются на школьном уровне, это как построить космический корабль кандидату юридических наук.

Прошу помощи в предложениях что где и куда писать?
вот так выглядит рабочий скетч для энкодера

PHP код:
//Скетч регулятора громкости на энкодере для Arduino MICRO
// энкодер на 10 и 11 пинах  выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
void setup() {            
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT7)|(1<<PCINT6);
pinMode (7,INPUT_PULLUP);
pinMode (10,INPUT);
pinMode (11,INPUT);
attachInterrupt(4key_muteFALLING);
Remote.begin();
}
void loop() { }
 
ISR (PCINT0_vect){
static 
byte old_n=PINB&B11000000;
byte new_n=PINB&B11000000;
if (
old_n==128&&new_n==192||old_n==64&&new_n==0) {Remote.increase();}
if (
old_n==64&&new_n==192||old_n==128&&new_n==0) {Remote.decrease();}
old_nnew_n;
}

void key_mute() {Remote.mute();} 
Вот так скетч для кнопок

PHP код:
//****************** Здесь необходимо указать свои значения *************** 

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

int release_button 1023// значение при отпущенных кнопках 
int button_release_range 50// диапазон значения + - при отпущенных кнопках 
int button_range 10// диапазон значения нажатых кнопок + - 
int time_holding 500// время для удержания кнопок в миллисекундах 
int time_tinkling 10// время исключающее дребезг контактов в миллисекундах 
int vol_up 111// значение кнопки увеличить громкость 
int vol_down 222// значение кнопки уменьшить громкость 
int alt_tab 333// значение кнопки которая будет работать как Alt + Tab 
int next 444// значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании 
int previous 555// значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании 
int play_pause 777// значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании 

//************************************************************************** 

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>=release_button button_release_range && data<=release_button button_release_range && flag == 0)  
{  
eventTime=millis();  
}  

//********************** Громкость ************************************ 

if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= vol_up button_range && data <= vol_up button_range && flag == 0
{   
Remote.increase();  
flag 5;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= vol_up button_range && data <= vol_up button_range && flag == || data >= vol_up button_range && data <= vol_up button_range && flag && flag == 3)  
{   
Remote.increase(); 
flag 3;  
Remote.clear();  
delay(100);  
}  

if(
millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= vol_down button_range && data <= vol_down button_range && flag == 0)  
{   
Remote.decrease();  
flag 6;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= vol_down button_range && data <= vol_down button_range && flag == || data >= vol_down button_range && data <= vol_down button_range && flag == 3)  
{   
Remote.decrease();  
flag 3;  
Remote.clear();  
delay(100);  
}  

//********************** AltTab + Ещё что то ************************************   

if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= alt_tab button_range && data <= alt_tab button_range)  
{   
flag 1;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis == 0)  
{  
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>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis != 0)  
{  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
flag 0;  
pauseMillis millis();  
}  

if(
pauseMillis && millis()-pauseMillis >= 800 && data>=release_button button_release_range && data<=release_button button_release_range)  
{  
flag 0;  
pauseMillis 0;  
Keyboard.releaseAll();  
}  

if(
millis()-eventTime>time_holding && data >= alt_tab button_range && data <= alt_tab button_range && flag == 1)  
{   
flag 0;  
}  
//********************** Next и Fast Forward ************************************   

if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= next button_range && data <= next button_range)  
{   
flag 2;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 2)  
{  
Remote.next();  
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= next button_range && data <= next button_range && flag == || data >= next button_range && data <= next button_range && flag == 3)  
{   
Remote.forward();  
flag 3;  
Remote.clear();  
delay(100);  
}  
//********************** Previous и Rewind ************************************   

if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= previous button_range && data <= previous button_range)  
{   
flag 4;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 4)  
{  
Remote.previous();  
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= previous button_range && data <= previous button_range && flag == || data >= previous button_range && data <= previous button_range && flag == 3)  
{   
Remote.rewind(); 
flag 3;  
Remote.clear();  
delay(100);  
}  

//********************** Play/pause + Mute ************************************   

if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= play_pause button_range && data <= play_pause button_range)  
{   
flag 7;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 7)  
{  
Remote.play_pause();   
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= play_pause button_range && data <= play_pause button_range && flag == 7)  
{   
Remote.mute(); 
flag 0
delay(10); 
Remote.clear();  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == 6)  
{  
flag 0;  
}   

Это то что я проверил на Ардуино Микро (Леонардо)
подскажите как их объединить?

Последний раз редактировалось admin; 27.03.2017 в 02:08.
TransF вне форума   Ответить с цитированием
Старый 18.06.2015, 19:28   #4
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
По умолчанию

Нашел ещё одну тему
http://www.pccar.ru/showthread.php?t=20222
может всё таки кто нибудь подключится? или все грамотные а делиться грамотой стыдно?

Едиственное там все регулировки делаются фубаром, а хотелось бы на прямую в ОС регулировать громкость
__________________

AUDI A6 (C5) V6 2.8L
TransF вне форума   Ответить с цитированием
Старый 19.06.2015, 00:15   #5
s.m.
Гуру
 
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
s.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to behold
По умолчанию

Собрал два вместе
Откуда эти либы Keyboard и Remote - лучше спросить в тех ветках, откуда взяты эти куски кода.

PHP код:
//****************** Здесь необходимо указать свои значения *************** 

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

int release_button 1023// значение при отпущенных кнопках 
int button_release_range 50// диапазон значения + - при отпущенных кнопках 
int button_range 10// диапазон значения нажатых кнопок + - 
int time_holding 500// время для удержания кнопок в миллисекундах 
int time_tinkling 10// время исключающее дребезг контактов в миллисекундах 
int vol_up 111// значение кнопки увеличить громкость 
int vol_down 222// значение кнопки уменьшить громкость 
int alt_tab 333// значение кнопки которая будет работать как Alt + Tab 
int next 444// значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании 
int previous 555// значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании 
int play_pause 777// значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании 

//************************************************************************** 
int data;  
unsigned long flag 0;  
unsigned long eventTime 0;  
unsigned long pauseMillis 0


void setup() {            
    
PCICR 1<<PCIE0;
    
PCMSK0 = (1<<PCINT7)|(1<<PCINT6);
    
pinMode (7,INPUT_PULLUP);
    
pinMode (10,INPUT);
    
pinMode (11,INPUT);
    
attachInterrupt(4keyMuteFALLING);

    
Remote.begin();
    
Keyboard.begin();  
}

ISR (PCINT0_vect) {
    static 
byte old_n PINB&B11000000;
    
byte new_n PINB&B11000000;
    if (
old_n == 128 && new_n == 192 || old_n == 64 && new_n == 0) {
        
Remote.increase();
    }
    if (
old_n == 64 && new_n == 192 || old_n == 128 && new_n == 0) {
        
Remote.decrease();
    }
    
old_n new_n;
}

void keyMute() {
    
Remote.mute();


void loop() {  
    
data analogRead(analogPin);  
    if (
data >= release_button button_release_range && data <= release_button button_release_range && flag == 0) {  
        
eventTime millis();  
    }  

    
//********************** Громкость ************************************ 
    
if (millis() - time_tinkling && millis() - eventTime time_holding-&& data >= vol_up button_range && data <= vol_up button_range && flag == 0) {   
        
Remote.increase();  
        
flag 5;  
        
delay(10);  
        
Remote.clear();  
    }  

    if (
millis() - eventTime time_holding && data >= vol_up button_range && data <= vol_up button_range && flag == || data >= vol_up button_range && data <= vol_up button_range && flag && flag == 3) {   
        
Remote.increase(); 
        
flag 3;  
        
Remote.clear();  
        
delay(100);  
    }  

    if(
millis() - time_tinkling && millis() - eventTime time_holding-&& data >= vol_down button_range && data <= vol_down button_range && flag == 0) {   
        
Remote.decrease();  
        
flag 6;  
        
delay(10);  
        
Remote.clear();  
    }  

    if(
millis()-eventTime>time_holding && data >= vol_down button_range && data <= vol_down button_range && flag == || data >= vol_down button_range && data <= vol_down button_range && flag == 3)  
    {   
        
Remote.decrease();  
        
flag 3;  
        
Remote.clear();  
        
delay(100);  
    }  

    
//********************** AltTab + Ещё что то ************************************   

    
if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= alt_tab button_range && data <= alt_tab button_range)  
    {   
        
flag 1;  
    }  

    if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis == 0)  
    {  
        
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>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis != 0)  
    {  
        
Keyboard.press(KEY_TAB);  
        
Keyboard.release(KEY_TAB);  
        
flag 0;  
        
pauseMillis millis();  
    }  

    if(
pauseMillis && millis()-pauseMillis >= 800 && data>=release_button button_release_range && data<=release_button button_release_range)  
    {  
        
flag 0;  
        
pauseMillis 0;  
        
Keyboard.releaseAll();  
    }  

    if(
millis()-eventTime>time_holding && data >= alt_tab button_range && data <= alt_tab button_range && flag == 1)  
    {   
        
flag 0;  
    }  
    
//********************** Next и Fast Forward ************************************   

    
if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= next button_range && data <= next button_range)  
    {   
        
flag 2;  
    }  

    if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 2)  
    {  
        
Remote.next();  
        
flag 0;  
        
delay(10);  
        
Remote.clear();  
    }  

    if(
millis()-eventTime>time_holding && data >= next button_range && data <= next button_range && flag == || data >= next button_range && data <= next button_range && flag == 3)  
    {   
        
Remote.forward();  
        
flag 3;  
        
Remote.clear();  
        
delay(100);  
    }  
    
//********************** Previous и Rewind ************************************   

    
if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= previous button_range && data <= previous button_range)  
    {   
        
flag 4;  
    }  

    if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 4)  
    {  
        
Remote.previous();  
        
flag 0;  
        
delay(10);  
        
Remote.clear();  
    }  

    if(
millis()-eventTime>time_holding && data >= previous button_range && data <= previous button_range && flag == || data >= previous button_range && data <= previous button_range && flag == 3)  
    {   
        
Remote.rewind(); 
        
flag 3;  
        
Remote.clear();  
        
delay(100);  
    }  

    
//********************** Play/pause + Mute ************************************   

    
if(millis()-time_tinkling && millis()-eventTime<time_holding-&& data >= play_pause button_range && data <= play_pause button_range)  
    {   
        
flag 7;  
    }  

    if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 7)  
    {  
        
Remote.play_pause();   
        
flag 0;  
        
delay(10);  
        
Remote.clear();  
    }  

    if(
millis()-eventTime>time_holding && data >= play_pause button_range && data <= play_pause button_range && flag == 7)  
    {   
        
Remote.mute(); 
        
flag 0
        
delay(10); 
        
Remote.clear();  
    }  

    if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == 6)  
    {  
        
flag 0;  
    }   

Пробуйте
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 23.06.2015, 14:42   #6
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
По умолчанию

Спасибо за сборку данного скетча, и с библиотеками всё норм, ни каких ошибок нет.
Но вот почему-то часть отвечающая за энкодер не работает при чем не могу понять почему(((

Пытался заставить работать скетч с энкодером не получается, как он у меня заработал в прошлый раз не могу понять

может сделать всю сборку попроще типа вот такой?
PHP код:
pinMode (10,INPUT);
pinMode (11,INPUT);

void setup()  
{  
Keyboard.begin();  
}  
void loop()  
{  
data=pinRead(PinMode 10);
Keyboard.press(VOL_UP);  
}
{
data=pinRead(PinMode 11);
Keyboard.press(VOL_DOWN);  

__________________

AUDI A6 (C5) V6 2.8L

Последний раз редактировалось TransF; 23.06.2015 в 16:25.
TransF вне форума   Ответить с цитированием
Старый 03.07.2015, 20:39   #7
demonnwx
Новый Пользователь
 
Регистрация: 03.07.2015
Возраст: 28
Регион: 66, 96
Машина: нет
Сообщений: 1
demonnwx is on a distinguished road
По умолчанию

Решил сделать Encoder + Arduino + Резистивные кнопки.

Только у меня другой подход.

Я хочу сделать плату на Atmega8. Размеры платы не более 5х5 см. В плату будут подключаться резистивные кнопки и энкодер.

Мультимедиа клавишы
3 цифровых входа Энкодер VOL+ //// VOL- //// MUTE //// UNMUTE

5 ¬ходов кнопки матрица 5х4

1 Play/Pause 2 Stop 3 Next 4 Previous 5 Brightness+
6 Brightness- 7 Power 8 Reset 9 Forward 10 Back
11 Refresh 12 Full Screen 13 Sleep 14 Tab 15 Enter
16 Space 17 Lock 18 Reserve 19 Reserve 20 Reserve

Схема соединений уже нарисована, плата разведена. Осталось сделать печатные платы и прошить.

Нужны соискатели готовые приобрести плату (без компонентов).

10 плат обойдется в 20$, 2$ за штуку при условии 10 человек.

Жду вопросов и предложений.

Последний раз редактировалось admin; 27.03.2017 в 15:06.
demonnwx вне форума   Ответить с цитированием
Старый 07.07.2015, 10:39   #8
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
По умолчанию

Цитата:
Сообщение от demonnwx Посмотреть сообщение
Цитата:
Сообщение от demonnwx Посмотреть сообщение
Решил сделать Encoder + Arduino + Резистивные кнопки.

Только у меня другой подход.

Я хочу сделать плату на Atmega8. Размеры платы не более 5х5 см. В плату будут подключаться резистивные кнопки и энкодер.

Мультимедиа клавишы
3 цифровых входа Энкодер VOL+ //// VOL- //// MUTE //// UNMUTE

5 ¬ходов кнопки матрица 5х4

1 Play/Pause 2 Stop 3 Next 4 Previous 5 Brightness+
6 Brightness- 7 Power 8 Reset 9 Forward 10 Back
11 Refresh 12 Full Screen 13 Sleep 14 Tab 15 Enter
16 Space 17 Lock 18 Reserve 19 Reserve 20 Reserve

Схема соединений уже нарисована, плата разведена. Осталось сделать печатные платы и прошить.

Нужны соискатели готовые приобрести плату (без компонентов).

10 плат обойдется в 20$, 2$ за штуку при условии 10 человек.

Жду вопросов и предложений.
Вопрос не в цене, а в реализации и рациональности данного проекта.
Ардуино всё таки универсальная штуковина и каждый может настроить ее как ему удобно, а в Вашем сообщении только слова.
Есть хотя бы макетка или пример который реально существует и работает?

Посидев на разных форумах и почитав сообщения умных (не то что я) людей практически собрал полноценный пульт на ардуине. )))

Чуть позже выложу схему и скетч)))
__________________

AUDI A6 (C5) V6 2.8L

Последний раз редактировалось admin; 27.03.2017 в 15:07.
TransF вне форума   Ответить с цитированием
Старый 09.07.2015, 18:55   #9
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
По умолчанию

И так:
поиски по инету и общение с грамотными людьми дало свои результаты

1.100% работающий код для энкодера
Код:
 //Скетч регулятора громкости на энкодере для Arduino PRO MICRO
// энкодер на 8 и 9 пинах  выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
void setup() {            
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, key_mute, FALLING);
Remote.begin();
}
void loop() { }
 
ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {Remote.increase();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {Remote.decrease();}
old_n= new_n;
}
 
void key_mute() {Remote.mute();}
взято у этого доброго человека
http://arduino.ru/forum/programmirov...comment-111864

2. так же как и у всех тут на форуме работающий скетч от lti1

Сочленение этих двух скетчей ни выдает ни каких ошибок, проходит компиляцию, но работают только кнопки не могу понять в чем проблема. может у кого есть идеи где ошибка в скетче обьедененном?

Код:
//****************** Здесь необходимо указать свои значения *************** 

int analogPin=0; // пин для подключения кнопок, по умолчанию A0 

int release_button = 1023; // значение при отпущенных кнопках 
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках 
int button_range = 20; // диапазон значения нажатых кнопок + - 
int time_holding = 500; // время для удержания кнопок в миллисекундах 
int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах 
int vol_up = 130; // значение кнопки увеличить громкость 
int vol_down = 340; // значение кнопки уменьшить громкость 
int alt_tab = 380; // значение кнопки которая будет работать как Alt + Tab 
int next = 470; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании 
int previous = 600; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании 
int play_pause = 700; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании 

//************************************************************************** 
int data;  
unsigned long flag = 0;  
unsigned long eventTime = 0;  
unsigned long pauseMillis = 0; 


void setup() {            
    PCICR = 1<<PCIE0;
    PCMSK0 = (1<<PCINT5)|(1<<PCINT4);
    pinMode (7,INPUT_PULLUP);
    pinMode (8,INPUT);
    pinMode (9,INPUT);
    attachInterrupt(4, keyMute, FALLING);

    Remote.begin();
    Keyboard.begin();  
}

ISR (PCINT0_vect) {
    static byte old_n = PINB&B11000000;
    byte new_n = PINB&B11000000;
    if (old_n == 32&&new_n==48 || old_n == 16&&new_n == 0) {Remote.increase();}
    if (old_n == 16&&new_n==48 || old_n == 32&&new_n == 0) {Remote.decrease();}
    old_n = new_n;
}

void keyMute() {
    Remote.mute();
} 

void loop() {  
    data = analogRead(analogPin);  
    if (data >= release_button - button_release_range && data <= release_button + 

button_release_range && flag == 0) {  
        eventTime = millis();  
    }  

    //********************** Громкость ************************************ 
    if (millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >= 

vol_up - button_range && data <= vol_up + button_range && flag == 0) {   
        Remote.increase();  
        flag = 5;  
        delay(10);  
        Remote.clear();  
    }  

    if (millis() - eventTime > time_holding && data >= vol_up - button_range && data <= 

vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + 

button_range && flag && flag == 3) {   
        Remote.increase(); 
        flag = 3;  
        Remote.clear();  
        delay(100);  
    }  

    if(millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >= 

vol_down - button_range && data <= vol_down + button_range && flag == 0) {   
        Remote.decrease();  
        flag = 6;  
        delay(10);  
        Remote.clear();  
    }  

    if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= 

vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= 

vol_down + button_range && flag == 3)  
    {   
        Remote.decrease();  
        flag = 3;  
        Remote.clear();  
        delay(100);  
    }  

    //********************** AltTab + Ещё что то ************************************   

    if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab - 

button_range && data <= alt_tab + button_range)  
    {   
        flag = 1;  
    }  

    if(data>=release_button - button_release_range && data<=release_button + 

button_release_range && flag == 1 && pauseMillis == 0)  
    {  
        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>=release_button - button_release_range && data<=release_button + 

button_release_range && flag == 1 && pauseMillis != 0)  
    {  
        Keyboard.press(KEY_TAB);  
        Keyboard.release(KEY_TAB);  
        flag = 0;  
        pauseMillis = millis();  
    }  

    if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button - 

button_release_range && data<=release_button + button_release_range)  
    {  
        flag = 0;  
        pauseMillis = 0;  
        Keyboard.releaseAll();  
    }  

    if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= 

alt_tab + button_range && flag == 1)  
    {   
        flag = 0;  
    }  
    //********************** Next и Fast Forward ************************************   

    if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= next - 

button_range && data <= next + button_range)  
    {   
        flag = 2;  
    }  

    if(data>=release_button - button_release_range && data<=release_button + 

button_release_range && flag == 2)  
    {  
        Remote.next();  
        flag = 0;  
        delay(10);  
        Remote.clear();  
    }  

    if(millis()-eventTime>time_holding && data >= next - button_range && data <= next + 

button_range && flag == 2 || data >= next - button_range && data <= next + button_range 

&& flag == 3)  
    {   
        Remote.forward();  
        flag = 3;  
        Remote.clear();  
        delay(100);  
    }  
    //********************** Previous и Rewind ************************************   

    if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= previous - 

button_range && data <= previous + button_range)  
    {   
        flag = 4;  
    }  

    if(data>=release_button - button_release_range && data<=release_button + 

button_release_range && flag == 4)  
    {  
        Remote.previous();  
        flag = 0;  
        delay(10);  
        Remote.clear();  
    }  

    if(millis()-eventTime>time_holding && data >= previous - button_range && data <= 

previous + button_range && flag == 4 || data >= previous - button_range && data <= 

previous + button_range && flag == 3)  
    {   
        Remote.rewind(); 
        flag = 3;  
        Remote.clear();  
        delay(100);  
    }  

    //********************** Play/pause + Mute ************************************   

    if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause 

- button_range && data <= play_pause + button_range)  
    {   
        flag = 7;  
    }  

    if(data>=release_button - button_release_range && data<=release_button + 

button_release_range && flag == 7)  
    {  
        Remote.play_pause();   
        flag = 0;  
        delay(10);  
        Remote.clear();  
    }  

    if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= 

play_pause + button_range && flag == 7)  
    {   
        Remote.mute(); 
        flag = 0; 
        delay(10); 
        Remote.clear();  
    }  

    if(data>=release_button - button_release_range && data<=release_button + 

button_release_range && flag == 3 || data>=release_button - button_release_range && 

data<=release_button + button_release_range && flag == 5 || data>=release_button - 

button_release_range && data<=release_button + button_release_range && flag == 6)  
    {  
        flag = 0;  
    }   
}
__________________

AUDI A6 (C5) V6 2.8L
TransF вне форума   Ответить с цитированием
Старый 23.07.2015, 14:59   #10
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 132
TransF is on a distinguished road
По умолчанию

Уважаемый lti1 прислал мне свой скетч для энекодера

Код HTML:
//Скетч регулятора громкости на энкодере для Arduino PRO MICRO 
// энкодер на 8 и 9 пинах  выводы подтянуты к питанию, 
// конденсаторы на землю желательно. 
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно. 
void setup() {             
PCICR=1<<PCIE0; 
PCMSK0=(1<<PCINT5)|(1<<PCINT4); 
pinMode (7,INPUT_PULLUP); 
pinMode (8,INPUT); 
pinMode (9,INPUT); 
attachInterrupt(4, key_mute, FALLING); 
Keyboard.begin(); 
} 
void loop() { } 
  
ISR (PCINT0_vect){ 
static byte old_n=PINB&B00110000; 
byte new_n=PINB&B00110000; 
if (old_n==32&&new_n==48||old_n==16&&new_n==0) { 
        Remote.increase();  
        delay(10);   
        Remote.clear();} 
if (old_n==16&&new_n==48||old_n==32&&new_n==0) { 
        Remote.decrease(); 
        delay(10);   
        Remote.clear();} 
old_n= new_n;
} 
  
void key_mute() {         
        Remote.mute();  
        delay(10);  
        Remote.clear();}  
И он на самом деле шикарный нет ни дребезга ни проскакиваний всё чётко.
Но видимо у меня кривые руки не могу обьеденить скетч для кнопок и энкодера.
Хочу переделать теперь кнопки потому как щелчки не красивые и именно они дают дребезг при нажатии на кнопки хотя новые
__________________

AUDI A6 (C5) V6 2.8L
TransF вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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