Menu
CoddyTech

Geçiş Düğmesi

Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 3 / 24.

Yayaların yol istemek için bir yolu olmalı. 2 numaralı pine bağlı mavi düğme yaya geçidi düğmesidir: yeşil ışık yanarken düğmeye basılması yeşil ışığı hemen bitirir, böylece araçlar önce sarı, ardından kırmızı ışığı görür.

Işıklar millis() ile çalıştığı için loop(), yeşil durumundan saniyede binlerce kez geçer ve saatle birlikte her seferinde düğmeyi de okuyabilir. Yeşil ışık, iki koşuldan biri doğru olduğunda biter; || (veya) bunu ifade eder:

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // sarıya geç
  }
  break;

Düğme 2 numaralı pini toprağa bağlar; bu nedenle pini INPUT_PULLUP olarak ayarlayın: düğme pini LOW durumuna çekene kadar HIGH okunur.

Düğme yalnızca yeşil durumunda okunur. Sarı ve kırmızı ışıklarda araçlar zaten durmaktadır ve sarı ışık tam bir saniye boyunca yanar; böylece sürücülerin durmak için zamanı olur.

challenge icon

Görev

Orta

Yaya geçidi düğmesini 2 numaralı pine ekleyin:

  • 2 numaralı pini INPUT_PULLUP olarak ayarlayın
  • ışık yeşilken düğmeye basılması yeşil ışığı hemen bitirir (ışık sarıya döner)
  • sarı ve kırmızı ışıklar, düğmeye basılsa da basılmasa da sürelerini korur

Run düğmesine basın, yeşil ışığı bekleyin, mavi düğmeye basın ve ardından Check düğmesine basın.

Kendin dene

// Araç ışıkları
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Kartın kendi LED'i: denetleyicinin durum ışığı
const int statusPin = 13;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // geçerli ışığın yandığı an

bool statusOn = false;
unsigned long lastBlink = 0;

// Bir ışığı yak, diğer ikisini söndür.
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;
  }

  // Araç ışıkları ne yaparsa yapsın, durum ışığı her 500 ms'de bir yanıp söner.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Arduino playground