디지털 시계, 아날로그 시계, 온습도 표시 모드와 라이프 게임, 사이먼, 테트리스 등 3가지 게임 모드도 탑재되어 있습니다.
마스터 클럭 없이 독립 실행하거나, 필요 시 마스터 클럭의 슬레이브로 동작할 수 있습니다.
마스터 클럭이 없으면 내장된 온도 보상형 실시간 시계(RTC)로 시간을 제어합니다.
PIR 센서나 도플러 레이더를 옵션으로 장착해 사람이 없을 때 자동으로 디스플레이를 끌 수 있습니다.
시계 크기는 500mm × 500mm(19.68″ × 19.68″), 무게 12lb(5.5kg)로 벽걸이형으로 설계되었습니다. 네 모서리에 터치 패드가 있어 설정과 제어가 가능합니다.
1단계: 워드 클럭이란?
워드 클럭은 단어, 숫자, 문자의 매트릭스를 이용해 시간을 표시합니다. 여러 설계 유형이 있으며 복잡도가 다릅니다.
단순형: 5분 단위 블록 표시
가장 단순한 유형은 '정각', '5분 전', '10분 전' 등 5분 단위 단어 블록을 사용합니다. 약 20개 LED 블록만 필요해 제작이 가장 쉽지만, 정해진 형식으로만 시간을 표시할 수 있습니다.
중급형: 11×10 매트릭스 + 모서리 4개 LED
110개 개별 LED로 숫자와 기본 이미지 표시가 가능합니다. 여전히 5분 단위 단어 표시지만 '5분 막 지남', '10분 거의 다 됨' 등으로 해상도를 약간 높입니다. 모서리 4개 LED로 5분 사이 4분을 채웁니다. LED 스트립을 사용해 제작 난이도를 낮춥니다.
이 유형의 상용 제품도 있습니다. 450mm 벽걸이형은 약 1,000파운드에 교체 가능한 다양한 색상/소재 전면 패널을 제공하며, 소형 데스크톱 버전과 손목시계형도 있습니다.
고급형: 16×16 매트릭스(256개 LED)
가장 복잡한 유형은 256개 LED를 제어하는 16×16 매트릭스를 사용합니다. 1분 단위 단어 해상도로 시간을 표시하며, 오전/오후/밤 등도 표현합니다. '따뜻함', '매우 추움' 등 온도도 단어로 표시합니다.
256개 LED로 다양한 표시 모드가 가능하지만, 매트릭스 배선 연결이 많아 제작이 꽤 복잡합니다. 표면 실장 부품으로 PCB에 LED 매트릭스를 구성하면 슬림한 본체와 단순한 제작이 가능하지만, 500mm 이상이면 PCB 비용이 비싸집니다.
본 프로젝트처럼 직접 배선하는 방식은 공간이 필요하며, 500mm × 500mm가 배선 다발을 수용하기 좋은 시작점입니다. 더 큰 벽면 전체 크기도 수제 매트릭스로 제작 가능합니다.
2단계: 주요 변경 사항
이 클럭은 Wouter Devinck 클럭의 하드웨어와 '카탈란' Pijuana 클럭의 소프트웨어를 결합했습니다. 커스텀 PCB 없이 기성 모듈과 전원용 소형 베로 보드 3개만 사용했습니다.
주요 변경 내용
커스텀 PCB 미사용: 저렴하고 구하기 쉬운 기성 모듈만 사용
본체 구조: 14mm MDF 2장 사용(기존 18mm 1장). 후면 패널을 전면보다 10mm 작게 잘라(상단 제외) 두께 14mm처럼 보이게 함
깊이 확보: Wouter 클럭은 유리 포함 20mm 깊이지만, 본 클럭은 4mm 유리 + 2mm 먼지 씰 포함 34mm 깊이. 후면 패널 후퇴와 유리 1.5mm 후퇴로 대부분의 각도에서 14mm로 보임. 이 여분 깊이로 수제 LED 매트릭스와 배선 다발, 표면 실장 IC 없는 MAX7219 모듈 사용 가능
디스플레이 직결: PCB 없이 LED에 직접 배선해 크기 자유도 확보
터치 센서: Azoteq IQS127D 대신 TTP223 터치 센서 모듈 사용
MAX7219 드라이버 보드: 기성 LED 매트릭스 보드 개조 사용(부품 실장 완료)
아두이노 나노: 소형 크기로 채택
PIR 센서: 사람 감지 시 디스플레이 자동 끄기(비활성화 가능)
휘도 보정 트리머: 하단에서 소형 드라이버로 자동 밝기 보정 가능
마스터 클럭 동기화: 30초마다 동기화 펄스 수신. 없으면 RTC로 프리런. 동기화 펄스는 메인 디스플레이에 표시
소프트웨어 기반: '카탈란' Pijuana 버전 기반, 영어로 번역. 크레딧 화면에 버전, 제작자, 제작 연도 표시
단어 온도 표시 제거: 동기화 상태, PIR ON/OFF, 초 선형 표시로 대체
영어 표현 개선: 개인/지역별 표현 차이 반영(아래 상세)
영어 표현 변경 상세
'MINUTES' → 1분 전/후일 때 'MINUTE'로 변경
'QUARTER' 앞에 'A' 추가('A QUARTER PAST', 'A QUARTER TO')
Wouter 클럭에 누락된 'ELEVEN' 추가
정오: 'TWELVE OCLOCK IN THE AFTERNOON'
자정: 'TWELVE OCLOCK AT NIGHT'. 자정 이후는 항상 'IN THE MORNING'
'O'CLOCK' → 구두점 제거해 'OCLOCK'로 표시
3단계: 케이스 설계
커스텀 PCB를 쓰지 않아 Wouter 설계보다 케이스가 깊습니다. 본 케이스는 후면 먼지 씰 2mm + 후면 MDF 14mm + 전면 디스플레이 보드 14mm + 4mm 플로트 유리 = 34mm 깊이입니다. Wouter 케이스는 18mm MDF + 2mm 유리 = 21mm입니다.
극단적 측면에서 보면 본 케이스가 더 두꺼워 보입니다. 이를 보완하기 위해:
후면 패널을 검정, 전면 가장자리는 흰색으로 마감해 시선이 얇은 흰색 가장자리에 집중되게 함
후면 패널을 하단과 양옆 10mm 짧게 잘라 착시 효과 강화
정면에서 볼수록 후면 패널이 시야에서 사라져 얇은 14mm 전면 보드만 보입니다. 4mm 유리도 전면 보드보다 1-2mm 짧게 잘라 숨깁니다. 결과적으로 34mm 두꺼운 케이스가 Wouter의 21mm 케이스만큼 슬림해 보입니다.
4단계: 제어부
디스플레이 네 모서리(좌상, 우상, 좌하, 우하)에 TTP223 터치 컨트롤 모듈이 있습니다.
버튼 기능은 현재 모드에 따라 달라집니다(위 표 참조).
5단계: 서머타임 자동 설정
사용하지 않음.
6단계: 디스플레이 모드 - 시계 & 환경
애니메이션 1: 4가지 모드 순환 - 워드 클럭 → 디지털 클럭 → 온습도 → 아날로그 클럭
애니메이션 2: 시작 모드에서 소프트웨어 버전, 제작자명, 클럭 이름이 스크롤됩니다.
7단계: 디스플레이 모드 - 게임
콘웨이의 라이프 게임: 무한 2차원 격자에서 세포가 생/사 상태로 진화하는 세포 자동자. 카탈란 클럭 코드 그대로 사용.
사이먼: 컴퓨터가 생성한 시퀀스를 따라 하는 기억력 게임. 마지막 입력은 더블 탭으로 종료. 실패 시 점수 표시.
테트리스: 1984년 소련산 타일 매칭 퍼즐 게임. 버튼 제어 부분이 아직 개선 필요.
8단계: 프로토타이핑
MAX7219 모듈에 딸린 도트 매트릭스 LED로 프로토타입 제작 및 테스트 가능.
※ 이 임시 수정은 도트 매트릭스 디스플레이로 코드 테스트 시에만 필요합니다.
소프트웨어/단어 레이아웃 수정 사항을 실물 크기 제작 전 미니어처로 검증할 수 있습니다. 도트 매트릭스 LED 배선을 소프트웨어 연결에 맞게 수정해야 합니다.
5V와 PIR 센서선은 PCB 헤더 소켓으로 클럭에 연결. 동기화 케이블도 헤더 핀/소켓으로 마스터 클럭 30초 동기화 케이블과 연결.
PIR 감도와 점등 유지 시간 조절용 트리머 2개 내장.
PIR On/Off 제어
워드 클럭 모드에서 좌하 센서 터치 → PIR On, 우하 센서 터치 → PIR Off. Off 시 디스플레이 항상 켜짐. 설정 변경 시 'PIR ON' 또는 'PIR OFF' 5초 표시.
초기 전원 투입 시 기본값 PIR Off. 바로 PIR On 하면 PIR 초기화(약 1분) 전이라 디스플레이가 꺼질 수 있음.
25단계: 도플러 레이더 제어 옵션
PIR 대체용 도플러 레이더 모듈 옵션.
워드 클럭 메뉴에서 동일하게 PIR On/Off로 제어. 15분마다 움직임 체크. 움직임 없으면 감지될 때까지 소등. PIR과 달리 유리/플라스틱 투과 가능해 케이스 내부(유리 뒤, PVC 스티커 뒤)에 장착. 감지 거리 약 5m(16'5″).
케이스 내부에 도플러 레이더 모듈 고정. 전면 패널에 마이크로파 센서용 구멍 가공.
전면 패널 구멍(도플러 레이더 센서용). PVC 스티커와 유리 뒤에 숨겨짐.
26단계: PIR/도플러 레이더 On/Off 제어
워드 클럭 모드에서 좌하 센서 터치 → PIR On, 우하 센서 터치 → PIR Off. Off 시 디스플레이 항상 켜짐.
설정 변경 시 'PIR ON' 또는 'PIR OFF' 5초 표시. 초기 전원 투입 시 기본 PIR Off. 바로 On 하면 PIR 초기화 전이라 디스플레이 꺼질 수 있음.
27단계: 자동 밝기 레벨 설정(상세)
주변광 자동 감지 후 LED 밝기 조절. 최초 설치 시 실위치 최대 조도에서 보정.
미니 USB 포트에 모바일/노트북 연결, 시리얼 모니터 앱 실행. 재부팅 후 초기 화면 지나면 데이터 출력. 'light reading'과 'bright' 값 주시.
최대 조도 상태에서 보정용 트리머(조도 센서 우측 구멍)에 소형 드라이버 삽입. 천천히 돌려 'light reading = 600'(또는 brightness.cpp 설정값), 'bright = 15' 맞춤. 이제 최대 조도에서 최대 휘도. 너무 돌리면 light reading만 초과, bright는 15 고정. 전체적으로 더 어둡게 원하면 최대 조도에서 light reading을 600 미만으로.
※ bright=15 시 최대 전류 출력. 최대 전류는 MAX7219 모듈 R1(RSET)로 결정, 사용 LED에 맞게 선택.
28단계: 시계 설정
디지털 클럭 모드에서 좌하 센서 터치로 진입.
시간 숫자가 초당 2회 점멸로 설정 모드 표시. 센서 기능:
우상: 시/분 숫자 증가
좌상: 시/분 숫자 감소
좌하 1번째: 설정 모드 진입(시 선택)
좌하 2번째: 분 선택으로 전환
좌하 3번째: 설정 모드 종료 및 시간 저장
우하: 초를 00으로 리셋
29단계: 동기화
30초 마스터 클럭 동기화 케이블 연결 시 설정 모드 벗어나면 30초로 점프 동기화. 마스터 클럭 없으면 온보드 온도 보상 RTC로 프리런(정밀 석영 시계).
설정 모드에서 초를 대략 동기화(±10초 내외) 후 설정 모드 나가면 자동 동기화.
애니메이션: 워드 클럭이 수 초 빠르게 가다가 마스터 클럭의 30초 동기화 펄스(정시/정시+30초 수신)로 30초에 동기화. 0초 펄스는 무시. 동기화는 클럭이 20초 경과/20초 전일 때만 작동. 정상 동작 시 'SYNC' 글자만 잠깐 표시되고 초 보정은 육안으로 안 보임.
※ 동기화 펄스는 30초마다 수신되나 0초 펄스는 무시.
30단계: 소프트웨어 및 수정 방법
소프트웨어 다운로드(소프트웨어 탭). 주요 모듈:
Brett_wordclock_v4_3.ino 메인 프로그램(최신 업데이트로 코드 10% 단축, srdevil 기여)
brightness.cpp/.h 자동 밝기 조절
character.cpp/.h 문자(숫자) 정의
credits.cpp/.h 크레딧 화면
display.cpp/.h 디스플레이 & LED 함수
life.cpp/.h 라이프 게임
serial.cpp/.h 시리얼 포트 설정 메뉴
simon.cpp/.h 사이먼 게임
temphum.cpp/.h 온습도 표시
tetris.cpp/.h 테트리스 게임
time.cpp/.h 워드 클럭, 디지털 클럭
timeanalog.cpp/.h 아날로그 클럭
touchbuttons.cpp/.h 터치 버튼, 모드 전환
서드파티 라이브러리:
Chronodot.cpp/.h (DS3231용)
DHT.cpp/.h (DHT22용)
LedControl.cpp/.h (MAX7219용)
stc.cpp/.h/platform.h (심플 테트리스 클론)
pitches.h (아두이노 공식 노트 주파수)
코드 수정 시 '카탈란 코드'와 비교하면 이해 용이. 본인 변경 사항에 '//Brett' 주석 표기.
코드 수정 가이드
코딩에 익숙치 않다면 코드를 만지며 동작 원리 파악 권장. 미세한 변경마다 버전별 저장(실수 시 롤백용). 선형 초 표시 유지 시 credit.h 47번 줄 부근 버전 번호 갱신으로 테스트 버전 식별.
전체 코드 설명은 너무 길어 생략. 단어 변경 및 표시 시점 수정 핵심만 안내.
단어 정의: time.h
52번째 줄 예시:
const byte w_the[3] PROGMEM = { 0, 0, 3 };
'THE' 단어를 LED 위치로 정의. 중괄호 { 0, 0, 3 } = LED 좌표. 매트릭스 번호는 좌상단부터 0 시작. { 0, 0, 3 } = 첫 번째 행, 첫 번째 열부터 3개 LED 점등. 'THE' 글자가 이 위치에 있으므로 'THE' 표시.
'TIME'은 { 0, 4, 4 }(0행, 5번째 LED부터 4개 점등). 아래로 내려가며 모든 단어 위치 정의.
단어 점등 제어: time.cpp
695번째 줄부터 예시. 자정(00:00)에 'THE TIME IS TWELVE OCLOCK AT NIGHT' 표시 로직:
'THE TIME IS'는 687번째 줄부터 항상 표시
분이 0이면 → 시가 0이면 → 'TWELVE', 'OCLOCK', 'AT', 'NIGHT' 단어 점등 규칙 추가
코드 아래로 모든 시간 조합 커버.
아날로그 클럭 코드 개선(srdevil 제안)
srdevil 댓글로 코드 개선 제안 받음. 미테스트지만 참고용 포함.
"18:00이면 긴 바늘 위, 짧은 바늘 아래. 하지만 18:59에도 짧은 바늘이 완전히 아래로 가 있어 일반 시계처럼 17:59로 보임. 형제가 코드 수정: 15분 넘으면 짧은 바늘이 다음 숫자로 미리 이동. 이에 따라 15분~ 구간 해상도도 향상."