Menu
CoddyTech

NeoPixel Saati: Akrep ve Yelkovanı Birleştirme

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

Saat kolu kırmızıdır. Bir saat kadranında 12 saat gösterilir, bu yüzden saat değeri (now / 3600) % 12 olur: 0 ile 11 arasında; burada 0, saat 12'dir. Bu zaten bir piksel numarasıdır.

Artık kollar üst üste gelebilir. 10:24:52'de saniye kolu 10. pikselin üzerindedir ve saat kolunun üstünü kapatır. Kollar art arda çizildiğinde, ikincisi birincinin üstünü kapatır ve kollardan biri kaybolur.

Bunun yerine ışıklar karışabilir. Her kola kendi rengini ver (saatler için kırmızı, dakikalar için yeşil, saniyeler için mavi) ve her pikseli üzerindeki kollardan oluştur:

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));
}

Kolların üst üste geldiği yerlerde renk bileşenleri toplanır: kırmızı ve mavi macenta, yeşil ve mavi camgöbeği, kırmızı ve yeşil sarı oluşturur. Her geçişte her piksel ayarlanır, bu nedenle döngü ring.clear() işlevinin de yerini alır.

challenge icon

Görev

Zor

Saat kolunu ekleyin ve kolları karıştırın:

  • saat değeri (now / 3600) % 12 olur ve bu pikselde çizilir
  • her pikseli bir for döngüsünde oluşturun: saat kolu oradaysa kırmızı 255, dakika kolu için yeşil 255, saniye kolu için mavi 255

Run düğmesine basın: saat, saniye ve saat kolları karışık şekilde 10:24:50'de başlar. 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şladığı 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 içindeki saat, saniye cinsinden
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // saniye ibresi: mavi
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // dakika ibresi: yeşil
  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