Zegar NeoPixel: ustawianie godziny
Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 24 z 24.
Zegar zawsze zaczyna od 10:24:50, co zgadza się z rzeczywistym czasem raz dziennie. Dwa przyciski to korygują: czerwony na pinie 2 przesuwa zegar o godzinę do przodu, a zielony na pinie 3 o 5 minut, czyli o jeden piksel wskazówki minutowej.
Czas to jedna liczba, więc ustawienie go polega na dodaniu sekund. Zapisz w zmiennej to, co dodały przyciski, i uwzględnij tę wartość w sumie:
unsigned long adjust = 0; // sekundy dodane za pomocą przycisków
unsigned long now = startTime + adjust + millis() / 1000;Godzina to 3600 sekund, a 5 minut to 300. Zliczaj każde naciśnięcie raz, gdy przycisk zostanie wciśnięty: teraz LOW, a poprzednio HIGH. Dodawanie przy każdym przebiegu, gdy przycisk jest wciśnięty, obracałoby wskazówki zegara w kółko. Te przyciski nie drgają.
int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
adjust = adjust + 3600;
}
lastHour = hourState;Każda wskazówka jest wyznaczana na podstawie now, więc wszystkie poruszają się razem, a reszty zawijają godziny po 11 i minuty po 55.
Wyzwanie
ŚredniUmożliw ustawianie czasu:
- piny 2 i 3 to
INPUT_PULLUP - naciśnięcie przycisku na pinie 2 dodaje 3600 sekund, a naciśnięcie przycisku na pinie 3 dodaje 300 sekund; każde naciśnięcie jest liczone raz, gdy przycisk zostaje wciśnięty
- dodaj te sekundy do
now
Naciśnij Run i ustaw zegar na właściwą godzinę, a następnie naciśnij Check.
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, od którego startuje zegar, 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; // czas dnia w sekundach
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;
// Każdy piksel otrzymuje kolor czerwony od wskazówki godzinowej, a zielony od wskazówki minutowej
// oraz niebieski od wskazówki sekundowej, więc kolory wskazówek na jednym pikselu się mieszają.
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); // odświeżaj dziesięć razy na sekundę
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Projekty
3Czujnik parkowania
Czujnik parkowania: odległośćCzujnik parkowania: światłaCzujnik parkowania: sygnały dźwiękoweCzujnik parkowania: wyświetlacz6Zegar NeoPixel
Zegar NeoPixel: sekundyZegar NeoPixel: minutyZegar NeoPixel: mieszanie wskazówekZegar NeoPixel: ustawianie godzinyPoćwicz samodzielnie: Edytor online Arduino