СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Методическая разработка «Проект «Arduino. Замок для сейфа»

Категория: Информатика

Нажмите, чтобы узнать подробности

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

Просмотр содержимого документа
«Методическая разработка «Проект «Arduino. Замок для сейфа»»

МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ

«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»










Методическая разработка

«Проект «Замок для сейфа»

к дополнительной общеобразовательной

общеразвивающей программе

технической направленности

«Лаборатория робототехники»



Возраст детей: 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() {

}