TM1637 4자리 디지털 시계: 시간/알람 설정 기능 탑재 (아두이노 나노)
부품 및 소모품
| 아두이노 나노 R3 |
1개 |
| TM1637 4자리 7세그먼트 디스플레이 |
1개 |
| DS1302 RTC 모듈 |
1개 |
| LED (파란색, 릴리패드 타입 5개) |
1세트 |
| 부저 |
1개 |
프로젝트 소개
RTC 모듈로 현재 시각을 유지하고, 3개의 버튼으로 시간 설정과 알람 설정이 가능한 디지털 시계 프로토타입입니다. 향후 시계 프로젝트의 베이스 코드로 활용하기 위해 공개합니다. 개선 아이디어 환영합니다.
기능
- DS1302에서 실시간 시각 읽어 TM1637에 표시 (시:분, 초 단위 깜빡임)
- 버튼 A: 설정 모드 진입/종료 (시간↔알람 전환)
- 버튼 B: 현재 커서 위치 숫자 증가
- 알람 활성화 시 설정 시각에 부저 울림 (1초 ON/OFF 반복)
- 알람 ON/OFF 토글 버튼 별도 구성
핀 배정
- TM1637: CLK=D4, DIO=D5
- DS1302: CLK=A1, DAT=A2, RST=A3
- 버튼 A: D2 (인터럽트), 버튼 B: D3 (인터럽트)
- 알람 토글 버튼: D9, 부저: D13, 상태 LED: D8
코드
// Mario's Ideas - TM1637 Digital Clock with Setup and Alarm
#include
#include
#include
virtuabotixRTC myRTC(A1, A2, A3); // CLK, DAT, RST
TM1637Display clock(4, 5); // CLK, DIO
int minutes, hours;
int Alarm_minutes = 5, Alarm_hours = 18;
uint8_t Blank[] = {0x0};
int POSITION = 0;
int digits[4];
int interval = 0;
#define AlarmBtn 9
#define Buzzer 13
#define Led 8
boolean Alarm_set = false;
boolean Alarm_in_progress = false;
boolean Setup_on = false;
void setup() {
attachInterrupt(digitalPinToInterrupt(2), Press_A_Button, RISING);
attachInterrupt(digitalPinToInterrupt(3), Press_B_Button, RISING);
pinMode(AlarmBtn, INPUT);
pinMode(Buzzer, OUTPUT);
pinMode(Led, OUTPUT);
digitalWrite(Buzzer, LOW);
clock.setBrightness(0x0f);
Serial.begin(9600);
}
void Press_A_Button() {
if (interval > 3) {
if (!Setup_on) {
Setup_on = true;
if (Alarm_set) {
digits[0] = Alarm_hours / 10;
digits[1] = Alarm_hours % 10;
digits[2] = Alarm_minutes / 10;
digits[3] = Alarm_minutes % 10;
} else {
digits[0] = myRTC.hours / 10;
digits[1] = myRTC.hours % 10;
digits[2] = myRTC.minutes / 10;
digits[3] = myRTC.minutes % 10;
}
} else {
POSITION++;
if (POSITION == 4) {
if (Alarm_set) {
Alarm_minutes = digits[3] + digits[2] * 10;
Alarm_hours = digits[1] + digits[0] * 10;
} else {
myRTC.setDS1302Time(0, digits[3] + digits[2] * 10, digits[1] + digits[0] * 10,
myRTC.dayofweek, myRTC.dayofmonth, myRTC.month, myRTC.year);
}
POSITION = 0;
Setup_on = false;
}
}
interval = 0;
}
}
void Press_B_Button() {
if (interval > 3 && Setup_on) {
digits[POSITION]++;
if (POSITION == 0 && digits[POSITION] == 3) digits[POSITION] = 0;
if (POSITION != 0 && digits[POSITION] == 10) digits[POSITION] = 0;
interval = 0;
}
}
void loop() {
// 알람 토글 버튼 처리 (디바운싱 포함)
if (digitalRead(AlarmBtn) == HIGH && !Alarm_set) {
if (interval > 30) { digitalWrite(Led, HIGH); Alarm_set = true; delay(300); }
} else if (digitalRead(AlarmBtn) == HIGH && Alarm_set) {
if (interval > 30) { Alarm_set = false; Alarm_in_progress = false; digitalWrite(Led, LOW); delay(300); }
}
myRTC.updateTime();
if (Setup_on) {
// 설정 모드: 4자리 표시 후 커서 위치 깜빡임
for (int i = 0; i < 4; i++) clock.showNumberDec(digits[i], false, 1, i);
delay(200);
clock.setSegments(Blank, 1, POSITION);
delay(200);
} else {
// 일반 모드: 알람 확인 및 시간 표시
if (myRTC.minutes == Alarm_minutes && myRTC.hours == Alarm_hours && Alarm_set && !Setup_on) {
Alarm_in_progress = true;
}
if (Alarm_in_progress) {
digitalWrite(Buzzer, HIGH); delay(1000);
digitalWrite(Buzzer, LOW); delay(1000);
}
if (myRTC.minutes != minutes) {
int dispVal = (myRTC.hours / 10) * 1000 + (myRTC.hours % 10) * 100 +
(myRTC.minutes / 10) * 10 + (myRTC.minutes % 10);
clock.showNumberDecEx(dispVal, 0x80 >> 1, true); // 콜론 깜빡임
minutes = myRTC.minutes;
hours = myRTC.hours;
}
}
if (interval < 200) interval++;
}
회로도
프로젝트 페이지의 회로도 이미지 참고 (아두이노 나노, TM1637, DS1302, 버튼, 부저, LED 연결).