// --- Определение пинов ---
const int TRIG_PIN = 9; // TRIG ультразвукового датчика
const int ECHO_PIN = 10; // ECHO ультразвукового датчика
const int BUZZER_PIN = 8; // Пьезоэлемент (зуммер)
// Пины RGB-светодиода (с общим катодом)
const int RED_PIN = 3;
const int GREEN_PIN = 5;
const int BLUE_PIN = 6;
// --- Переменные для таймеров ---
unsigned long lastBeepTime = 0; // Время последнего писка
unsigned long lastMeasureTime = 0; // Время последнего измерения
bool buzzerState = false; // Текущее состояние зуммера (вкл/выкл)
void setup() {
Serial.begin(9600);
// Настройка пинов
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
// Выключаем зуммер и светодиод при старте
noTone(BUZZER_PIN);
setColor(0, 0, 0);
}
void loop() {
// Измеряем расстояние каждые 50 мс (для стабильности показаний)
if (millis() - lastMeasureTime >= 50) {
lastMeasureTime = millis();
long distance = getDistance();
// Вывод в Serial Monitor
if (distance == 0) {
Serial.println("Ошибка: нет эхо-сигнала");
} else {
Serial.print("Расстояние: ");
Serial.print(distance);
Serial.println(" см");
}
// Логика работы в зависимости от расстояния
if (distance == 0) {
// Ошибка измерения или нет препятствия
setColor(0, 0, 255); // Синий цвет
noTone(BUZZER_PIN);
buzzerState = false;
} else if (distance > 50) {
// Безопасная зона (> 50 см)
setColor(0, 255, 0); // Зеленый
noTone(BUZZER_PIN);
buzzerState = false;
} else if (distance >= 21 && distance <= 50) {
// Зона предупреждения (21 - 50 см)
setColor(255, 255, 0); // Желтый (Красный + Зеленый)
// Редкие короткие сигналы (интервал 700 мс)
if (millis() - lastBeepTime >= 700) {
lastBeepTime = millis();
tone(BUZZER_PIN, 1000, 50); // Писк 1 кГц длительностью 50 мс
}
} else if (distance >= 1 && distance <= 20) {
// Опасная зона (1 - 20 см)
setColor(255, 0, 0); // Красный
// Частые сигналы (интервал 150 мс)
if (millis() - lastBeepTime >= 150) {
lastBeepTime = millis();
tone(BUZZER_PIN, 1500, 50); // Писк 1.5 кГц длительностью 50 мс
}
}
}
}
// --- Функция измерения расстояния ---
long getDistance() {
// Отправляем короткий импульс на TRIG
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Читаем длительность импульса на ECHO (таймаут 30 мс ~ 5 метров)
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
// Если импульс не получен (таймаут), возвращаем 0
if (duration == 0) {
return 0;
}
// Скорость звука 340 м/с = 0.034 см/мкс.
// Делим на 2, так как звук идет до препятствия и обратно.
long distance = duration * 0.034 / 2;
return distance;
}
// --- Вспомогательная функция для установки цвета ---
// Для светодиода с общим КАТОДОМ: 255 = максимум яркости, 0 = выключено.
// Если у тебя светодиод с общим АНОДОМ, замени значения на (255 - value).
void setColor(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}