Menu
CoddyTech

NeoPixel-Uhr: Uhrzeit einstellen

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

Die Uhr beginnt immer bei 10:24:50, was einmal am Tag stimmt. Zwei Tasten korrigieren das: Die rote an Pin 2 stellt die Uhr um eine Stunde vor, die grüne an Pin 3 um 5 Minuten, also um ein Pixel des Minutenzeigers.

Die Zeit ist eine einzige Zahl, also bedeutet, sie einzustellen, Sekunden hinzuzufügen. Speichere, was die Tasten hinzugefügt haben, in einer Variablen und beziehe es in die Summe ein:

unsigned long adjust = 0;   // durch die Tasten hinzugefügte Sekunden

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

Eine Stunde sind 3600 Sekunden und 5 Minuten sind 300. Zähle jeden Tastendruck einmal, wenn die Taste gedrückt wird: jetzt LOW und beim letzten Mal HIGH. Würde bei jedem Durchlauf etwas hinzugefügt, solange die Taste gedrückt bleibt, würde die Uhr einmal rundherum laufen. Diese Tasten prellen nicht.

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

Jeder Zeiger wird aus now berechnet, sodass alle folgen, und die Reste lassen die Stunden nach 11 und die Minuten nach 55 überlaufen.

challenge icon

Aufgabe

Mittel

Stelle die Uhrzeit einstellbar ein:

  • Die Pins 2 und 3 sind INPUT_PULLUP
  • Ein Druck auf Pin 2 addiert 3600 Sekunden, ein Druck auf Pin 3 addiert 300 Sekunden. Jeder Druck wird einmal gezählt, wenn die Taste gedrückt wird.
  • Addiere diese Sekunden zu now

Klicke auf Run und stelle die Uhr auf deine Zeit ein, dann klicke auf 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;
  int hours = (now / 3600) % 12;

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

  // Jedes Pixel erhält Rot vom Stundenzeiger und Grün vom Minutenzeiger
  // und Blau vom Sekundenzeiger, sodass sich die Farben der Zeiger auf einem Pixel mischen.
  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);  // 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