Эмулятор клавиатуры usb с резистивными кнопками. Проблема с зависанием arduino.

Нет ответов
defed
Offline
Зарегистрирован: 27.10.2015

Здравствуйте есть скетч и ардуино про  микро. собран эмулятор клавиатуры с резистивными кнопками. Все отлично работает. Но есть проблема. если планшет включается уже вместе с физически подключенным эмулятором, то эмулятор зависает до отключения и подключения обратно или  reset ....  на другом планшете все работает отлично. Подскажите может кто знает как можно победить проблему??

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

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

int release_button = 0; // значение при отпущенных кнопках 
int button_release_range = 200; // диапазон значения + - при отпущенных кнопках 
int button_range = 7; // диапазон значения нажатых кнопок + - 
int time_holding = 500; // время для удержания кнопок в миллисекундах 
int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах 
int vol_up = 470; // значение кнопки увеличить громкость 
int vol_down = 563; // значение кнопки уменьшить громкость 
int alt_tab = 795; // значение кнопки которая будет работать как Alt + Tab 
int next = 740; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании 
int previous = 689; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании 
int play_pause = 933; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании 
int f3 = 492;
int f4 = 513;

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

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, key_mute, FALLING);

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-1 && data >= f3 - button_range && data <= f3 + button_range && flag == 0) //f3 начало
{   
Keyboard.press(KEY_F3);  
flag = 5;  
delay(10);  
Keyboard.releaseAll();  
}//f3 конец

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= f4 - button_range && data <= f4 + button_range && flag == 0) //f4 начало
{   
Keyboard.press(KEY_F4);  
flag = 5;  
delay(10);  
Keyboard.releaseAll();  
}//f4 конец


if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0) 
{   
Keyboard.press(KEY_F1);  
flag = 5;  
delay(10);  
Keyboard.releaseAll();  
}  

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)  
{   
Keyboard.press(KEY_F2);  
flag = 6;  
delay(10);  
Keyboard.releaseAll();  
}  

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;  
}   
}  

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();}