1. Введение

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

2. Компоненты и подключение

2.1. Аппаратные компоненты

КомпонентПин ArduinoНазначение
Ультразвуковой HC-SR04trigPin=11echoPin=12Измерение расстояния
Сервопривод (SG90)servoPin=5Управление шлагбаумом
СветодиодledPin=10Визуальная индикация
Зуммер (buzzer)buzzerPin=9Звуковая сигнализация

2.2. Логика работы

  • Если объект ближе 7 см → шлагбаум открывается (серво поворачивается на 90°), включается свет и звуковой сигнал.
  • Если объект дальше 10 см → шлагбаум закрывается (серво возвращается в ), свет выключается.

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).
  • Сервопривод инициализируется и устанавливается в закрытое положение ().

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");
  1. Генерация импульса:
    • На trigPin подаётся короткий импульс (10 мкс).
  2. Измерение времени отклика:
    • pulseIn() замеряет, сколько времени сигнал идёт до объекта и обратно.
  3. Расчёт расстояния:
    • Формула 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).
  • Действия:
    1. Двойной “бип” на зуммере.
    2. Включение светодиода.
    3. Открытие сервопривода (90°).
    4. Пауза 3 секунды (имитация проезда машины).
    5. Закрытие сервопривода () и выключение светодиода.

3.3.3. Сброс состояния (если машина уехала)

if (distance >= 10) {
  gateOpen = false;  // Сбрасываем флаг
}
  • Если расстояние ≥10 см, система сбрасывает флаг gateOpen, позволяя снова открыть шлагбаум при следующем приближении.

3.3.4. Задержка между измерениями

delay(250);  // Пауза 250 мс
  • Нужна, чтобы избежать ложных срабатываний.

4. Возможные улучшения

  1. Добавление ИК-датчика – для более точного определения машины.
  2. Режим ручного управления – кнопка для принудительного открытия.
  3. Bluetooth/Wi-Fi управление – интеграция с телефоном.
  4. LCD-дисплей – вывод текущего расстояния и состояния.

5. Заключение

Этот код демонстрирует работу автоматического шлагбаума на Arduino. Основные функции:

  • Измерение расстояния (ультразвуковой датчик).
  • Управление сервоприводом (открытие/закрытие).
  • Световая и звуковая индикация.

Проект можно использовать на парковках, въездах или как учебный пример для изучения Arduino.