Menu
CoddyTech

Парковочный датчик: звуковые сигналы

Часть раздела Проекты путешествия по Arduino на Coddy. Урок 11 из 24.

Парковочный датчик не только показывает, но и подаёт звуковой сигнал: чем ближе стена, тем чаще он пищит, пока не переходит на непрерывный тон, означающий «стоп». Зуммер подключён к выводу 8.

Интервал между сигналами зависит от расстояния: расстояние, умноженное на 10, в миллисекундах. На расстоянии 70 см сигнал звучит каждые 700 мс, на расстоянии 20 см — каждые 200 мс. Таймер millis() определяет, когда должен прозвучать следующий сигнал:

if (millis() - lastBeep >= cm * 10) {
  lastBeep = millis();
  tone(buzzerPin, 1000, 50);  // звуковой сигнал длительностью 50 мс
}

Есть ещё два случая. Если расстояние меньше 10 см, воспроизводите tone(buzzerPin, 1000) без указания длительности: сигнал будет звучать, пока что-нибудь его не остановит. При расстоянии 100 см или больше не подавайте сигнал и вызовите noTone(buzzerPin), чтобы также остановить непрерывный тон, оставшийся с предыдущего случая.

challenge icon

Задание

Средне

Добавь звуковые сигналы:

  • 100 см или больше: без звука (вызови noTone())
  • от 10 до 99 см: сигнал длительностью 50 ms с частотой 1000 Hz каждые cm * 10 ms, рассчитанный с помощью millis()
  • меньше 10 см: непрерывный сигнал частотой 1000 Hz

Оставь световые сигналы и вывод на печать. Нажми Run, придвинь объект ближе, затем нажми Check.

Попробуйте сами

// Датчик расстояния
const int trigPin = 9;
const int echoPin = 10;
// Предупреждающие световые индикаторы
const int greenPin = 6;
const int yellowPin = 7;
const int redPin = 13;

// Отправить импульс и вернуть расстояние в cm.
long readDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn(echoPin, HIGH);
  return duration / 58;
}

// Зелёный, когда путь свободен, жёлтый, когда близко, красный, когда слишком близко.
void showLights(long cm) {
  digitalWrite(greenPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(redPin, LOW);
  if (cm >= 100) {
    digitalWrite(greenPin, HIGH);
  } else if (cm >= 30) {
    digitalWrite(yellowPin, HIGH);
  } else {
    digitalWrite(redPin, HIGH);
  }
}

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  long cm = readDistance();
  Serial.println(cm);
  showLights(cm);
  delay(100);
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Arduino