Цель проекта
Создать автоматизированную систему парковочного шлагбаума, которая срабатывает при приближении автомобиля. Система открывает шлагбаум и зажигает зелёный светодиод, указывая на разрешённый проезд. Проект направлен на повышение удобства и автоматизацию управления парковкой.
Используемые компоненты
- Ультразвуковой датчик — для обнаружения приближающегося объекта (например, автомобиля).
- Сервопривод — поднимает и опускает шлагбаум.
- 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;
}