Menu
CoddyTech

NeoPixel 시계: 시간 설정하기

Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 24번째.

시계는 항상 10:24:50에서 시작하며, 하루에 한 번만 정확한 시각입니다. 버튼 두 개로 시간을 맞출 수 있습니다. 2번 핀의 빨간 버튼은 시계를 한 시간 앞으로 움직이고, 3번 핀의 초록 버튼은 분침의 픽셀 하나에 해당하는 5분 앞으로 움직입니다.

시간은 하나의 숫자이므로, 시간을 맞추는 것은 초를 더하는 것입니다. 버튼으로 더한 값을 변수에 저장하고 합계에 포함하세요.

unsigned long adjust = 0;   // 버튼으로 추가된 초

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

한 시간은 3600초이고 5분은 300초입니다. 버튼을 누를 때마다 한 번만 셉니다. 버튼이 내려간 상태는 LOW, 이전 상태는 HIGH입니다. 버튼을 누르고 있는 동안 매번 더하면 시계가 빙빙 돌게 됩니다. 이 버튼들은 바운스가 없습니다.

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

모든 시곗바늘은 now에서 계산되므로 함께 움직이며, 나머지 연산을 통해 11시가 지나면 시가, 55분이 지나면 분이 다시 시작됩니다.

challenge icon

챌린지

중급

시간을 설정할 수 있게 만드세요:

  • 핀 2와 3은 INPUT_PULLUP입니다
  • 핀 2를 누르면 3600초가 더해지고, 핀 3을 누르면 300초가 더해집니다. 버튼을 누를 때마다 한 번씩만 계산됩니다
  • 그 초를 now에 더하세요

Run을 누르고 시계를 원하는 시간으로 설정한 다음 Check를 누르세요.

직접 해보기

#include <Adafruit_NeoPixel.h>

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

// 시계가 시작하는 시각을 자정 이후 경과한 초로 나타낸 값: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

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

void loop() {
  unsigned long now = startTime + millis() / 1000;  // 하루 중 현재 시각을 초로 나타낸 값
  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;

  // 각 픽셀은 시침에서 빨간색을, 분침에서 초록색을 받으며
  // 초침에서 파란색을 받으므로, 한 픽셀에 겹친 바늘의 색이 섞인다.
  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);  // 1초에 열 번 다시 그리기
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

프로젝트의 모든 레슨

직접 연습해 보세요: Arduino 플레이그라운드