Menu
CoddyTech

Zegar NeoPixel: mieszanie wskazówek

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

Wskazówka godzinowa jest czerwona. Tarcza zegara pokazuje 12 godzin, więc godzina to (now / 3600) % 12: od 0 do 11, gdzie 0 oznacza godzinę 12. To już jest numer piksela.

Teraz wskazówki mogą się spotkać. O 10:24:52 wskazówka sekundowa znajduje się na pikselu 10, na wskazówce godzinowej. Jeśli rysujemy je jedna po drugiej, druga zakrywa pierwszą i jedna wskazówka znika.

Zamiast tego można mieszać światło. Przypisz każdej wskazówce własny składnik koloru (czerwony dla godzin, zielony dla minut, niebieski dla sekund) i twórz każdy piksel na podstawie wskazówek, które się na nim znajdują:

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

W miejscu, gdzie wskazówki się spotykają, składniki się sumują: czerwony i niebieski dają magentę, zielony i niebieski cyjan, a czerwony i zielony żółty. Każdy piksel jest ustawiany przy każdym przebiegu, więc pętla zastępuje również ring.clear().

challenge icon

Wyzwanie

Trudny

Dodaj wskazówkę godzinową i połącz wskazówki:

  • godzina to (now / 3600) % 12, wyświetlana na tym pikselu
  • zbuduj każdy piksel w pętli for: czerwony 255, jeśli znajduje się tam wskazówka godzinowa, zielony 255 dla wskazówki minutowej, niebieski 255 dla wskazówki sekundowej

Naciśnij Uruchom: zegar zaczyna od 10:24:50, a wskazówki sekundowa i godzinowa są połączone. Następnie naciśnij Sprawdź.

Spróbuj swoich sił

#include <Adafruit_NeoPixel.h>

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

// Czas początkowy zegara, w sekundach od północy: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

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

void loop() {
  unsigned long now = startTime + millis() / 1000;  // pora dnia w sekundach
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // wskazówka sekundowa: niebieska
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // wskazówka minutowa: zielona
  ring.show();
  delay(100);  // odświeżaj dziesięć razy na sekundę
}
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