Кнопочный кодовый замок

2traxtibidox6
Offline
Зарегистрирован: 23.10.2020
#define RED   5
#define GREEN   6
#define ONE_BUTTON_PIN     2
#define TWO_BUTTON_PIN    3
#define THREE_BUTTON_PIN     4
#define LED_PIN             9
#define BUZZER_PIN   7
char myarraw[ 3] = { '1', '2', '3'}; 
char button_pressed [3];

boolean oneUp = true;
boolean twoUp = true;
boolean threeUp = true;
 
void setup()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(ONE_BUTTON_PIN, INPUT_PULLUP);
  pinMode(TWO_BUTTON_PIN, INPUT_PULLUP);
  pinMode(THREE_BUTTON_PIN, INPUT_PULLUP);
}
 
void loop()
{
  
  // реагируем на нажатия с помощью функции
  oneUp = handleClick(ONE_BUTTON_PIN, oneUp, '1', 0);
  twoUp = handleClick(TWO_BUTTON_PIN, twoUp, '2', 1);
  threeUp = handleClick(THREE_BUTTON_PIN, threeUp, '3', 2);
  
}
boolean handleClick(int buttonPin, boolean wasUp, int CIF, int MAS )
{
  boolean isUp = digitalRead(buttonPin);
  if (wasUp && !isUp) {
    delay(10);
    isUp = digitalRead(buttonPin);
    // если был клик, вписываем в массив число
    if (!isUp)  
      button_pressed [MAS] = CIF;
     
  }
  return isUp; 
}

 

Нужна помощь, не могу понять, как осуществить запоминание нажатых клавиш, по заданию нужно сделать пример кодового замка, который по правильному порядку нажатий зажигал зелёный, в противном случае пищал и горел красный. Я думал использовать ввод в массив и потом сравнивать их, а на деле ничего не вышло.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

kalapanga
Offline
Зарегистрирован: 23.10.2016

Не надо их запоминать. Нужна одна переменная-счетчик, она же индекс проверяемого элемента кодовой последовательности. Начинается процесс с 0. Нажата правильная кнопка - увеличиваем счетчик на единичку. Если дошли до конца - открываем. При нажатии неправильной кнопки либо ничего не делаем, или правильнее наверное сбрасывать счетчик в 0.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

kalapanga пишет:

Не надо их запоминать. Нужна одна переменная-счетчик, она же индекс проверяемого элемента кодовой последовательности. Начинается процесс с 0. Нажата правильная кнопка - увеличиваем счетчик на единичку. Если дошли до конца - открываем. При нажатии неправильной кнопки либо ничего не делаем, или правильнее наверное сбрасывать счетчик в 0.

И следующее задание будет, отмасштабировать код на 10 кнопок...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

kalapanga
Offline
Зарегистрирован: 23.10.2016

Kakmyc пишет:
И следующее задание будет, отмасштабировать код на 10 кнопок...

И в чём проблема? 

b707
Offline
Зарегистрирован: 26.05.2017

2traxtibidox6 пишет:

Нужна помощь, не могу понять, как осуществить запоминание нажатых клавиш, по заданию нужно сделать пример кодового замка, который по правильному порядку нажатий зажигал зелёный, в противном случае пищал и горел красный. Я думал использовать ввод в массив и потом сравнивать их, а на деле ничего не вышло.

Зачем вы переменную MAS жестко задаете при чтении кнопок в строчках 28-30?

Подробнее поясню в чем ошибка. Возьмем строчку 28, в ней вы читаете кнопку с цифрой '1'. И задаете ей нулевую позицию в массиве (последний параметр функции). Аналогично во втрой строке вы пишете '2' строго во вторую позицию, в третьей строчке пишете тройку в третью.

Что это означает на практике? - что какое бы число вы не вводили, всегда на выходе будет получаться "123"

Kakmyc
Offline
Зарегистрирован: 15.01.2018

kalapanga пишет:

Kakmyc пишет:
И следующее задание будет, отмасштабировать код на 10 кнопок...

И в чём проблема? 

В том, что портянка увеличится в 3 раза.

2traxtibidox6
Offline
Зарегистрирован: 23.10.2020

Я задаю переменную в MAS, для того, чтобы в кончном счёте сравнить 2 массива, который я в начале задал 123 и который получится после нажатия кнопок. Т. е. если я кнопки нажму в обратном порядке, получится 321, но по факту так не сработает.

b707
Offline
Зарегистрирован: 26.05.2017

2traxtibidox6 пишет:
Т. е. если я кнопки нажму в обратном порядке, получится 321, но по факту так не сработает.
Я обсуждаю, как сейчас написан код - и там без разницы, что вы нажмете 1-2-3, что 3-2-1 - в массиве button_pressed[] всегда будет "123"

Впрочем, если вы не согласны - дело ваше.  Я вам подсказал, где у вас ошибка - а дальше хотите исправляйте, хотите нет...мне как-то пофиг,  это ведь у вас не работает, а не у меня.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

То ТС:

Учите массивы! Программа бредовая, но boolean handleClick() вполне нормальная. Если с ее результатом каждый раз делать логическое "И" с предыдущим результатом, то в конце получим результат набора кода. Только логическую переменную надо инициировать TRUE.

SLKH
Offline
Зарегистрирован: 17.08.2015

kalapanga пишет:

Не надо их запоминать. Нужна одна переменная-счетчик, она же индекс проверяемого элемента кодовой последовательности. Начинается процесс с 0. Нажата правильная кнопка - увеличиваем счетчик на единичку. Если дошли до конца - открываем. При нажатии неправильной кнопки либо ничего не делаем, или правильнее наверное сбрасывать счетчик в 0.

дополнительно: устанавливаем boolean var=true; при первом нажатии любой кнопки запускаем таймер. 

при очередном нажатии сравниваем с очередным значением из массива. если кнопка неправильная - сбрасываем переменную в false.

при достижении счетчиком заданного числа нажатий, при условии var==true открываем дверь.

иначе равнодушно ждем, не обращая внимания на кнопки, сброса по таймауту и включаем сигнал "ПНХ". возможно, блокируем очередную попытку ввода, например, на 30 секунд.