1. Введение
Этот проект реализует автоматический шлагбаум, который открывается при приближении машины (объекта) и закрывается после её проезда. Система использует ультразвуковой датчик для измерения расстояния, сервопривод для управления шлагбаумом и звуковую/световую индикацию.
2. Компоненты и подключение
2.1. Аппаратные компоненты
Компонент | Пин Arduino | Назначение |
---|---|---|
Ультразвуковой HC-SR04 | trigPin=11 , echoPin=12 | Измерение расстояния |
Сервопривод (SG90) | servoPin=5 | Управление шлагбаумом |
Светодиод | ledPin=10 | Визуальная индикация |
Зуммер (buzzer) | buzzerPin=9 | Звуковая сигнализация |
2.2. Логика работы
- Если объект ближе 7 см → шлагбаум открывается (серво поворачивается на 90°), включается свет и звуковой сигнал.
- Если объект дальше 10 см → шлагбаум закрывается (серво возвращается в 0°), свет выключается.
3. Подробное объяснение кода

#include <Servo.h>
const int trigPin = 11;
const int echoPin = 12;
const int servoPin = 5;
const int ledPin = 10;
const int buzzerPin = 9;
Servo gateServo;
bool gateOpen = false;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
gateServo.attach(servoPin);
gateServo.write(0); // Закрытое положение
}
void loop() {
long duration;
int distance;
// Ультразвуковой импульс
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 25000); // максимум 25 мс ожидания
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Машина близко и шлагбаум ещё не открыт
if (distance > 0 && distance < 7 && !gateOpen) {
gateOpen = true;
// Короткий двойной пик на активном зуммере
digitalWrite(buzzerPin, HIGH); delay(100);
digitalWrite(buzzerPin, LOW); delay(150);
digitalWrite(buzzerPin, HIGH); delay(100);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledPin, HIGH); // Свет включён
gateServo.write(90); // Шлагбаум поднимается
delay(3000); // Пауза
gateServo.write(0); // Шлагбаум опускается
digitalWrite(ledPin, LOW); // Свет выключен
}
// Сброс, если машина уехала
if (distance >= 10) {
gateOpen = false;
}
delay(250); // Пауза
}
3.1. Подключение библиотеки и объявление переменных
#include <Servo.h> // Библиотека для управления сервоприводом
const int trigPin = 11; // Пин TRIG датчика расстояния
const int echoPin = 12; // Пин ECHO датчика расстояния
const int servoPin = 5; // Пин сервопривода
const int ledPin = 10; // Пин светодиода
const int buzzerPin = 9; // Пин зуммера
Servo gateServo; // Объект для управления сервоприводом
bool gateOpen = false; // Флаг состояния шлагбаума (открыт/закрыт)
Servo.h
– библиотека для управления сервоприводом.gateOpen
– флаг, который хранит текущее состояние шлагбаума (true
– открыт,false
– закрыт).
3.2. Функция setup()
– начальная настройка
void setup() {
Serial.begin(9600); // Инициализация Serial-порта для отладки
// Настройка пинов
pinMode(trigPin, OUTPUT); // TRIG как выход
pinMode(echoPin, INPUT); // ECHO как вход
pinMode(ledPin, OUTPUT); // Светодиод как выход
pinMode(buzzerPin, OUTPUT); // Зуммер как выход
gateServo.attach(servoPin); // Подключение сервопривода
gateServo.write(0); // Изначально шлагбаум закрыт (0°)
}
- Настраиваются режимы пинов (
INPUT
/OUTPUT
). - Сервопривод инициализируется и устанавливается в закрытое положение (
0°
).
3.3. Функция loop()
– основной цикл
3.3.1. Измерение расстояния
void loop() {
long duration;
int distance;
// Генерация ультразвукового импульса
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Измерение времени отражённого сигнала
duration = pulseIn(echoPin, HIGH, 25000); // Ждём до 25 мс
distance = duration * 0.034 / 2; // Пересчёт в см
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
- Генерация импульса:
- На
trigPin
подаётся короткий импульс (10 мкс).
- На
- Измерение времени отклика:
pulseIn()
замеряет, сколько времени сигнал идёт до объекта и обратно.
- Расчёт расстояния:
- Формула
distance = (duration * 0.034) / 2
:0.034
– скорость звука в см/мкс./ 2
– потому что сигнал идёт туда и обратно.
- Формула
3.3.2. Открытие шлагбаума (если машина близко)
if (distance > 0 && distance < 7 && !gateOpen) {
gateOpen = true; // Устанавливаем флаг "открыто"
// Двойной звуковой сигнал
digitalWrite(buzzerPin, HIGH); delay(100);
digitalWrite(buzzerPin, LOW); delay(150);
digitalWrite(buzzerPin, HIGH); delay(100);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledPin, HIGH); // Включаем светодиод
gateServo.write(90); // Открываем шлагбаум (90°)
delay(3000); // Ждём 3 секунды
gateServo.write(0); // Закрываем шлагбаум (0°)
digitalWrite(ledPin, LOW); // Выключаем светодиод
}
- Условие срабатывает, если:
- Расстояние 0–7 см.
- Шлагбаум ещё не открыт (
!gateOpen
).
- Действия:
- Двойной “бип” на зуммере.
- Включение светодиода.
- Открытие сервопривода (
90°
). - Пауза 3 секунды (имитация проезда машины).
- Закрытие сервопривода (
0°
) и выключение светодиода.
3.3.3. Сброс состояния (если машина уехала)
if (distance >= 10) {
gateOpen = false; // Сбрасываем флаг
}
- Если расстояние ≥10 см, система сбрасывает флаг
gateOpen
, позволяя снова открыть шлагбаум при следующем приближении.
3.3.4. Задержка между измерениями
delay(250); // Пауза 250 мс
- Нужна, чтобы избежать ложных срабатываний.
4. Возможные улучшения
- Добавление ИК-датчика – для более точного определения машины.
- Режим ручного управления – кнопка для принудительного открытия.
- Bluetooth/Wi-Fi управление – интеграция с телефоном.
- LCD-дисплей – вывод текущего расстояния и состояния.
5. Заключение
Этот код демонстрирует работу автоматического шлагбаума на Arduino. Основные функции:
- Измерение расстояния (ультразвуковой датчик).
- Управление сервоприводом (открытие/закрытие).
- Световая и звуковая индикация.
Проект можно использовать на парковках, въездах или как учебный пример для изучения Arduino.