Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Umoż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ę
}
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