Menu
CoddyTech

NeoPixel Saati: Saati Ayarlama

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

Saat her zaman 10:24:50'te başlar; bu, günde bir kez doğru saattir. İki düğme bunu düzeltir: 2 numaralı pindeki kırmızı düğme saati bir saat ileri alır, 3 numaralı pindeki yeşil düğme ise 5 dakika, yani dakika kolunun bir pikseli kadar ilerletir.

Saat tek bir sayıdır, bu yüzden ayarlamak saniye eklemek demektir. Düğmelerin eklediği değeri bir değişkende tut ve toplama dahil et:

unsigned long adjust = 0;   // düğmelerle eklenen saniyeler

unsigned long now = startTime + adjust + millis() / 1000;

Bir saat 3600 saniye, 5 dakika ise 300 saniyedir. Her basışı, düğme aşağı indiğinde bir kez say: şimdi LOW, önceki okumada ise HIGH. Düğme basılı tutulurken her döngüde ekleme yapmak saatin dönüp durmasına yol açar. Bu düğmelerde kontak sıçraması olmaz.

int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
  adjust = adjust + 3600;
}
lastHour = hourState;

Her kol now değerinden hesaplanır, bu yüzden hepsi birlikte ilerler; kalanlar da saatleri 11'den, dakikaları 55'ten sonra başa sarar.

challenge icon

Görev

Orta

Saati ayarlanabilir hâle getirin:

  • 2 ve 3 numaralı pinler INPUT_PULLUP olarak ayarlanır
  • 2 numaralı pine basıldığında 3600 saniye, 3 numaralı pine basıldığında 300 saniye eklenir; her düğmeye basma, düğme aşağı indiğinde bir kez sayılır
  • bu saniyeleri now değerine ekleyin

Run düğmesine basın ve saati istediğiniz zamana ayarlayın, ardından Check düğmesine basın.

Kendin dene

#include <Adafruit_NeoPixel.h>

const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);

// Saatin başlangıç zamanı, gece yarısından itibaren saniye cinsinden: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

void setup() {
  ring.begin();
}

void loop() {
  unsigned long now = startTime + millis() / 1000;  // günün saati, saniye cinsinden
  int seconds = now % 60;
  int minutes = (now / 60) % 60;
  int hours = (now / 3600) % 12;

  int secondPixel = seconds / 5;
  int minutePixel = minutes / 5;
  int hourPixel = hours;

  // Her piksel, saat ibresinden kırmızı, dakika ibresinden yeşil
  // ve saniye ibresinden mavi renk alır; böylece aynı pikseldeki ibrelerin renkleri karışır.
  for (int i = 0; i < pixelCount; i++) {
    int r = 0;
    int g = 0;
    int b = 0;
    if (i == hourPixel) {
      r = 255;
    }
    if (i == minutePixel) {
      g = 255;
    }
    if (i == secondPixel) {
      b = 255;
    }
    ring.setPixelColor(i, ring.Color(r, g, b));
  }
  ring.show();
  delay(100);  // saniyede on kez yeniden çiz
}
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