Помогите разобраться (Матричная клавиатура 3*3 и меню)

muzfan
Offline
Зарегистрирован: 26.02.2016

Товарищи, помогите разобраться. Пытаюсь организовать простое меню на ардуино с использованием матричной клавиатуры(3*3). При нажатии на 4 и 6 должны листаться пункты меню, вперед и назад, соответственно. А при нажатии на 2 и 8 изменяться значения переменных. Суть проблемы: при нажатии на 4 и 6 листается только вперед, при всем этом 5-ка тоже пролистывает, а 2 и 8 вообще не отрабатывают. Подскажите, пожалуйста, как быть?

 

#include <Keypad.h>
#include <LiquidCrystalRus.h> 


 
const byte ROWS = 4; 
const byte COLS = 3; 
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

byte rowPins[ROWS] = {8, 7, 6, 5}; 
byte colPins[COLS] = {4, 3, 2};  
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// инициализация LCD
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2); 
int menu = 0; 
int speed = 0; 
int time = 0; 


void setup() {
  lcd.begin(16, 2);
}
 
void loop() {
 
  if (keypad.getKey() == '4')
  {
    menu++;
    lcd.clear();
    delay (100);
   
    if (menu > 2)
    {
      menu = 0;
    }
  }
   
  if (keypad.getKey() == '6')
  {
    menu--;
    lcd.clear();
    delay (100);
    if (menu < 0)
    {
      menu = 2;
    }
  }

 
  if ((keypad.getKey() == '2') && (menu == 1))
  {
    speed++;  
    delay(100);
  
    lcd.clear();
    if (speed > 100) 
    {        
      speed = 0; 
    }
  }
  
  if ((keypad.getKey() == '2') && (menu == 2))
  {
    time++;
    delay (100);
  //lcd.clear();
    if (time > 100)
    {
      time = 0;
    }
  }
  
  
   if ((keypad.getKey() == '8') && (menu == 1))
  {
    speed--;  
    delay(100);
  
    lcd.clear();
    if (speed < 0) 
    {        
      speed = 0; 
    }
  }
  
  if ((keypad.getKey() == '8') && (menu == 2))
  {
    time--;
    delay (100);
  //lcd.clear();
    if (time < 0)
    {
      time = 0;
    }
  }
  
  
  if (menu == 0)                
  {  
  lcd.setCursor(0, 0);  
  lcd.print("All information:"); 
  lcd.setCursor(0, 1);      
  lcd.print("Speed=");          
  lcd.print(speed);
  lcd.print(" time=");
  lcd.print(time);
  }
  else if (menu == 1)            
  {                        
  lcd.setCursor(3, 0);      
  lcd.print("Speed:");  
  lcd.setCursor(0, 1);      
  lcd.print(speed);
//  lcd.clear();
  }
 else if (menu == 2)          
  {                        
  lcd.setCursor(5, 0);     
  lcd.print("Time:"); 
  lcd.setCursor(0, 1);       
  lcd.print(time);
//  lcd.clear();
  }
 
}

 

okta
Offline
Зарегистрирован: 10.01.2015

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

okta
Offline
Зарегистрирован: 10.01.2015

ну и в качестве примера ключевых слов: i2c

muzfan
Offline
Зарегистрирован: 26.02.2016

okta пишет:

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

Спасибо за совет, я попробовал использовать незанятые пины, эффект тот же(пункты меню листаются, значения параметров без изменений)

Товарищ Мичман
Offline
Зарегистрирован: 13.02.2016

Определись какая клавиатурная матрица используется 3x3 или 4x3

Да и в 6-й и 7-й стоке беда помоему

okta
Offline
Зарегистрирован: 10.01.2015

muzfan пишет:

okta пишет:

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

Спасибо за совет, я попробовал использовать незанятые пины, эффект тот же(пункты меню листаются, значения параметров без изменений)

Так вам ни кто не скажет, что там у вас происходит. Попробуйте без дисплея, выводить с клавиатуры всё в сериал компа. 

PS А примеры библиотеки клавы сами по себе работают?

muzfan
Offline
Зарегистрирован: 26.02.2016

okta пишет:

Так вам ни кто не скажет, что там у вас происходит. Попробуйте без дисплея, выводить с клавиатуры всё в сериал компа. 

PS А примеры библиотеки клавы сами по себе работают?

 

В сериал, стандартными методами из либы, все значения выводятся верно.

Я скажау больше, они выводились верно, даже тогда, когда клавиатура была подключена на те же пины что и дисплей.

muzfan
Offline
Зарегистрирован: 26.02.2016

Товарищ Мичман пишет:

Определись какая клавиатурная матрица используется 3x3 или 4x3

Да и в 6-й и 7-й стоке беда помоему

Моя ошибка, клавиатура 4*3

 

muzfan
Offline
Зарегистрирован: 26.02.2016

Товарищ Мичман пишет:

Определись какая клавиатурная матрица используется 3x3 или 4x3

Да и в 6-й и 7-й стоке беда помоему

Моя ошибка, клавиатура 4*3