Menu
CoddyTech

Сигнал для пешеходов и зуммер

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

У пешеходов есть свои светофоры: красный на выводе 7 (стойте) и зелёный на выводе 6 (идите). Пока у машин горит красный, пешеходы видят зелёный; в остальное время — красный.

Сигнал для пешеходов меняется только в два момента: когда для машин загорается красный и когда он гаснет. Напиши функцию для пешеходного светофора и вызови её в этих двух местах:

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

Пешеходные переходы также издают звуковой сигнал, пока переходить безопасно, для людей, которые не видят светофор. tone() может принимать третье число — длительность сигнала: tone(buzzerPin, 1000, 100) воспроизводит звук частотой 1000 Гц в течение 100 мс, а затем останавливается сам. Скетч не ждёт окончания сигнала.

Чтобы подавать звуковой сигнал каждые 500 мс только во время красного света, добавь третий таймер millis() внутри case RED:.

challenge icon

Задание

Средне

Добавь пешеходный сигнал и зуммер:

  • красный пешеходный сигнал на выводе 7 и зелёный пешеходный сигнал на выводе 6, оба настроены как выходы
  • пока у машин горит красный: пешеходный зелёный горит, пешеходный красный не горит, а на выводе 8 каждые 500 мс звучит сигнал длительностью 100 мс с частотой 1000 Гц
  • в остальное время: пешеходный красный горит, пешеходный зелёный не горит, звука нет

Нажми Run, затем Check.

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

// Сигналы светофора для автомобилей
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Светодиод на плате: индикатор состояния контроллера
const int statusPin = 13;
// Кнопка пешеходного перехода
const int buttonPin = 2;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // когда загорелся текущий сигнал

bool statusOn = false;
unsigned long lastBlink = 0;

// Включить один сигнал и выключить два других.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(statusPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  showLight(greenPin);
}

void loop() {
  unsigned long now = millis();

  switch (light) {
    case GREEN:
      // Нажатие кнопки пешеходного перехода досрочно завершает зелёный сигнал.
      if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
        light = YELLOW;
        lightStart = now;
        showLight(yellowPin);
      }
      break;
    case YELLOW:
      if (now - lightStart >= 1000) {
        light = RED;
        lightStart = now;
        showLight(redPin);
      }
      break;
    case RED:
      if (now - lightStart >= 3000) {
        light = GREEN;
        lightStart = now;
        showLight(greenPin);
      }
      break;
  }

  // Индикатор состояния мигает каждые 500 ms независимо от работы автомобильного светофора.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconПроверьте себя

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

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

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