아두이노 RTC LED 시계: 신뢰할 수 있는 시간 표시 장치 만들기
부품 및 소모품
| 아두이노 UNO |
×1 |
| 실시간 시계 모듈 (RTC) |
×1 |
| 저항 1kΩ |
×15 |
| 저항 120Ω |
×15 |
| 리니어 레귤레이터 (7805) |
×1 |
| 커패시터 22pF |
×1 |
| 16MHz 크리스탈 |
×1 |
| 커패시터 10µF |
×1 |
| 코인 셀 배터리 CR2032 |
×1 |
| 배터리 홀더 (CR2032용) |
×1 |
| 5mm 녹색 LED |
×190 |
| 바이폴라 NPN 트랜지스터 |
×10 |
| 범용 PNP 트랜지스터 |
×12 |
| 택타일 스위치 (상단 작동) |
×4 |
| 12V 5A 전원 공급 장치 (60W) |
×1 |
필요한 도구 및 장비
- 납땜 인두 (일반)
- 납 와이어 (무연)
- 디지털 멀티미터
프로젝트 소개
먼저 다음 라이브러리를 다운로드하세요 (페이지 하단 링크 참조)
- Wire.h
- RTClib.h
부품 목록
동영상 시청
RTC 시계 모듈
아두이노 회로도
RTC 배선 연결
RTC 스위치
애노드와 캐소드 식별
회로도 (공통 애노드)
공통 캐소드 LED 사용 시 변경 사항
공통 캐소드 LED를 사용하는 경우 다음 변경 사항을 적용하세요.
전원 공급 장치
코드
LED 시계 코드 Arduino
/* 4자리 7세그먼트 디스플레이: https://www.sparkfun.com/products/9483
데이터시트: https://www.sparkfun.com/datasheets/Components/LED/7-Segment/YSD-439AR6B-35.pdf */
// niq_ro 수정: https://nicuflorica.blogspot.com
// 데이터시트: https://www.tme.eu/ro/Document/dfc2efde2e22005fd28615e298ea2655/KW4-563XSA.pdf
// BMIAK Basnayaka 수정: https://www.setnfix.com
int digit1 = 11, digit2 = 10, digit3 = 9, digit4 = 6, digit5 = 5, digit6 = 3;
int segA = 0, segB = 1, segC = 2, segD = 4, segE = 7, segF = 8, segG = 12, segDP = 13;
#include
#include "RTClib.h"
RTC_DS1307 RTC;
byte SW0 = A0, SW1 = A2, SW2 = A1, SWT = A3;
int Adhr = 0, Admnt = 0, D = 0, Z = 0;
long zh, uh, ore, zm, um, miniti;
void setup() {
Wire.begin();
RTC.begin();
// RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // 시간 설정 시 주석 해제
// 1Hz SQW 출력 설정
Wire.beginTransmission(0x68);
Wire.write(0x07);
Wire.write(0x10); // 1Hz 사각파 출력
Wire.endTransmission();
// 핀 모드 설정
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT); pinMode(segDP, OUTPUT);
pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT); pinMode(digit5, OUTPUT); pinMode(digit6, OUTPUT);
pinMode(SW0, INPUT_PULLUP); pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP); pinMode(SWT, INPUT_PULLUP);
digitalWrite(segDP, LOW);
}
void loop() {
DateTime now = RTC.now();
long HR = now.hour() * 1000;
long timp = (HR * 10) + now.minute() * 100 + now.second();
Adhr = now.hour(); Admnt = now.minute();
int DIM = 0;
if (timp >= 250000) timp -= 240000;
// 12/24시간 전환
if (timp < 130000) digitalWrite(segDP, LOW);
if (digitalRead(SWT) == 0) { delay(300); D = (D == 0) ? 1 : 0; }
if (D == 0) {
if (timp >= 130000) { timp -= 120000; digitalWrite(segDP, HIGH); }
}
if (timp >= 130000) digitalWrite(segDP, LOW);
if ((D == 1) && (timp < 130000)) digitalWrite(segDP, LOW);
// 디스플레이 멀티플렉싱
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber01(timp); else displayNumber02(timp);
}
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber03(timp); else displayNumber04(timp);
}
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber05(timp); else displayNumber06(timp);
}
if (digitalRead(SW0) == 0) { delay(100); Z = 1; set_time(); }
}
void set_time() {
byte minutes = Admnt, hours = Adhr;
// 16진법→10진법 변환 및 시간 설정 로직
// SW2: 시간 증가, SW1: 분 증가, SW0: 저장/종료
while (Z != 0) {
// 시간/분 설정 루프
// RTC에 시간 쓰기
Wire.beginTransmission(0x68);
Wire.write(0); Wire.write(0x00); Wire.write(minutes);
Wire.write(0x80 | hours); Wire.write(0x06); Wire.write(0x01);
Wire.write(0x05); Wire.write(0x09); Wire.write(0x10);
Wire.endTransmission();
if (digitalRead(SW0) == 0) Z = 0;
delay(300);
}
}
// displayNumber01~06: 6자리 디스플레이 멀티플렉싱 함수들
// lightNumber: 숫자에 해당하는 세그먼트 점등 (공통 애노드/캐소드 대응)
전체 코드는 원본 프로젝트에서 다운로드 가능합니다.
회로도
SSD와 LED 배선도