Показано с 1 по 10 из 561

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Пользователь
    Регистрация
    20.02.2009
    Возраст
    51
    Сообщений
    44
    Вес репутации
    211

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Цитата Сообщение от Hmelik Посмотреть сообщение
    я в итоге решил переделать на кнопки с резисторных на матричные.
    Не удалось достичь успеха. Пробовал менять время в прошивке.
    Добился что получаю двойное нажатие, с стандартным параметром тоже устойчивость не радует, или нажмёт 1 раз и быстро, или не нажмёт ваще, или выдаст двойное нажатие(т.к. если не сработало продолжаю держать)
    Добавлю свои 5 копеек. Такие же проблемы были, сколько не изгалялся с подбором времени задержки "дребезга" - не удалось добиться полность 100% реакции, как в штатной магнитоле.
    В итоге перенес логику определения какая кнопка нажата полностью в ардуину, т.е. на выходе она выдает в компорт код нажатой кнопки, а не значение из АЦП. Получилось громоздко, зато теперь никаких двойных нажатий или проглатывания нажатой кнопки нет.


    PHP код:

    // Для рулевых кнопок
    // Задержки между нажатиями конкретных кнопок, миллисекунды
    #define KEY_CH_MINUS_DELAY    (200)
    #define KEY_CH_PLUS_DELAY     (200)
    #define KEY_VOL_MINUS_DELAY   (150)
    #define KEY_VOL_PLUS_DELAY    (150)
    #define KEY_MODE_DELAY        (300)

    // Значения кнопок
    #define KEY_CH_MINUS    (445)
    #define KEY_CH_PLUS     (640)
    #define KEY_VOL_MINUS   (90)
    #define KEY_VOL_PLUS    (270)
    #define KEY_MODE        (805)

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

    // Коды кнопок, что отсылаем в порт внешней проге
    #define CH_MINUS    (1)
    #define CH_PLUS     (2)
    #define VOL_MINUS   (3)
    #define VOL_PLUS    (4)
    #define MODE        (5)
    #define NONE        (0)


    unsigned long LastTimeKeyPressed millis();
    int LastKeyPressed NONE;

    void setup()      
    {     
    Serial.begin(57600);
    }      

    void loop()      
    {   
      
    ReadSteering();
      
    delay(50);


    // Читает рулевые кнопки и пишет в порт код нажатой кнопки
    void ReadSteering()      
    {   
      
    unsigned long TimeKeyPressed;
      
    int KeyPressed NONE;
      
    int dt1 analogRead(0);
      
    delay(50); 
      
    int dt2 analogRead(0);
      if (
    abs(dt1-dt2)<=and dt1<900 //если нет дребезга и что-то есть
      

        
    // Регистрируем время нажатия кнопки
        
    TimeKeyPressed millis();

        
    //CH_MINUS    
        
    if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
        {
          if ( (
    LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
          {
            
    LastKeyPressed CH_MINUS;
            
    KeyPressed CH_MINUS;
            
    LastTimeKeyPressed TimeKeyPressed;
          }  
        }
        
    //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;
            
    KeyPressed CH_PLUS;
            
    LastTimeKeyPressed TimeKeyPressed;
          }  
        }
        
    //VOL_MINUS
        
    else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
        {
          if ( (
    LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
          {
            
    LastKeyPressed VOL_MINUS;
            
    KeyPressed VOL_MINUS;
            
    LastTimeKeyPressed TimeKeyPressed;
          }  
        }
        
    //VOL_PLUS
        
    else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
        {
          if ( (
    LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
          {
            
    LastKeyPressed VOL_PLUS;
            
    KeyPressed VOL_PLUS;
            
    LastTimeKeyPressed TimeKeyPressed;
          }
        }
        
    //MODE
        
    else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) )
        {
          if ( (
    LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) )
          {
            
    LastKeyPressed MODE;
            
    KeyPressed MODE;
            
    LastTimeKeyPressed TimeKeyPressed;
          }  
        }
        
        if (
    KeyPressed != NONE)
        {
          
    Serial.print(char(255));
          
    Serial.print(KeyPressed,DEC);
        }  

        
    //Serial.print(dt1,DEC);
        //Serial.print("   ");
        //Serial.println(dt2,DEC);
      
    }   

    Последний раз редактировалось Hamster; 15.03.2010 в 01:33.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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