아두이노 나노 아날로그 시계: DS3231 RTC & 1mA 아미터로 만든 정밀 우드 타이머
부품 및 소모품
| 부품 | 수량 | 비고 |
| 아두이노 나노 R3 | 1 | 메인 컨트롤러 |
| Maxim DS3231M RTC 모듈 (±5ppm, I2C) | 1 | 고정밀 실시간 클록 |
| 1mA 아날로그 아미터 | 3 | 시/분/초 표시용 |
| 5kΩ 저항 | 3 | 아미터 PWM 구동용 (미터 특성에 따라 조정 필요) |
| 10kΩ 저항 | 2 | 풀업/풀다운용 |
| 12mm 택트 스위치 | 2 | 시간 설정용 (상/하 버튼) |
소프트웨어
프로젝트 개요
아두이노 나노와 1mA 아날로그 패널 미터(아미터) 3개를 사용해 우드 케이스에 장착된 아날로그 스타일 시계를 제작했습니다. 초 표시 기능과 시동 시 풀 스케일 캘리브레이션 루틴이 포함되어 있습니다.
주의: 사용되는 아미터마다 특성이 다르므로 PWM 값(코드 내 `analogWrite` 파라미터)은 본인의 미터에 맞춰 반드시 조정해야 합니다. 제공된 코드는 제작자의 미터에 최적화된 값입니다.
회로 구성
- DS3231 RTC: SDA → A4, SCL → A5 (I2C)
- 왼쪽 미터(시): D5 (PWM)
- 오른쪽 미터(분): D6 (PWM)
- 초 미터: D9 (PWM)
- 다운 버튼: D2, 업 버튼: D3
- 전원: USB 5V/GND
주요 코드 로직
시간 읽기 및 표시
DS3231에서 BCD 형식으로 시간 데이터를 읽어 10진수로 변환 후, 각 미터에 해당하는 PWM 듀티 사이클을 출력합니다. 시 미터는 12시간 주기로 12단계(0, 29, 52... 255)로 매핑하고, 분/초 미터는 선형 보간(분: ×4.75, 초: ×4.25)으로 PWM 값을 계산합니다.
버튼으로 시간 설정
- 다운 버튼(D2): 분 감소, 0분 시 시간 감소
- 업 버튼(D3): 분 증가, 59분 시 시간 증가
- 설정 시 초는 0으로 리셋되며 RTC에 즉시 반영
시동 시 캘리브레이션
부팅 시 3개 미터를 순차적으로 풀 스케일(HIGH → 1초 → LOW)로 구동해 기계적 영점과 최대치를 확인할 수 있습니다.
코드
/* Analog Panel Meter - Clock ONLY Mode
* Instructables: https://www.instructables.com/id/Analog-VU-meter-and-Clock-Arduino-Powered/
* Credits: bildr - DS1307 RTC code
*/
#include <Wire.h>
#define DS1307_ADDRESS 0x68
byte zero = 0x00;
int downButton = 2;
int upButton = 3;
int hours = 0, minutes = 0, seconds = 0;
int lastMinute = 0, lastSecond = 0;
int leftMeter = 5, rightMeter = 6, secMeter = 9;
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(leftMeter, OUTPUT);
pinMode(rightMeter, OUTPUT);
pinMode(secMeter, OUTPUT);
// 시동 테스트
digitalWrite(leftMeter, HIGH);
digitalWrite(rightMeter, HIGH);
digitalWrite(secMeter, HIGH);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(leftMeter, LOW);
digitalWrite(rightMeter, LOW);
digitalWrite(secMeter, LOW);
digitalWrite(13, LOW);
delay(1000);
}
void loop() {
printDate();
delay(75);
// 버튼 처리 로직 생략 (원본 참조)
}
byte decToBcd(byte val) { return (val/10*16) + (val%10); }
byte bcdToDec(byte val) { return (val/16*10) + (val%16); }
void printDate() {
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
seconds = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
hours = bcdToDec(Wire.read() & 0b111111); // 24시간제
if (lastMinute != minutes) {
// 시 미터 PWM 설정 (12단계)
// 분 미터 PWM 설정 (minutes * 4.75)
// 초 미터 PWM 설정 (seconds * 4.25)
lastMinute = minutes;
lastSecond = seconds;
}
}
전체 코드는 원문 참조. 본인의 아미터 특성에 맞춰 PWM 매핑 값(시/분/초)을 반드시 조정하세요.
회로도
제공된 회로도 이미지 참조 (배선 상세).
제작 팁
- 아미터 내부 저항과 감도에 따라 5kΩ 직렬 저항 값 변경 필요할 수 있음
- PWM 주파수(기본 490Hz/980Hz)가 미터 응답에 영향 - 필요시 타이머 레지스터로 주파수 조정
- 우드 케이스 가공 시 미터 장착 홀 크기 정확히 측정 후 절삭
- RTC 백업 배터리(CR2032) 장착 필수 - 전원 차단 시에도 시간 유지