Menu
CoddyTech

NeoPixel-Uhr: Zeiger mischen

Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 23 von 24.

Der Stundenzeiger ist rot. Ein Zifferblatt zeigt 12 Stunden, also ist die Stunde (now / 3600) % 12: 0 bis 11, wobei 0 für 12 Uhr steht. Das ist bereits eine Pixelnummer.

Jetzt können sich Zeiger überlagern. Um 10:24:52 steht der Sekundenzeiger auf Pixel 10, genau über dem Stundenzeiger. Werden sie nacheinander gezeichnet, überdeckt der zweite den ersten und ein Zeiger verschwindet.

Stattdessen können sich die Farben mischen. Weise jedem Zeiger seinen eigenen Farbanteil zu (Rot für Stunden, Grün für Minuten, Blau für Sekunden) und setze jedes Pixel aus den Zeigern zusammen, die darauf liegen:

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

Wo sich Zeiger überlagern, addieren sich die Farbanteile: Rot und Blau ergeben Magenta, Grün und Blau Cyan, Rot und Grün Gelb. Jedes Pixel wird bei jedem Durchlauf gesetzt, daher ersetzt die Schleife auch ring.clear().

challenge icon

Aufgabe

Schwer

Füge den Stundenzeiger hinzu und mische die Zeiger:

  • die Stunde ist (now / 3600) % 12 und wird auf diesem Pixel dargestellt
  • erstelle jedes Pixel in einer for-Schleife: Rot 255, wenn der Stundenzeiger dort ist, Grün 255 für den Minutenzeiger, Blau 255 für den Sekundenzeiger

Drücke Run: Die Uhr startet um 10:24:50, wobei sich Sekunden- und Stundenzeiger überlagern. Dann Check.

Probier es selbst

#include <Adafruit_NeoPixel.h>

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

// Die Startzeit der Uhr, in Sekunden seit Mitternacht: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

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

void loop() {
  unsigned long now = startTime + millis() / 1000;  // die Tageszeit in Sekunden
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // Sekundenzeiger: blau
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // Minutenzeiger: grün
  ring.show();
  delay(100);  // zehnmal pro Sekunde neu zeichnen
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Arduino-Playground