중급⏱ 예상 시간: 40분📝 6단계
OLED 디지털 시계
OLED 디스플레이에 시간, 분, 초를 표시하는 디지털 시계를 만듭니다. millis() 함수로 시간을 관리합니다.
🧩 필요한 모듈
Arduino Uno
브레드보드
택트 스위치 (버튼)
점퍼 와이어
OLED 디스플레이 (0.96인치 I2C)
저항 (220Ω / 10kΩ)
📖 단계별 설명서
1단계준비물 확인
다음 부품들을 준비해주세요:
- Arduino Uno 1개
- 브레드보드 1개
- 점퍼 와이어 6개
- OLED 디스플레이 (0.96인치 I2C) 1개
- 택트 스위치 2개 (시간/분 설정용)
- 10kΩ 저항 2개
2단계회로 연결하기
- OLED의 SDA를 A4에, SCL을 A5에 연결합니다.
- OLED의 VCC를 5V, GND를 GND에 연결합니다.
- 시간 설정 버튼을 D2에 연결합니다 (풀다운 저항 연결).
- 분 설정 버튼을 D3에 연결합니다 (풀다운 저항 연결).
📐 회로도
회로도 이미지
/images/projects/oled-clock-circuit.png
3단계라이브러리 설치
아두이노 IDE에서 스케치 > 라이브러리 관리로 이동하여:
Adafruit SSD1306라이브러리를 설치합니다.Adafruit GFX Library도 함께 설치합니다.
4단계코드 작성하기
code.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int BTN_HOUR = 2;
const int BTN_MIN = 3;
int hours = 12;
int minutes = 0;
int seconds = 0;
unsigned long prevMillis = 0;
void setup() {
pinMode(BTN_HOUR, INPUT);
pinMode(BTN_MIN, INPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
}
void loop() {
unsigned long now = millis();
// 1초마다 시간 업데이트
if (now - prevMillis >= 1000) {
prevMillis = now;
seconds++;
if (seconds >= 60) { seconds = 0; minutes++; }
if (minutes >= 60) { minutes = 0; hours++; }
if (hours >= 24) { hours = 0; }
}
// 버튼으로 시간 설정
if (digitalRead(BTN_HOUR) == HIGH) {
hours = (hours + 1) % 24;
delay(300);
}
if (digitalRead(BTN_MIN) == HIGH) {
minutes = (minutes + 1) % 60;
seconds = 0;
delay(300);
}
// OLED에 시간 표시
display.clearDisplay();
display.setTextSize(1);
display.setCursor(35, 10);
display.print("Digital Clock");
display.setTextSize(3);
display.setCursor(10, 30);
if (hours < 10) display.print("0");
display.print(hours);
display.print(":");
if (minutes < 10) display.print("0");
display.print(minutes);
display.setTextSize(1);
display.setCursor(110, 40);
if (seconds < 10) display.print("0");
display.print(seconds);
display.display();
delay(50);
}+52 줄 더 보기
5단계업로드 및 테스트
- 코드를 업로드합니다.
- OLED에 시간이 표시되고 초가 증가하는지 확인합니다.
- 시간 버튼과 분 버튼을 눌러 시간을 설정해봅니다.
💡 팁: millis()는 아두이노가 켜진 시점부터의 경과 시간을 밀리초로 반환합니다. delay()와 달리 다른 작업을 막지 않습니다.
6단계심화 — 알람 기능 추가
부저를 추가하면 특정 시간에 알람이 울리는 기능을 구현할 수 있습니다.