Замок.Вывод данных на LCD
- Войдите на сайт для отправки комментариев
Приветствую. Работаю над кодовым замком. Ход мыслей таков. Есть код который изначально храниться в памяти (например 1111-стартовый всегда одинаковый) если нажата определенная доп клавиша пароль можно изменить, если нажаты клавиши матричной клавиатуры в определенной последовательности (той которая совпадает с паролем) то на определенный пин подается высокий сигнал если нет то ничего не происходит. При этом все действия описываются на дисплее 1602. Хочу написать код но либо команд не знаю либо недопонимаю как они работаю. Написал код и сразу столкнулся с трудностью. Цифра введенная на клавиатуре пишется в 1 столбце 2 строки а последующее нажатие другой цифры просто ее меняет. Как сделать что бы нажатые клавиши двигались по столбцу второй строки соответственно с нажатием? Про пароль пока не прашиваю, пытаюсь пройти все этапы с нуля.
#include <LiquidCrystal.h> // Библиотека дисплей #include <Keypad.h> // Библиотека клавиатуры LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины const byte ROWS = 4; // 4 строки const byte COLS = 3; // 3 столбца char keys[ROWS][COLS] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; byte rowPins[ROWS] = {2, 3, 4, 5}; byte colPins[COLS] = {6, 7, 8}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); int relay = 10; // Задаем пины релле void setup() { Serial.begin(9600); lcd.begin(16, 2); // Задаем размерность экрана lcd.setCursor(5, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Welcom"); // Выводим текст lcd.setCursor(3, 1); // Устанавливаем курсор в начало 2 строки lcd.print("Enter Pin"); // Выводим текст } void loop() { char key = keypad.getKey(); if (key) { lcd.clear(); // Очищаем дисплей если нажата кнопка lcd.setCursor(3, 0); // устанавливаем курсор на 1 строку lcd.print("<< PIN >>"); // Пишем ПИН lcd.setCursor(0, 1); // Устанавливаем курсор на 2 строку lcd.print(key); // Выводим цифру нажатую на клавиатуре } }
Запоминай позицию, в которую надо писать цифру, введённую на клавиатуре. Как только ввели цифру - записал её на дисплей, увеличил позицию на 1.
А ещё лучше, т.к. цифр всего 4 - просто тупо держать массив из четырёх символов, и заполнять его по мере введения цифр с клавиатуры, по факту изменения массива - печатать его на экран.
Запоминай позицию, в которую надо писать цифру, введённую на клавиатуре. Как только ввели цифру - записал её на дисплей, увеличил позицию на 1.
А ещё лучше, т.к. цифр всего 4 - просто тупо держать массив из четырёх символов, и заполнять его по мере введения цифр с клавиатуры, по факту изменения массива - печатать его на экран.
Цифр может быть и не 4 а любое количество. Просто наиболее часто используют 4. Так что мне подходит первый вариант. Как запонить позицию? Через какой цикл? Если не сложно продемонстрируйте код?
Цифр может быть и не 4 а любое количество. Просто наиболее часто используют 4. Так что мне подходит первый вариант. Как запонить позицию? Через какой цикл? Если не сложно продемонстрируйте код?
Вопрос #1. Что на ваш взгляд означают две цифры в команде lcd.setCursor(0, 1) ?
Вопрос #2. Могут ли быть данный цифры заменены на переменные (подсказка - проведите натурный эксперимент)?
Цифр может быть и не 4 а любое количество. Просто наиболее часто используют 4. Так что мне подходит первый вариант. Как запонить позицию? Через какой цикл? Если не сложно продемонстрируйте код?
Вопрос #1. Что на ваш взгляд означают две цифры в команде lcd.setCursor(0, 1) ?
Вопрос #2. Могут ли быть данный цифры заменены на переменные (подсказка - проведите натурный эксперимент)?
Конечно можно заменить на переменные. Это значение столбцов и строк. Вот код с использованием вашей подсказки. Однако результат не меняется вообще. Видимо из-за команды lcd.clear она и не дает переместится на один столбец вперед так как очищает дисплей.
Очищаете вы напрасно, конечно. И x вы так не увеличиваете. Вы просто перепозиционируете курсор LCD на позицию x+1. Обратите внимание на то, что x у вас на каждом loop() обнуляется. Вам нужно объявлять его как глобальную переменную, либо как static, либо внутри лупа делать свой бесконечный цикл (while (true) {} например)
Товарищи прошу прощения. Вообще никак не получается сделать данную операцию. Пробовал и через массив и через переменную записывать результат одинаков. Либо записывается одна цифра либо как в массиве сразу весь массив. причем все значения массива одинаковые. Пробовал вводить глобальную переменную типа char результат такойже. Прошу помощи с кодом если есть возможность конечно.
О да!!! Спасибо всем!!! У меня получилось!!!
Тему прошу не закрывать ибо вопросы по данному проекту у меня возникнут 100%)))
Вот скетч который у меня получился
а вы пробовали читать ответ sadman41 - сообщение #5? - там же все уже описано. Или даже эти три строчки непонятны? - тогда лучше вам бросить ардуино, вы тест на IQ не прошли
Ведь вроде все понятно написали...
Оооо заговорили бородатые дяди, очевидно, неоднократно, проходившие тест IQ для самоутверждения. Так вот своими ответами именно вы отбиваете все желание чем-либо заниматься. Попрошу не язвить и не тыкать носом, а отвечать по мере поступления вопроса либо не отвечать. Извиняюсь.
Товарищи следующий вопрос не заставил себя долго ждать. Каким образом в мой скетч добавить пароль и сравнивать его с введенными цифрами (при этом должна быть возможность изменять пароль)? Через что это все проще всего сделать (массив) ? Если да то как все это правильно вписать. Вот мой скетч.
Введенные символы складывать в массив, пароль в программе тоже хранить в массиве. Как только кол-во введенных символов достигнет нужной длины - сравниваем два массива между собой.
Советую об изменении пароля пока не думать, начните хотя бы с проверки. Изменение пароля - на порядок более обьемная задача по размеру кода.
Ну или можно хранить в виде p = a + b*10 + c*100 + d*1000
Хотя, конечно, за бородатых дядек надо бы дать вам возможность посидеть денек и почесать свою умную голову...
Ну или можно хранить в виде p = a + b*10 + c*100 + d*1000
в цифровом виде довольно трудно отрабатывать лидирующие нули.
Как создать динамический массив? т.е. у массива не определен размер и не опроеделены элементы. И да прои присвоении массиву значения "key" ничего не получается.
Как создать динамический массив? т.е. у массива не определен размер и не опроеделены элементы. И да прои присвоении массиву значения "key" ничего не получается.
В Си, в общем-то -нет динамических массивов. А зачем вам динамический? -у вас же длина пароля заранее известна, значит больше символов и хранить незачем.
Одиночное значение массиву не присваивают. Одиночное значение нужно присваивать элементу массива, например так
massiv[0] = key;
Только не говорите, что вы и про массивы ничего не знаете. Если да - то сначала возьмите любую ссылку по Си в инете и прочитайте соответсвующий раздел
В том и дело что прочитав все что возможно я заметил что нигде нет дирамических массивов. Спсибо.
искаропки - нет. Но можно самому написать.
В том и дело что прочитав все что возможно я заметил что нигде нет дирамических массивов. Спсибо.
Где это - нигде? А это что - уд собачий?
Где это - нигде? А это что - уд собачий?
да разве это динамический? - не видал ты, похоже, динамических массивов. Динамический - это который сам прямо в ходе выполнения программы подстраивает свой размер под размер данных. То есть, в начале программы создаешь массив, скажем, на 10 элементов, потом кладешь туда 20 или 100 значений - и все работает! Ближайший аналог - класс String
Таким образом устроены массивы, например, в Перле.
Где это - нигде? А это что - уд собачий?
да разве это динамический? - не видал ты, похоже, динамических массивов. Динамический - это который сам прямо в ходе выполнения программы подстраивает свой размер под размер данных. То есть, в начале программы создаешь массив, скажем, на 10 элементов, потом кладешь туда 20 или 100 значений - и все работает! Ближайший аналог - класс String
Таким образом устроены массивы, например, в Перле.
Ты меня потроллить решил, что ли? :) Есть кучу реализаций того же vector, я даже больше скажу - есть stl для дуньки - юзай не хочу, там кучу всего. Нету блин, динамических массивов, и всё тут :) Мозгов и желания подучиться нет у пишущих подобную чушь (это я не к тебе, если что) - вот чего нету. А остальное - всё уже давно есть.
Ты меня потроллить решил, что ли? :) Есть кучу реализаций того же vecto....
ну как тут без троллинга :)
Понятно, что можно написать свой класс расширяемого масссива или взять готовый... но в стандарте языка динамических массивов нет. И для случая ограниченных ресурсов это скорее плюс, чем минус. Можно и собаке пятую ногу пришить - только зачем?
Ну, вообще-то Ардуина - это не С, а С++.
И vector - он уже есть, его писать не надо.
Господа не могу правильно сформировать код для последовательно добавления введенных чисел в массив. Помогите кто совето а кто примером кода.))) Спасибо.
Вот код который у меня получился последний. Все мои дейсвия останавливаются на 66 ходе.
искаропки - нет. Но можно самому написать.
по типу стека?
искаропки - нет. Но можно самому написать.
по типу стека?
нет. стек - это как магазин в Калаше, чтоб достать первый патрон, надо вытащить все остальные. Массив подразумевает возможность вытащить любой патрон, не трогая другие. Как в револьвере, примерно.
Господа не могу правильно сформировать код для последовательно добавления введенных чисел в массив. Помогите кто совето а кто примером кода.))) Спасибо.
у меня получился последний. Все мои дейсвия останавливаются на 66 ходе.
Программа написана канешно жесть и делай тормозит смену цыфр, Попробуйте так, должно исключить делай пока не наберете ввесь масив
Я конечно извеняюсь но я ничего не понял)))
Я конечно извеняюсь но я ничего не понял)))
Залейте код и попробуйте. У меня проверить не на чем!
Я конечно извеняюсь но я ничего не понял)))
Залейте код и попробуйте. У меня проверить не на чем!
Ничего не присходит. Только цифры на дисплей выводятся. Не сравнивает.
У меня главный вопрос как последовательно заполнить массив цифрами введенными на клавиатуре?
А как это написать кодом и в каком месте? То что разумеется последовательно я понимаю.
Прежде чем садится писать код надо 1 - внятно написать (переписать ТЗ) и 2- нарисовать проект программы. А вы сразу дернулись за 3- написать код и 4 -залить скетч и увидеть хрень. Пока вы не нормально нарисуете проект, то здесь на форуме у вас будет только треп не о чем. И ввод с клавиатуры должен быть похож на ввод с Serial.
Я думал, что "индусский код" методом копипасты - это самое дно. Однако нет, есть еще программирование методом "выклянчивание"...
Выкляничивание - всего лишь нащупывание дна.)
А как это написать кодом и в каком месте? То что разумеется последовательно я понимаю.
Намой взгляд Вам надо решить 2е проблемы.
1) АНТИДРЕБЕЗГ - я не видел канешно библиотеки, если там встроен, тогда отпадаед.
2) Вы нажали кнопку - записали значение и надо дождаться ее ОТПУКАНИЯ и только после этого при нажатии кнопки писать следующее значение.
искаропки - нет. Но можно самому написать.
по типу стека?
нет. стек - это как магазин в Калаше, чтоб достать первый патрон, надо вытащить все остальные. Массив подразумевает возможность вытащить любой патрон, не трогая другие. Как в револьвере, примерно.
Ааа! А я по не знанию вычислял нужный элемент в стеке и вытягивал ))) на интеле (SS)
ТОварищи не могу понять принципа записи в массив!!! Как он записывает ?
После нажатия на первую же кнопку выскакивает 59 строка... В чем ошибка вроде последовательно пробую вписывать данные в массив. Перечитал кучу инфы а результат нулевой. В чем ошибка?
После нажатия на первую же кнопку выскакивает 59 строка... В чем ошибка вроде последовательно
Никакой ошибки - так у вас написано в скетче. Смотрите условие в 69 строке: если число введенных цифр такое, как в пароле - вы сравниваете введенное с паролем. А иначе (например введена только одна цифра)- пишете "Инкоррект ПИН".
вам надо СНАЧАЛА должлаться ввода 4х цифр, а потом сравнивать с паролем.
После нажатия на первую же кнопку выскакивает 59 строка... В чем ошибка вроде последовательно
Никакой ошибки - так у вас написано в скетче. Смотрите условие в 69 строке: если число введенных цифр такое, как в пароле - вы сравниваете введенное с паролем. А иначе (например введена только одна цифра)- пишете "Инкоррект ПИН".
вам надо СНАЧАЛА должлаться ввода 4х цифр, а потом сравнивать с паролем.
О да радуюсь как младенец))))) Все получилось!!! Отлично.... Спасибо за помощь!!!
Тему не закрывайте ибо вопросы возникнут с возможностью изменения пороля....
А вот код который получился у меня и все стало работать...
ПОдскожите как можно реализовать изменение пин кода через нажатие дополнительной тактовой кнопки? В какой цикл долна быть вписана данная команда?
ПОдскожите как можно реализовать изменение пин кода через нажатие дополнительной тактовой кнопки? В какой цикл долна быть вписана данная команда?
это не команда, а целая подпрограмма. При переходе в режим смены ПИН-кода вам снова нужно принять от пользователя 4 кнопки, а потом подтверждение - еще раз 4 кнопки. Если оба введенных кода совпали - тогда меняем ПИН, иначе - оставляем старый.
Я думал, что "индусский код" методом копипасты - это самое дно. Однако нет, есть еще программирование методом "выклянчивание"...
А вот в этой теме Кодовый замок доработка скетча товарищ уже недели полторы назад заявил, что во всём сам разобрался. Я уж думал у меня дежавю с этими замками, ан нет - новая тема старого автора. Так ведь скетч и выжмет :)
Алгоритм мне понятен - Идет опрос клавиатуры если нажаты кнопки записываем их в массив а затем сравниваем два массива (это то что касается проверки пароля и открытия) а вот то что косается изменения стандартного пароля мне представляется так. Если на 2-м пине появился высокий уровень то переходим в цикл опроса клавиатуры тем самым введенные значения записываем в массив стандартного пароля завершаем цикл. Вся суть проблемы заключается в том - В каком цикле должен происходить опрос доп кнопки? Пробовал вписывать опрос доп клавиши в 92 строке. Но тогда при нажатии любой клавиши на keypad появляется строка изменения пароля.
У вас тут вообще кроме loop() нет циклов. К чему вопрос о выборе?
Раз цикл один, то и проблемы нет!
У вас тут вообще кроме loop() нет циклов. К чему вопрос о выборе?
Раз цикл один, то и проблемы нет!
В цикле луп я буду проверять состояние доп кнопки и если оно изменилось то мне нужно создать второй void keypadEvent(KeypadEvent key). Я правильно понял?