#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Настройки LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Пины для HC-SR04
const int trigPin = 2;
const int echoPin = 3;
// Пины для светодиодов и зуммера
const int greenLed = 4;
const int yellowLed = 5;
const int redLed = 6;
const int buzzer = 7;
long duration;
int distance;
unsigned long previousMillis = 0; // для отслеживания времени
void setup() {
// Инициализация серийного монитора
Serial.begin(9600);
// Инициализация LCD дисплея
lcd.init();
lcd.backlight();
// Настройка пинов
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop() {
// Очистка триггера
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Установка триггера на HIGH на 10 микросекунд
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Чтение echoPin, возвращение расстояния
duration = pulseIn(echoPin, HIGH);
// Преобразование времени в расстояние
distance = duration * 0.034 / 2;
// Вывод расстояния на LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
// Управление светодиодами
if (distance > 30) {
digitalWrite(greenLed, HIGH);
digitalWrite(yellowLed, LOW);
digitalWrite(redLed, LOW);
} else if (distance > 15 && distance <= 30) {
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, HIGH);
digitalWrite(redLed, LOW);
} else if (distance <= 15) {
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(redLed, HIGH);
}
// Управление зуммером
if (distance <= 25) {
unsigned long currentMillis = millis();
int beepDelay = map(distance, 1, 25, 200, 1000); // чем меньше расстояние, тем меньше задержка между сигналами
if (currentMillis - previousMillis >= beepDelay) {
previousMillis = currentMillis;
digitalWrite(buzzer, HIGH);
delay(50); // короткий писк
digitalWrite(buzzer, LOW);
}
} else {
noTone(buzzer);
}
delay(50); // добавляем небольшую задержку для стабилизации
}