МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»
Методическая разработка
«Проект «Замок для сейфа»
к дополнительной общеобразовательной
общеразвивающей программе
технической направленности
«Лаборатория робототехники»
Возраст детей: 10-15 лет
Автор: Костычев Вадим Александрович
г. Заречный Пензенской области
2022 г.
В ходе изучения робототехники, схемотехники и программирования на основе платформы Arduino большую роль играет разработка проектов. Они позволяют отработать как навыки программирования, так и сборки электрических цепей устройств. Данная разработка призвана в первую очередь отработать навыки разработки алгоритмов, а также работы с дисплеем и матричной клавиатурой.
Целью данной разработки является повышение интереса учащихся к техническому творчеству посредством работы с платформой Arduino.
Данная методическая разработка используется как обучающий пример для работы по дополнительной общеобразовательной общеразвивающей программе технической направленности «Лаборатория робототехники». С их помощью учащиеся смогут применить теоретические знания на практике, построив сложные алгоритмы, поработав с дисплеем и матричной клавиатурой, EEPROM-памятью.
Данный проект отличается простотой схемы сборки и сложностью его программирования. Для корректной работы необходимо сделать две программы. Одна из них будет «стандартной», поможет записать первоначальный пароль в независимую память EEPROM; вторая – «прошивкой», в которой будут хранится алгоритмы работы.
Задав первоначальный пароль, мы сохраним его в память EEPROM побитно, а затем будем обращаться к ней, если хотим проверить введенный пользователем пароль или установить новый. Для чтения данных с EEPROM будем пользоваться командой - EEPROM.read(ячейка памяти), а для перезаписи - EEPROM.update(ячейка, символ).
При запуске контроллера сервопривод поворачивается на 90 градусов, закрывая «замок», при верном вводе и проверке в памяти пароля, сервопривод возвращается в положение 0 градусов, открывая замок и предоставляя доступ пользователю.
Интерфейс работы с устройством – жидкокристаллический дисплей и матричная клавиатура. Символы матричной клавиатуры обозначены в массиве keys «прошивки». С их помощью происходит управление сейфом. Стандартный пароль – «1234»
При надписи «Write password» на экране необходимо написать пароль из 4 символов, он отображается ниже, и нажать кнопку «#». Если вы увидели надпись «Pass correct», значит пароль введен верно, «Pass UNcorrect» - неверно. Если вы ввели пароль верно и нажали кнопку «Y» - открывается режим смены пароля с соответствующей надписью – «New password», где после записи вашего пароля из 4 символов, пароль сохраниться с надписью «Password accepted». Кнопка «С» - позволяет стереть ваш пароль в любой части программы.
Принципиальная схема
Листинг программы «прошивки»
#include // подключение библиотеки для работы с сервоприводом
#include // подключение библиотеки для работы с дисплеем
#include // подключение библиотеки для работы с памятью
#include // подключение библиотеки для работы с матричной клавиатурой
LiquidCrystal_I2C lcd(0x27, 16, 2); // объявим имя дисплея, адрес, кол-во столбцов и строк
#define KP_ROWS 4 // количество строк клавиатуры
#define KP_COLS 4 // количество столбцов клавиатуры
byte colPins[4] = {8, 9, 10, 11}; // указываем пины подключения колонок
byte rowPins[4] = {7, 6, 5, 4}; // указываем пины подключения строк
boolean flag = 0; // переменная флаг введен ли пароль верно
byte pass[4], k, nk = 0; // создадим массив для пароля, переменные для проверки пароля
char key; // переменная принимающая символы
char keys[KP_ROWS][KP_COLS] = { // создаем массив со значениями кнопок
{'1', '2', '3', 'Y'},
{'4', '5', '6', 'A'},
{'7', '8', '9', 'B'},
{'C', '0', '#', 'C'}
};
SimpleKeypad pad((char*)keys, rowPins, colPins, 4, 4); // укажем библиотеке клавиатуры принимаемые символы, пины строк, пины колонок, кол-во подключений)
Servo servo; // дадим сервоприводу имя servo
void setup() {
Serial.begin(9600); // объявим начало работы серийного порта
lcd.init(); // инициализируем работу дисплея
lcd.backlight(); // включаем подсветку дисплея
lcd.clear(); // отчистка дисплея
lcd.setCursor(0, 0); // установка курсора в 1 столбец 1 строки
lcd.print("Write password "); // выводим фразу "Напишите пароль"
servo.attach(3); // подключаем сервопривод к 3 пину
}
void loop() {
servo.write(90); // опускаем сервопривод на 90 градусов, закрывая замок
char key = pad.getKey(); // принимаем символ с клавиатуры
if (key == 'C') { // если нажата кнопка "C"
for (int i = 0; i отчищаем пароль
pass[i] = 12;
}
lcd.setCursor(0, 1); // устанавливаем курсор в 1 столбец 2 строки
lcd.print(" "); // отчищаем 2 строку
k = 0; // ставим итерацию пароля на 1 позицию
}
if (key = '0' and key
pass[k] = key - 48; // записываем символ в массив
lcd.setCursor(0, 0); // ставим курсор в начало
lcd.print("Write password "); // выводим фразу "Напишите пароль"
lcd.setCursor(k, 1); // ставим курсор в k позицию 2 строки
lcd.print(pass[k]); // выводим символ
k++; // увеличиваем переменную итерации
}
if (k == 4) { // если интерация равно 4 - обнуляем
k = 0;
}
if (pass[3] != 12 and key == '#') { // если в пароле 4 символа и нажат знак #
if (EEPROM.read(10) == pass[0] and EEPROM.read(11) == pass[1] and EEPROM.read(12) == pass[2] and EEPROM.read(13) == pass[3]) { // сравниваем пароль написанный пользователем с паролем, сохраненным в памяти, и если он правильный, то выполняем следующие действия
lcd.clear(); // отчищаем экран
lcd.setCursor(0, 0); // ставим курсор в начало
lcd.print("Pass correct "); // пишем "пароль верный"
flag = 1; // ставим флаг в единицу, что пароль набран верно
for (int i = 0; i
pass[i] = 12;
}
servo.write(0); // поднимаем сервопривод, открываем замок
}
else { // если пароль неверный
servo.write(90); // повернуть сервопривод на 90 градусов, закрыть замок
lcd.setCursor(0, 0); // ставим курсор в начало
lcd.print("Pass UNcorrect "); // пишем "пароль неверный"
lcd.setCursor(0, 1); // устанавливаем курсор в 1 столбец 2 строки
lcd.print(" "); // отчищаем 2 строку
k = 0; // ставим нулевую итерацию
delay(2000); // задержка 2 секунды
lcd.setCursor(0, 0); // ставим курсор в начало
lcd.print("Write password "); // выводим фразу "Напишите пароль"
}
}
if (key == 'Y' and flag == 1) { // если нажата кнопка y, а пароль до этого введен верно, то включается режим смены пароля
lcd.setCursor(0, 1); // устанавливаем курсор в 1 столбец 2 строки
lcd.print(" "); // отчищаем 2 строку
while (1) { // цикл для смены пароля
lcd.setCursor(0, 0); // устанавливаем курсор в 1 столбец 1 строки
lcd.print("New password "); // выводим "Новый пароль"
lcd.print(" ");
key = pad.getKey(); // получаем символ с клавиатуры
if (key = '0' and key
pass[nk] = key - 48; // переводим символ в число и сохраняем в массиве
lcd.setCursor(nk, 1); // переводим курсор
lcd.print(pass[nk]); // печатаем этот символ
EEPROM.update(nk + 10, key - 48); // сохраняем в долгосрочную память
nk++; // увеличиваем итерацию
servo.write(90); // поворачиваем замок на 90 градусов, закрываем
}
if (key == 'C') { // если нажата кнопка 'С', то стираем пароль
for (int i = 0; i
pass[i] = 12;
}
lcd.setCursor(0, 1); // устанавливаем курсор в 1 столбец 2 строки
lcd.print(" "); // отчищаем 2 строку
nk = 0; // обнуляем итерацию
}
if (nk == 4) { // если итерация дошла до 4 символов
delay(1000); // делаем задержку в секунду
lcd.clear(); // отчищаем экран
lcd.setCursor(0, 0); // ставим курсор в начало
lcd.print("Password accepted"); // напишем, что мы сохранили пароль
flag = 0; // флаг пароля равен 0, новый пароль не написан пользователем
for (int i = 0; i
pass[i] = 12;
}
nk = 0; // обнуляем итерацию
delay(2000); // делаем задержку в 2 секунды
lcd.setCursor(0, 0); // ставим курсор в начало
lcd.print("Write password "); // выводим фразу "Напишите пароль"
break; // завершаем цикл смены пароля
}
}
}
}
Листинг программы «стандартной» для записи пароля
#include // подключение библиотеки для работы с дисплеем
#include / подключение библиотеки для работы с памятью
#include // подключение библиотеки для работы с матричной клавиатурой
LiquidCrystal_I2C lcd(0x27, 16, 2); // объявим имя дисплея, адрес, кол-во столбцов и строк
#define KP_ROWS 4 // количество строк
#define KP_COLS 4 // количество столбцов
byte colPins[4] = {8, 9, 10, 11}; // уакзываем пины подключения колонок
byte rowPins[4] = {7, 6, 5, 4}; // указываем пины подключения строк
byte pass[4], k, nk = 0; // создадим массив для пароля, переменные для проверки пароля
char key; // переменная принимающая символы
char keys[KP_ROWS][KP_COLS] = { // создаем массив со значениями кнопок
{'1', '2', '3', 'Y'},
{'4', '5', '6', 'A'},
{'7', '8', '9', 'B'},
{'C', '0', '#', 'C'}
};
SimpleKeypad pad((char*)keys, rowPins, colPins, 4, 4); // укажем библиотеке клавиатуры принимаемые символы, пины строк, пины колонок, кол-во подключений)
void setup() {
Serial.begin(9600); // объявим начало работы серийного порта
for (int i = 1; i
EEPROM.update(i + 9, i); // сохраняем по очереди цифры в ячейки памяти число + 9
}
lcd.init(); // инициализируем работу дисплея
lcd.backlight(); // включаем подсветку дисплея
lcd.clear(); // отчистка дисплея
lcd.setCursor(0, 0); // установка курсора в 1 столбец 1 строки
lcd.print("Password writed!"); // выводим фразу "Пароль записан"
}
void loop() {
}