Ввод с Мембранной клавиатуры 4 х 4

Prygunovnp
Offline
Зарегистрирован: 27.07.2015

Добрый день! Мембранная клавиатура с библиотекой Keypad, передает нажатые символы по одному. Подскажите как мне получить число в переменную Byte например 12. Планирую настраимать с ее помощью RTC часы и вводить время таймеров. Вот код в котором с которым я эксперементирую.

#include <Keypad.h> // Подключаем библиотеку 
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char array [10];
char str1[5];
int i =0;
byte t;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
}; 
byte rowPins[ROWS] = {11,10, 9, 8}; 
byte colPins[COLS] = {7, 6, 5, 4}; 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
  Serial.begin(9600);
}
void loop(){
  
  char key = keypad.getKey(); // читаем клавиатуру
  if (key){     // если символ был нажат
    Serial.println(key);    // Передаем название нажатой клавиши в сериал порт
   
   if (key == '#')
   {str1[i] = '\0';
     Serial.println(str1);
     
     for(int a = 0; a<5; a++)
{
t |= str1[a] << (4-a);
}

Serial.print(t);
Serial.println (" eto t");
    // t = byte(str1[0]);
     i = 0;
     
 } //tone(3, (int)key*10, 300); // Издаем звуковой сигнал длиной 300 миллисекунд 
   // array [i] = key;
   //i++; 
   //for (int a = 0; a < 2; a++)
   str1[i] = key;
   i++;}
 

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Гдетто использовал нижепереведенное для ввода шестизначного параметра частоты.

Выод на LCD опционно...

 

long Getln(int col, int row) {
 long result;
 char input_string[6] = {' ',' ',' ',' ',' ',' '}; 
 int counter=0;

  lcd.setCursor(col, row);lcd.print("      ");  lcd.setCursor(col, row);
  lcd.cursor(); lcd.blink();
  
while (1) {
  key = keypad.waitForKey();
  if (key == '#') break;
  input_string[counter]= key;
  lcd.print(input_string[counter]);
  counter++;
  if (counter ==6) break;
}
 result = atol (input_string);
 lcd.setCursor(col, row);
 lcd.noCursor(); lcd.noBlink();
 return result;
}

 

Prygunovnp
Offline
Зарегистрирован: 27.07.2015

Выводить на экран у меня тоже получается с помощью строки или массива.

А вот как потом из него перекинуть в числовую переменную?? Чтоб образовалось одно число.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Prygunovnp пишет:

Выводить на экран у меня тоже получается с помощью строки или массива.

А вот как потом из него перекинуть в числовую переменную?? Чтоб образовалось одно число.

А в чем, собственно проблема? В школе программирование не преподавали?

тысячи*1000+сотни*100+десятки*10+единицы

 

 

Prygunovnp
Offline
Зарегистрирован: 27.07.2015

поясните подробнее алгоритм. Допустим в строке число 2 и 3. что с ними делать чтоб получилось 23.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Prygunovnp пишет:

поясните подробнее алгоритм. Допустим в строке число 2 и 3. что с ними делать чтоб получилось 23.

вы серьезно?

2*10+3

Prygunovnp
Offline
Зарегистрирован: 27.07.2015

Большое спасибо. Идея теперь понятна. Прошу прощения за глупые вопросы. Постараюсь воспроизвести это програмно.

inspiritus
Offline
Зарегистрирован: 17.12.2012

.так ведь в 17 строке, где присвоение result и сидит ответ на Ваш исходный вопрос , а вывод на экран вторичен.

Prygunovnp
Offline
Зарегистрирован: 27.07.2015

Я сделал вот так. Может коряво но работает. Была проблема с кнопкой 0. Никак не хотела выводится. Пришлось извратиться. 

#include <Keypad.h> // Подключаем библиотеку
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
byte array [2];
byte s;
byte s1;
byte s2;
byte i = 0;

char keys[ROWS][COLS] = {
{1, 2, 3, 100},
{4, 5, 6, 101},
{7, 8, 9, 102},
{105, 106, 104, 103}
};
byte rowPins[ROWS] = {11,10, 9, 8};
byte colPins[COLS] = {7, 6, 5, 4};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void Klava(){
byte key = keypad.getKey(); // читаем клавиатуру
if (key){ // если символ был нажат
// Serial.println(key); // Передаем название нажатой клавиши в сериал порт
if (key == 104)
{
s1 = array[0];
s2 = array[1];
if (s1==106)
s1=0;
if (s2==106)
s2=0;
s= 10*s1+s2;
Serial.println(s);
i =0;
array[1] = 0;
}
else
{array[i] = key;
i++;}}}
void setup(){
Serial.begin(9600);
}
void loop(){
Klava();
}