#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Пины для подключения светодиодов
const int greenLedPin = 2; // Пин для зеленого светодиода
const int redLedPin = 3; // Пин для красного светодиода
// Пины для кнопок
const int entryButtonPin = A3; // Пин для кнопки въезда на стоянку
const int barrierControlPin = 9; // Пин для управления шлагбаумом
// Максимальное количество датчиков мест
const int maxParkingSensors = 3;
Servo myservo1, myservo2, myservo3;
// Переменная для хранения количества свободных мест
int freeParkingSpots = 0;
// Флаг для отслеживания разрешения въезда
bool entryAllowed = false;
int S1, S2, S3;
int flag = 0;
int servo1Position = 90;
int servo2Position = 180;
int servo3Position = 180;
// Объект для работы с LCD дисплеем
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Инициализация пинов
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(entryButtonPin, INPUT_PULLUP);
pinMode(barrierControlPin, OUTPUT);
pinMode(A0, INPUT_PULLUP);
pinMode(A1, INPUT_PULLUP);
pinMode(A2, INPUT_PULLUP);
// Инициализация LCD дисплея
lcd.begin(16, 2);
myservo1.attach(5);
myservo2.attach(6);
myservo3.attach(10);
myservo1.write(90);
myservo2.write(180);
myservo3.write(180);
// Определение количества датчиков мест
//int parkingSensors = detectParkingSensors();
// Инициализация начального количества мест
freeParkingSpots = detectParkingSensors();
// Инициализация начального состояния светодиодов
updateTrafficLights();
}
void loop() {
Serial.begin(9600);
if (digitalRead(A0) == LOW)
{
if (servo1Position == 90)
{
servo1Position = 180;
myservo1.write(servo1Position);
delay(5);
}
else if (servo1Position == 180) {
servo1Position = 90;
myservo1.write(servo1Position);
delay(5);
}
}
if (digitalRead(A1) == LOW)
{
if (servo2Position == 90)
{
servo2Position = 180;
myservo2.write(servo2Position);
delay(5);
}
else if (servo2Position == 180) {
servo2Position = 90;
myservo2.write(servo2Position);
delay(5);
}
}
if (digitalRead(A2) == LOW)
{
if (servo3Position == 90)
{
servo3Position = 180;
myservo3.write(servo3Position);
delay(5);
}
else if (servo3Position == 180) {
servo3Position = 90;
myservo3.write(servo3Position);
delay(5);
}
}
freeParkingSpots = detectParkingSensors();
// Проверка состояния датчиков мест для стоянки
//checkParkingSensors();
// Обновление светодиодов на основе количества свободных мест
updateTrafficLights();
// Проверка нажатия кнопки въезда
checkEntryButton();
// Сброс флага разрешения въезда по необходимости
resetEntryFlag();
}
// Функция для определения количества датчиков мест
int detectParkingSensors() {
int sensorsDetected = 0;
if (myservo1.read() == 90)
{
S1 = 1;
}
else if (myservo1.read() == 180) {
S1 = 0;
}
if (myservo2.read() == 90)
{
S2 = 1;
}
else if (myservo2.read() == 180) {
S2 = 0;
}
if (myservo3.read() == 90)
{
S3 = 1;
}
else if (myservo3.read() == 180) {
S3 = 0;
}
sensorsDetected = S1 + S2 + S3;
return sensorsDetected;
}
// Функция для проверки состояния датчиков мест для стоянки
//void checkParkingSensors() {
// Определение количества свободных мест
//freeParkingSpots = detectParkingSensors();
//}
// Функция для обновления светодиодов на основе количества свободных мест
void updateTrafficLights() {
if (freeParkingSpots > 0) {
// Если есть свободные места, включаем зеленый светодиод и выключаем красный
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
} else {
// Если места заняты, включаем красный светодиод и выключаем зеленый
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, HIGH);
}
// Отображение количества свободных мест на LCD дисплее
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Free spots: ");
lcd.print(freeParkingSpots);
}
// Функция для проверки нажатия кнопки въезда
void checkEntryButton() {
if (digitalRead(entryButtonPin) == LOW && freeParkingSpots > 0 && !entryAllowed) {
// Если кнопка нажата и есть свободные места, разрешаем въезд
// Открываем шлагбаум
openBarrier();
// Задержка для имитации времени проезда
delay(5000);
// Закрываем шлагбаум
closeBarrier();
flag = 1;
//freeParkingSpots--;
if (S1 == 1) {
myservo1.write(180);
}
else if (S2 == 1) {
myservo2.write(180);
}
else if (S3 == 1) {
myservo3.write(180);
}
entryAllowed = true; // Устанавливаем флаг разрешения въезда в true
updateTrafficLights();
// Вывод сообщения об успешном въезде на LCD дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Entry allowed");
delay(2000);
}
}
// Функция для открытия шлагбаума
void openBarrier() {
digitalWrite(barrierControlPin, HIGH);
}
// Функция для закрытия шлагбаума
void closeBarrier() {
digitalWrite(barrierControlPin, LOW);
}
// Функция для сброса флага разрешения въезда
void resetEntryFlag() {
entryAllowed = false;
}