Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №5

.docx
Скачиваний:
0
Добавлен:
26.06.2025
Размер:
393.84 Кб
Скачать

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Магнитогорский государственный технический университет

им. Г.И.Носова»

Кафедра ЭиМЭ

Лабораторная работа №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 и написана программа для корректной работы шлагбаума по паролю.

Соседние файлы в предмете Arduino