Загрузка данных


// --- Определение пинов ---
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);
}