Menu
CoddyTech

Przycisk dla pieszych

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

Osoby piesze potrzebują sposobu, by poprosić o możliwość przejścia przez jezdnię. Niebieski przycisk podłączony do pinu 2 to przycisk dla pieszych: naciśnięcie go podczas zielonego światła natychmiast kończy zielone, dzięki czemu samochody dostają żółte, a potem czerwone światło.

Ponieważ światła działają w oparciu o millis(), loop() przechodzi przez stan zielonego światła tysiące razy na sekundę i za każdym razem może odczytywać przycisk, a także zegar. Zielone światło kończy się, gdy którykolwiek z tych warunków jest spełniony, co oznacza || (lub):

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // zmień na żółty
  }
  break;

Przycisk łączy pin 2 z masą, więc ustaw pin jako INPUT_PULLUP: odczyt to HIGH, dopóki przycisk nie ściągnie go do LOW.

Przycisk jest odczytywany tylko w stanie zielonego światła. Podczas żółtego i czerwonego samochody już się zatrzymują, a żółte światło trwa pełną sekundę, żeby kierowcy mieli czas się zatrzymać.

challenge icon

Wyzwanie

Średni

Dodaj przycisk przejścia dla pieszych do pinu 2:

  • ustaw pin 2 na INPUT_PULLUP
  • gdy światło jest zielone, naciśnięcie przycisku natychmiast kończy zielone światło (światło zmienia się na żółte)
  • żółte i czerwone światło świecą przez taki sam czas niezależnie od tego, czy przycisk jest naciśnięty

Naciśnij Run, poczekaj na zielone światło, naciśnij niebieski przycisk, a następnie Check.

Spróbuj swoich sił

// Światła samochodowe
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Wbudowana dioda LED płytki: kontrolka stanu sterownika
const int statusPin = 13;

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

bool statusOn = false;
unsigned long lastBlink = 0;

// Włącz jedno światło, a pozostałe dwa wyłącz.
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);
  showLight(greenPin);
}

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

  switch (light) {
    case GREEN:
      if (now - lightStart >= 3000) {
        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ł samochodowych.
  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