Menu
CoddyTech

Jam NeoPixel: Atur Waktu

Termasuk bagian Proyek dalam perjalanan Arduino di Coddy. Pelajaran 24 dari 24.

Jam selalu dimulai pada 10:24:50, yang tepat hanya sekali sehari. Dua tombol memperbaikinya: tombol merah pada pin 2 memajukan jam satu jam, tombol hijau pada pin 3 memajukannya 5 menit, satu piksel pada jarum menit.

Waktu adalah satu angka, jadi mengaturnya berarti menambahkan detik. Simpan penambahan dari tombol dalam variabel dan sertakan dalam penjumlahan:

unsigned long adjust = 0;   // detik yang ditambahkan lewat tombol

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

Satu jam adalah 3600 detik dan 5 menit adalah 300 detik. Hitung setiap tekanan satu kali, saat tombol ditekan: LOW sekarang dan HIGH sebelumnya. Menambahkan nilai pada setiap putaran saat tombol ditekan akan membuat jam berputar terus. Tombol ini tidak memantul.

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

Setiap jarum berasal dari now, jadi semuanya bergerak mengikuti, dan sisanya membungkus jam setelah 11 serta menit setelah 55.

challenge icon

Tantangan

Sedang

Buat waktu dapat diatur:

  • pin 2 dan 3 adalah INPUT_PULLUP
  • menekan pin 2 menambahkan 3600 detik, menekan pin 3 menambahkan 300 detik, masing-masing dihitung sekali saat tombol ditekan
  • tambahkan detik tersebut ke now

Tekan Run dan atur jam ke waktu yang kamu inginkan, lalu tekan Check.

Coba sendiri

#include <Adafruit_NeoPixel.h>

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

// Waktu awal jam, dalam detik sejak tengah malam: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

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

void loop() {
  unsigned long now = startTime + millis() / 1000;  // waktu saat ini, dalam detik
  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;

  // Setiap piksel mendapat warna merah dari jarum jam, hijau dari jarum menit
  // dan biru dari jarum detik, sehingga warna jarum pada satu piksel bercampur.
  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);  // gambar ulang sepuluh kali per detik
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Arduino