Кнопочный кодовый замок
- Войдите на сайт для отправки комментариев
Пт, 23/10/2020 - 17:22
#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; }
Нужна помощь, не могу понять, как осуществить запоминание нажатых клавиш, по заданию нужно сделать пример кодового замка, который по правильному порядку нажатий зажигал зелёный, в противном случае пищал и горел красный. Я думал использовать ввод в массив и потом сравнивать их, а на деле ничего не вышло.
Все "по заданию" в теме "Ищу исполнителя" помогают делать. В обмен на материальные блага.
Не надо их запоминать. Нужна одна переменная-счетчик, она же индекс проверяемого элемента кодовой последовательности. Начинается процесс с 0. Нажата правильная кнопка - увеличиваем счетчик на единичку. Если дошли до конца - открываем. При нажатии неправильной кнопки либо ничего не делаем, или правильнее наверное сбрасывать счетчик в 0.
Не надо их запоминать. Нужна одна переменная-счетчик, она же индекс проверяемого элемента кодовой последовательности. Начинается процесс с 0. Нажата правильная кнопка - увеличиваем счетчик на единичку. Если дошли до конца - открываем. При нажатии неправильной кнопки либо ничего не делаем, или правильнее наверное сбрасывать счетчик в 0.
И следующее задание будет, отмасштабировать код на 10 кнопок...
Да и начать нужно с того, что с таким обработчиком нажатий, код будет совпадать один раз из пяти, даже если нажимать нужные кнопки.
И в чём проблема?
Нужна помощь, не могу понять, как осуществить запоминание нажатых клавиш, по заданию нужно сделать пример кодового замка, который по правильному порядку нажатий зажигал зелёный, в противном случае пищал и горел красный. Я думал использовать ввод в массив и потом сравнивать их, а на деле ничего не вышло.
Зачем вы переменную MAS жестко задаете при чтении кнопок в строчках 28-30?
Подробнее поясню в чем ошибка. Возьмем строчку 28, в ней вы читаете кнопку с цифрой '1'. И задаете ей нулевую позицию в массиве (последний параметр функции). Аналогично во втрой строке вы пишете '2' строго во вторую позицию, в третьей строчке пишете тройку в третью.
Что это означает на практике? - что какое бы число вы не вводили, всегда на выходе будет получаться "123"
И в чём проблема?
В том, что портянка увеличится в 3 раза.
Я задаю переменную в MAS, для того, чтобы в кончном счёте сравнить 2 массива, который я в начале задал 123 и который получится после нажатия кнопок. Т. е. если я кнопки нажму в обратном порядке, получится 321, но по факту так не сработает.
Впрочем, если вы не согласны - дело ваше. Я вам подсказал, где у вас ошибка - а дальше хотите исправляйте, хотите нет...мне как-то пофиг, это ведь у вас не работает, а не у меня.
То ТС:
Учите массивы! Программа бредовая, но boolean handleClick() вполне нормальная. Если с ее результатом каждый раз делать логическое "И" с предыдущим результатом, то в конце получим результат набора кода. Только логическую переменную надо инициировать TRUE.
Не надо их запоминать. Нужна одна переменная-счетчик, она же индекс проверяемого элемента кодовой последовательности. Начинается процесс с 0. Нажата правильная кнопка - увеличиваем счетчик на единичку. Если дошли до конца - открываем. При нажатии неправильной кнопки либо ничего не делаем, или правильнее наверное сбрасывать счетчик в 0.
при очередном нажатии сравниваем с очередным значением из массива. если кнопка неправильная - сбрасываем переменную в false.
при достижении счетчиком заданного числа нажатий, при условии var==true открываем дверь.
иначе равнодушно ждем, не обращая внимания на кнопки, сброса по таймауту и включаем сигнал "ПНХ". возможно, блокируем очередную попытку ввода, например, на 30 секунд.