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.
Aufgabe
MittelStelle 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
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Projekte
3Einparkhilfe
Einparkhilfe: AbstandEinparkhilfe: LichterEinparkhilfe: SignaltöneEinparkhilfe: Anzeige6NeoPixel-Uhr
NeoPixel-Uhr: SekundenNeoPixel-Uhr: MinutenNeoPixel-Uhr: Zeiger mischenNeoPixel-Uhr: Uhrzeit einstellenÜbe selbstständig: Arduino-Playground