Помогите с матричной клавиатурой

michaelukolov
Offline
Зарегистрирован: 16.04.2015

Подключил матричную клавиатуру к Arduino Mega 2560 R3. Всё работает отлично, но хотелось бы сделать так: нажимаю на звездочку - ввожу старый код - ввожу новый код - сохраняется. Как это реализовать можно?

 

#include <Keypad.h>

char* secretCode = "1234";
int position = 0;
 
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);
 
int redPin = 12;
int greenPin = 53;
 
void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  setLocked(true);
}
 
void loop()
{
  char key = keypad.getKey();
  if (key == '#') {
    position = 0;
    setLocked(true);
  }
  if (key == secretCode[position]) {
    position++;
  }
  if (position == 6) {
    setLocked(false);
  }
  delay(50);
}
 
void setLocked(int locked)
{
  if (locked) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);
  }
  else {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
  }
}

Также хотил спросить по саму микруху. Это нормально, что она после 20-25 минут на ощупь теплая?

Alexino
Offline
Зарегистрирован: 29.12.2015

michaelukolov пишет:
Как это реализовать можно?
Очевидно же - написать в программе условие "если нажата звёздочка" и начать ввод с клавиатуры. Ввод у Вас рабоатет отлично, значит с ним проблем нет, выходит осталось просто одно единственное условие - узнать нажата ли звёздочка.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

michaelukolov пишет:
нажимаю на звездочку - ввожу старый код - ввожу новый код - сохраняется. Как это реализовать можно?

Попробуй так:

if (key == '*')
{
  char oldCode[4];
  for (i=0; i<4; i++) oldCode[i] = keypad.getkey();
  //по идее надо проверить, что старый код совпадает с ранее запомненным
  char newCode[4];
  for (i=0; i<4; i++) newCode[i] = keypad.getkey();
  //а тут надо сохранить где-то новый код
}

 

MacSim
Offline
Зарегистрирован: 28.11.2012
void loop()
{
  char key = keypad.getKey();

if (key == '*') { 
while ((key == '*') || (key == NO_KEY) ){ key = keypad.getKey();}
secretCode[0] = key;
while ((key ==secretCode[0]) || (key == NO_KEY) ){ key = keypad.getKey();}
secretCode[1] = key;
while ((key ==secretCode[1]) || (key == NO_KEY) ){ key = keypad.getKey();}
secretCode[2] = key;
while ((key ==secretCode[2]) || (key == NO_KEY) ){ key = keypad.getKey();}
secretCode[3] = key;

}


if (key == '#') {
    position = 0;
    setLocked(true);
  }
  if (key == secretCode[position]) {
    position++;
  }
  if (position == 6) {
    setLocked(false);
  }
  delay(50);
}

Как-то так, конечно по китайски, зато понятно. Можно в цикл загнать.

MacSim
Offline
Зарегистрирован: 28.11.2012

Andy пишет:

 

Попробуй так:


вот не пройдет компиль топикстартер спросит почему?

и не уверен что все 4 цифры кода не получаться одинаковыми с одного нажатия. может это в библе и реализовано.

michaelukolov
Offline
Зарегистрирован: 16.04.2015

Ок, спасибо!

А по поводу температуры ничего? Сейчас подключил матричную клавиатуру и дисплей HD44780. Спустя пару минут - микруха теплая, градусов под 40-45.