
Лабораторная работа №5
.docxФедеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Магнитогорский государственный технический университет
им. Г.И.Носова»
Кафедра ЭиМЭ
Лабораторная работа №5
по дисциплине «Arduino. Проектирование устройств»
на тему «Шлагбаум с паролем»
Вариант №3
Выполнил: студент группы
Проверил: старший преподаватель ЭиМЭ
Лымарь А. Б.
Магнитогорск, 2025
Задание.
Спроектировать работу шлагбаума, используя LCD 16х2 с подключением через i2c, keypad для ввода данных и сервоприводом для перемещения механизма шлагбаума.
Задание по варианту:
Пароль 0879;
Сервисный пароль *22#;
Пароль для выхода из сервисного режима ****;
Выполнение.
Рисунок 1 Общий вид схемы.
Рисунок 2 Открытие шлагбаума.
Рисунок 3 Закрытие шлагбаума.
Рисунок 4 Сервисный режим.
Рисунок 5 Выход из сервисного режима.
Программа.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
// --- Настройки LCD ---
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C может быть другим (0x3F)
// --- Настройки Клавиатуры ---
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; // Подключите к строкам клавиатуры
byte colPins[COLS] = {6, 7, 8, 9}; // Подключите к столбцам клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// --- Настройки Серво ---
Servo myservo;
const int servoPin = 10;
const int servoOpenAngle = 90; // Угол для открытого положения шлагбаума
const int servoClosedAngle = 0; // Угол для закрытого положения шлагбаума
// --- Пароли ---
const String correctPassword = "0879";
const String servicePassword = "*22#";
const String returnPassword = "****";
// --- Переменные состояния ---
bool isServiceMode = false;
String enteredPassword = "";
void setup() {
lcd.init();
lcd.backlight();
myservo.attach(servoPin);
myservo.write(servoClosedAngle); // Закрыть шлагбаум при старте
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter the pass:");
lcd.setCursor(0, 1);
}
void loop() {
char key = keypad.getKey();
if (key) {
enteredPassword += key;
lcd.print(key);
// Проверки паролей вынесены в отдельные функции
if (!isServiceMode) {
checkNormalModePassword();
} else {
checkServiceModePassword();
}
}
}
// --- Функции ---
void openBarrier(unsigned long duration) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Open");
myservo.write(servoOpenAngle);
delay(duration);
closeBarrier();
}
void closeBarrier() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Close");
delay(1000);
myservo.write(servoClosedAngle);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter the pass:");
lcd.setCursor(0, 1);
}
void enterServiceMode() {
isServiceMode = true;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Service Mode");
lcd.setCursor(0,1);
lcd.print("Pass back: ");
myservo.write(servoOpenAngle); // Открыть шлагбаум без ограничения по времени
}
void exitServiceMode() {
isServiceMode = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Closing via...");
lcd.setCursor(0, 1);
lcd.print("5 seconds...");
delay(5000); // Даем 5 секунд на предупреждение
myservo.write(servoClosedAngle);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter the pass:");
lcd.setCursor(0, 1);
}
// --- Функции для проверки паролей ---
void checkNormalModePassword() {
if (enteredPassword.length() == correctPassword.length()) {
if (enteredPassword == correctPassword) {
openBarrier(5000); // Открыть на 5 секунд
} else if (enteredPassword == servicePassword) {
enterServiceMode();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter the pass:");
lcd.setCursor(0, 1);
}
enteredPassword = ""; // Сброс пароля
}
}
void checkServiceModePassword() {
if (enteredPassword.length() == returnPassword.length()) {
if (enteredPassword == returnPassword) {
exitServiceMode();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong!");
delay(2000);
lcd.setCursor(0,0);
lcd.print("Service Mode");
lcd.setCursor(0,1);
lcd.print("Pass back: ");
lcd.print(returnPassword);
}
enteredPassword = ""; // Сброс пароля
}
}
Вывод.
В результате выполненной лабораторной работы была собрана схема на базе Arduino UNO и написана программа для корректной работы шлагбаума по паролю.