#include <Arduino.h> // Підключаємо команди Arduino.
const byte TRIG_PIN = 7; // Вихід для запуску вимірювання.
const byte ECHO_PIN = 6; // Вхід для відповіді датчика.
const byte LED_PIN = 8; // Вихід світлодіода.
const byte BUZZER_PIN = 3; // Вихід для зумера.
float readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо вихід до нового імпульсу.
delayMicroseconds(2); // Чекаємо 2 мікросекунди.
digitalWrite(TRIG_PIN, HIGH); // Починаємо імпульс запуску.
delayMicroseconds(10); // Тримаємо його 10 мікросекунд.
digitalWrite(TRIG_PIN, LOW); // Завершуємо імпульс.
unsigned long echoTime = pulseIn(ECHO_PIN, HIGH, 25000); // Чекаємо відповідь до 25 мс.
float distanceCm = echoTime / 58.0; // Перетворюємо тривалість відповіді на сантиметри.
if (echoTime == 0 || distanceCm < 2 || distanceCm > 400) {
return -1; // Повідомляємо, що вимірювання не вдалося.
}
return distanceCm; // Повертаємо виміряну відстань.
}
void startSound() {
digitalWrite(LED_PIN, HIGH); // Світлодіод світиться разом зі звуком.
tone(BUZZER_PIN, 2000); // Вмикаємо звук із частотою 2000 Гц.
}
void stopSound() {
digitalWrite(LED_PIN, LOW); // Світлодіод гасне разом зі звуком.
noTone(BUZZER_PIN); // Вимикаємо звук.
}
void beep(int pauseMs) {
startSound(); // Вмикаємо зумер.
delay(80); // Сигнал звучить 80 мс.
stopSound(); // Вимикаємо зумер.
delay(pauseMs); // Чекаємо перед наступним вимірюванням.
}
void playDistanceSignal(float distanceCm) {
if (distanceCm < 0) { // Датчик не зміг виміряти відстань.
stopSound(); // Вимикаємо звук.
delay(100); // Чекаємо перед повторною спробою.
} else if (distanceCm > 100) { // Перешкода далі ніж 100 см.
stopSound(); // Залишаємо тишу.
delay(100); // Чекаємо перед наступним вимірюванням.
} else if (distanceCm > 30) { // Перешкода в межах понад 30–100 см.
beep(600); // Короткий сигнал, потім пауза 600 мс.
} else if (distanceCm > 10) { // Перешкода в межах понад 10–30 см.
beep(150); // Короткий сигнал, потім пауза 150 мс.
} else { // Перешкода в межах 2–10 см.
startSound(); // Звук залишається ввімкненим.
delay(100); // Через 100 мс знову виміряємо відстань.
}
}
void setup() {
pinMode(LED_PIN, OUTPUT); // Керуємо світлодіодом.
pinMode(TRIG_PIN, OUTPUT); // Надсилаємо команду датчику через TRIG.
pinMode(ECHO_PIN, INPUT); // Отримуємо відповідь через ECHO.
digitalWrite(BUZZER_PIN, LOW); // Готуємо вимкнений вихід зумера.
pinMode(BUZZER_PIN, OUTPUT); // Керуємо зумером через цей вихід.
stopSound(); // Починаємо з тиші.
Serial.begin(115200); // Відкриваємо зв’язок із монітором порту.
}
void loop() {
float distanceCm = readDistanceCm(); // 1. Вимірюємо відстань.
Serial.println(distanceCm); // 2. Показуємо результат у моніторі порту.
playDistanceSignal(distanceCm); // 3. Відтворюємо сигнал для цієї відстані.
}