Показать сообщение отдельно
Старый 24.11.2013, 00:06   #191
ilya174
Новый Пользователь
 
Регистрация: 16.01.2011
Регион: 74
Сообщений: 26
ilya174 is on a distinguished road
По умолчанию

Вот что у меня получилось.
Скетч для ардуино уно. Ардуино определяется как HID устройство. В скетче управление планшетом ресистивными кнопками и управление питанием.

Код:
// Для рулевых кнопок
uint8_t buf[8] = { 
  0 };
  
// реле питания звуковой карты  
  #define relePin4 11 
  
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_VOL_MINUS_DELAY   (200)
#define KEY_CH_VOL_PLUS_DELAY    (200)
#define KEY_CH_PAUSE_DELAY       (200)
#define KEY_CH_PREV_TRACK_DELAY  (200)
#define KEY_CH_FORW_TRACK_DELAY  (200)
#define KEY_CH_TAB_DELAY         (200)
#define KEY_CH_ESC_DELAY         (200)
#define KEY_CH_AUDIO_OFF_DELAY   (400)
#define KEY_CH_PLUS_DELAY        (200)
#define KEY_MODE_DELAY           (200)
#define KEY_MODE_DELAY           (200)
#define KEY_MODE_DELAY           (200)
#define KEY_MODE_DELAY           (200)

// Значения кнопок
#define KEY_CH_VOL_MINUS     (1023)
#define KEY_CH_VOL_PLUS      (1523)
#define KEY_CH_PAUSE         (1500)
#define KEY_CH_PREV_TRACK    (1500)
#define KEY_CH_FORW_TRACK    (1500)
#define KEY_CH_TAB           (1500)
#define KEY_CH_ESC           (1500)
#define KEY_CH_AUDIO_OFF     (700)
#define KEY_CH_PLUS          (1500)
#define KEY_CH_MINUS         (1500)
#define KEY_CH_MINUS         (1500)
#define KEY_CH_MINUS         (1500)
#define KEY_CH_MINUS         (1500)


// Погрешность при чтении кнопок
#define KEY_DELTA       (50)

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_VOL_MINUS        (226)    
#define CH_VOL_PLUS         (43)
#define CH_PAUSE            (3)
#define CH_PREV_TRACK       (4)
#define CH_FORW_TRACK       (5)
#define CH_TAB              (14)
#define CH_ESC              (128)
#define CH_AUDIO_OFF        (1)
#define CH_PLUS             (6)
#define CH_MINUS            (7)
#define CH_MINUS            (8)
#define CH_MINUS            (9)
#define CH_MINUS            (12)
#define NONE                (0)

// Кнопки
#define ACCPin 2 // через делитель к ACC
#define ControlPin A1 // через делитель к +12В
#define relePin1 8 // реле USB HUB
#define relePin2 9 // реле планшета (OTG)
#define relePin3 10 // реле звуковой карты (замыкания на землю)        	
#define ONHUB 1000 // время включения реле HUB
#define ONTablet 4000 // время включения планшета
#define ONAudio 9000 // время включения аудио        
#define OFFHUB 8000 // время выключения реле HUB
#define OFFTablet 3000 // время выключения планшета
#define OFFAudio 10 // время выключения аудио        

unsigned long LastTimeKeyPressed = millis();
unsigned long duration, millisold, off = 0;
boolean stateACC, relestate1, relestate2,relestate3,relestate4  = 0;
int LastKeyPressed = NONE;
int flag = 1;
int flag2 = 0;
void setup()      
{  
Serial.begin(9600);
pinMode(relePin1, OUTPUT); 
pinMode(relePin2, OUTPUT);
pinMode(relePin3, OUTPUT);
pinMode(relePin4, OUTPUT);
}      

void loop()      
{   
  ReadSteering();
  Knopki();
  delay(10);
} 

// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()      
{   
  pinMode(relePin4, OUTPUT);
  digitalWrite(relePin4,flag );
  unsigned long TimeKeyPressed;
  int KeyPressed = NONE;
  int dt1 = analogRead(A0);
  delay(10); 
  int dt2 = analogRead(A0); 
  if (abs(dt1-dt2)<=490 and dt1<1024 ) //если нет дребезга и что-то есть
  { 
    // Регистрируем время нажатия кнопки
    
    TimeKeyPressed = millis();  //получить реальное время     
    
    //CH_VOL_MINUS    
    if ( (dt1-KEY_DELTA <= KEY_CH_VOL_MINUS) and (dt1+KEY_DELTA >= KEY_CH_VOL_MINUS) )
    {
      if ( (LastKeyPressed != CH_VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_VOL_MINUS_DELAY))
      { 
        LastKeyPressed = CH_VOL_MINUS;        
        buf[2] = CH_VOL_MINUS;                 
    LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();
      }
    }  
    //CH_VOL_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_CH_VOL_PLUS) )
    {
      if ( (LastKeyPressed != CH_VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_VOL_PLUS_DELAY) )
      {
        LastKeyPressed = CH_VOL_PLUS;
        buf[2]=CH_VOL_PLUS;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();        
      }  
    }
    //CH_PAUSE
    else if ( (dt1-KEY_DELTA <= KEY_CH_PAUSE) and (dt1+KEY_DELTA >=KEY_CH_PAUSE) )
    {
      if ( (LastKeyPressed != CH_PAUSE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PAUSE_DELAY) )
      {
        LastKeyPressed = CH_PAUSE;
        buf[2]=CH_PAUSE;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();        
      }  
    }
    //CH_PREV_TRACK
    else if ( (dt1-KEY_DELTA <= KEY_CH_PREV_TRACK) and (dt1+KEY_DELTA >=KEY_CH_PREV_TRACK) )
    {
      if ( (LastKeyPressed != CH_PREV_TRACK) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PREV_TRACK_DELAY) )
      {
        LastKeyPressed = CH_PREV_TRACK;
        buf[2]=CH_PREV_TRACK;
        
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();        
      }  
    }
    //CH_FORW_TRACK
    else if ( (dt1-KEY_DELTA <= KEY_CH_FORW_TRACK) and (dt1+KEY_DELTA >=KEY_CH_FORW_TRACK) )
    {
      if ( (LastKeyPressed != CH_FORW_TRACK) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_FORW_TRACK_DELAY) )
      {
        LastKeyPressed = CH_FORW_TRACK;
        buf[2]=CH_FORW_TRACK;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();       
      }  
    }
    //CH_TAB
    else if ( (dt1-KEY_DELTA <= KEY_CH_TAB) and (dt1+KEY_DELTA >=KEY_CH_TAB) )
    {
      if ( (LastKeyPressed != CH_TAB) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_TAB_DELAY) )
      {
        LastKeyPressed = CH_TAB;
        buf[2]=CH_TAB;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();        
      }  
    }
    //CH_ESC
    else if ( (dt1-KEY_DELTA <= KEY_CH_ESC) and (dt1+KEY_DELTA >=KEY_CH_ESC) )
    {
      if ( (LastKeyPressed != CH_ESC) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_ESC_DELAY) )
      {
        LastKeyPressed = CH_ESC;
        buf[2]=CH_ESC;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();        
      }  
    }
    //CH_AUDIO_OFF    
    else if ( (dt1-KEY_DELTA <= KEY_CH_AUDIO_OFF) and (dt1+KEY_DELTA >=KEY_CH_AUDIO_OFF) )
    {      
      if ( (LastKeyPressed != CH_AUDIO_OFF) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_AUDIO_OFF_DELAY)&& flag==1)      
      {        
        digitalWrite(relePin4, flag2);
         flag = 0;
         flag2 = 1;
        }
         else if ( (LastKeyPressed != CH_AUDIO_OFF) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_AUDIO_OFF_DELAY)&& flag==0)
      {       
         digitalWrite(relePin4, flag2);        
         flag = 1;
         flag2 = 0;
        }        
        LastKeyPressed = CH_AUDIO_OFF;  
   LastTimeKeyPressed = TimeKeyPressed;     
        releaseKey();                
      }  
    
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        buf[2]=CH_MINUS;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();         
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        buf[2]=CH_MINUS;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();         
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        buf[2]=CH_MINUS;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();         
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        buf[2]=CH_MINUS;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();         
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        buf[2]=CH_MINUS;
         LastTimeKeyPressed = TimeKeyPressed;
     Serial.write(buf, 8);	
    releaseKey();        
      }  
    }
  }   
}

void releaseKey() 
{
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8);	// Release key  
}
  
void  Knopki()
{
  if (digitalRead(ACCPin)&&!stateACC) {
    stateACC=1;
    duration = millis();
    }
    if (!digitalRead(ACCPin)&&stateACC) {
    stateACC=0;
    off = millis();
        }
    if(digitalRead(ACCPin) && stateACC && millis ()-duration > ONHUB){
    digitalWrite(relePin1, HIGH);
    relestate1 = 1;
    millisold = millis();
    }
    if(digitalRead(ACCPin) && stateACC &&  millis ()-duration > ONTablet){
    digitalWrite(relePin2, HIGH);
    relestate2 = 1;
    millisold = millis();
    }
    if(digitalRead(ACCPin) && stateACC &&  millis ()-duration > ONAudio){
    digitalWrite(relePin3, HIGH);
    relestate3 = 1;
    millisold = millis();
    }    
 if(!digitalRead(ACCPin) && !stateACC && millis () -off> OFFHUB){
    digitalWrite(relePin1, LOW);
    relestate1 = 0;
    millisold = millis();    
  } 
if(!digitalRead(ACCPin) && !stateACC &&  millis () -off > OFFTablet){
    digitalWrite(relePin2, LOW);
    relestate2 = 0;
    millisold = millis();     
  } 
 if(!digitalRead(ACCPin) && !stateACC &&  millis () -off > OFFAudio){
    digitalWrite(relePin3, LOW);
    relestate3 = 0;
    millisold = millis();     
  } 
}
ilya174 вне форума   Ответить с цитированием