Menu
CoddyTech

Sygnał przejścia dla pieszych i brzęczyk

Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 4 z 24.

Piesi mają własne światła: czerwone na pinie 7 (czekaj) i zielone na pinie 6 (idź). Gdy samochody mają czerwone światło, piesi widzą zielone; przez resztę czasu widzą czerwone.

Sygnał dla pieszych zmienia się tylko w dwóch momentach: gdy samochody dostają czerwone światło i gdy przestaje ono świecić. Napisz funkcję obsługującą światła dla pieszych i wywołaj ją w tych dwóch miejscach:

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

Przejścia dla pieszych wydają też dźwięk, gdy można bezpiecznie przejść, dla osób, które nie widzą świateł. tone() może przyjmować trzecią liczbę określającą czas odtwarzania: tone(buzzerPin, 1000, 100) odtwarza dźwięk o częstotliwości 1000 Hz przez 100 ms, a następnie sam się zatrzymuje. Szkic nie czeka na zakończenie odtwarzania.

Aby sygnał dźwiękowy rozlegał się co 500 ms tylko podczas czerwonego światła, umieść trzeci timer millis() wewnątrz case RED:.

challenge icon

Wyzwanie

Średni

Dodaj sygnał dla pieszych i jego brzęczyk:

  • czerwone światło dla pieszych na pinie 7, a zielone na pinie 6 — oba jako wyjścia
  • gdy dla samochodów świeci się czerwone światło: zielone światło dla pieszych włączone, czerwone wyłączone, a na pinie 8 co 500 ms krótki sygnał dźwiękowy o częstotliwości 1000 Hz i długości 100 ms
  • przez pozostały czas: czerwone światło dla pieszych włączone, zielone wyłączone, bez dźwięku

Naciśnij Run, a następnie Check.

Spróbuj swoich sił

// Światła dla samochodów
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Wbudowana dioda LED płytki: kontrolka stanu sterownika
const int statusPin = 13;
// Przycisk przejścia dla pieszych
const int buttonPin = 2;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // kiedy włączyło się aktualne światło

bool statusOn = false;
unsigned long lastBlink = 0;

// Włącz jedno światło i wyłącz pozostałe dwa.
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:
      // Naciśnięcie przycisku przejścia dla pieszych powoduje wcześniejsze wyłączenie zielonego światła.
      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;
  }

  // Kontrolka stanu miga co 500 ms, niezależnie od działania świateł dla samochodów.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Projekty

Poćwicz samodzielnie: Edytor online Arduino