Помогите обработать долгое нажатие кнопки

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

ВСем привет! пытаюсь обработать матрицу клавиатуры, с кнопками разобрался по поводу длительного нажатия не могу! что не так делаю...

/////////////////////////////////////////////////////////////////
// джойстик
#define rows 3
#define cols 2
// номера кнопок в соответствии со схемой
const byte keys[rows][cols] = 
{
  {1,4},
  {2,5},
  {6,3}
};

const byte rowPins[rows] = {10, 9, 8}; // строки (желтый10, зеленый9, голубой8)
const byte colPins[cols] = {7, 5}; // столбцы (черный7, красный5)

// маски для клавиш
#define MaskMediaButton      1 
#define MaskRadioButton      2
#define MaskVolumeUpButton   4
#define MaskVolumeDownButton 8
#define MaskOkButton         16
#define MaskMuteButton       32 
#define MaskScrollDown       64 
#define MaskScrollUp         128 
#define MaskFastPress        256
#define MaskLongPress        512

unsigned long startlongpresstime;
bool oldpressed;
/////////////////////////////////////////////////////////////////
void setup() 
{ 
  int i;
  // строки - на выход
  for (i = 0; i < rows; ++i)
  {
    pinMode(rowPins[i], OUTPUT);
  }
  
  // столбцы - на вход
  for (i = 0; i < cols; ++i)
  {
    pinMode(colPins[i], INPUT);
    digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор  
  }

  // столбец для енкодера
  pinMode(encoderPin, INPUT);
  digitalWrite(encoderPin, HIGH); // включаем подтягивающий резистор  
  oldpressed = false;

}

// сканирование джойстика
unsigned int scan(void)
{ 
  int i, j;
  unsigned int code = 0;
  bool pressed = false;
        
  for (i = 0; i < rows; ++i)
  {
    digitalWrite(rowPins[i], LOW);
 
    for (j = 0; j < cols; ++j)
    { 
      if(digitalRead(colPins[j]) == false)
      {  
        code |= 1 << (keys[i][j] - 1);
        pressed = true; 
      }         
    }
  }//конец циклов

   ///////////////////////////////////////////////////////////////
   if (pressed == true)
   {
    if (oldpressed == false)
    {
      startlongpresstime = millis();
    }
    else
    {
      if (millis() - startlongpresstime > 1000 && (code & MaskOkButton)) // значение временного промежутка в мс
      {
       startlongpresstime = millis(); // сброс счетчика. иначе признак будет выполняться каждый цикл опроса
       code |= 512;  
      }
      if (millis() - startlongpresstime < 1000 && (code & MaskOkButton) ) // значение временного промежутка в мс
      {
       startlongpresstime = millis(); // сброс счетчика. иначе признак будет выполняться каждый цикл опроса
       code |= 256;  
      }
    }
  } 
    oldpressed = pressed;
/////////////////////////////////////////////////////////////
  
  return code; 
}
// цикл программы

void loop() 
{
  unsigned int code;
  
  code = scan();

    if (code & MaskMediaButton){
    Serial.print("Source>");
    Serial.println();
    }
    

 
    if (code & MaskRadioButton){
    Serial.print("Source<");
    Serial.println();
    }
    

    if (code & MaskVolumeUpButton){
    Serial.print("VolumeUp");
    Serial.println();
    }


  if (code & MaskVolumeDownButton){
    Serial.print("volumeDown");
    Serial.println();
    }


  if (code & MaskFastPress){
        Serial.print("TRFast");
        Serial.println();
    }

  if (code & MaskLongPress){
        Serial.print("TRLong");
        Serial.println();
  }
  


  if (code & MaskMuteButton){ 
    Serial.print("Mute");
    Serial.println();
    }

  if (code & MaskScrollDown){
    Serial.print("RotateDown");
    Serial.println();
    }

  if (code & MaskScrollUp){
    Serial.print("RotateUp");
    Serial.println();
    }
   
}

 

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

Похоже помочь не кому!(

Boris1969
Offline
Зарегистрирован: 21.04.2016

Можно использовать прерывания в режиме CHANGE. Вызов прерывания при нажатии и отпускании кнопки. Правда при этом другими кнопками пользоваться нельзя.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Здесь есть готовый класс для работы с кнопками. Длтнное короткое нажатие, автоповтор, подваление дребезка контактов

http://samopal.pro/arduino-button-2/