Parking

Цель проекта

Создать автоматизированную систему парковочного шлагбаума, которая срабатывает при приближении автомобиля. Система открывает шлагбаум и зажигает зелёный светодиод, указывая на разрешённый проезд. Проект направлен на повышение удобства и автоматизацию управления парковкой.


Используемые компоненты

  • Ультразвуковой датчик — для обнаружения приближающегося объекта (например, автомобиля).
  • Сервопривод — поднимает и опускает шлагбаум.
  • RGB-светодиод или обычный зелёный светодиод — загорается зелёным при открытии шлагбаума.
  • Платформа (например, из картона) — для монтажа всех компонентов и создания макета.

Принцип работы системы

1. Обнаружение объекта

Система постоянно измеряет расстояние с помощью ультразвукового датчика. Когда автомобиль приближается ближе установленного порога (например, менее 15 см), датчик передаёт сигнал о присутствии объекта.

2. Автоматическое открытие шлагбаума

После обнаружения объекта микроконтроллер передаёт команду сервоприводу, который поднимает шлагбаум в вертикальное положение. Одновременно включается зелёный светодиод, сигнализирующий о том, что проезд разрешён.

3. Закрытие шлагбаума

После того как автомобиль проехал (например, по истечении заданного времени), шлагбаум возвращается в закрытое положение, а светодиод выключается или переключается на жёлтый/красный (если используется RGB).

#include <Servo.h>

// Ультразвуковой датчик
const int trigPin1 = 10;
const int echoPin1 = 9;

// Серво-привод
Servo barrierServo;
const int servoPin = 6;

// RGB LED
const int redPin = 13;
const int greenPin = 11;

// Пороговые расстояния
const int distanceThresholdOpen = 30;   // открыть барьер, если ближе
const int distanceThresholdClose = 25;  // закрыть барьер, если дальше

// Состояние
bool entryDetected = false;
unsigned long barrierOpenTime = 0;
const unsigned long openDuration = 3000; // 3 секунды
bool barrierIsOpen = false;

void setup() {
  Serial.begin(9600);

  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);

  barrierServo.attach(servoPin);
  closeBarrier();
}

void loop() {
  int distance1 = readDistance(trigPin1, echoPin1);

  Serial.print("Entry: ");
  Serial.print(distance1);
  Serial.println(" cm");

  // Обработка открытия
  if (distance1 < distanceThresholdOpen && !entryDetected) {
    openBarrier();
    entryDetected = true;
    barrierOpenTime = millis();
  }

  // Обработка закрытия
  if (distance1 > distanceThresholdClose && entryDetected && barrierIsOpen) {
    closeBarrier();
    entryDetected = false;
  }

  // Авто-закрытие по таймеру, только если объекта нет
  if (barrierIsOpen && millis() - barrierOpenTime > openDuration && distance1 > distanceThresholdClose) {

    closeBarrier();
    entryDetected = false;
  }
}

// Измерение расстояния
int readDistance(int trigPin, int echoPin) {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH, 25000); // таймаут 25 мс
  return duration * 0.034 / 2;
}

// Открыть шлагбаум
void openBarrier() {
  barrierServo.write(90);
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);
  Serial.println("Barrier opened");
  barrierIsOpen = true;
}