DS3231 RTC, BME280 기상, BH1750 조도 센서, ESP01 NTP 연동 고정밀 LED 매트릭스 시계
부품 및 소모품
부품
수량
비고
아두이노 나노 R3
1
Maxim Integrated DS3231MPMB1 주변 모듈
1
이베이 저가형, 배터리 폭발 방지용 저항 제거 필요
SparkFun BME280 대기 센서 브레이크아웃
1
이베이 저가형
BH1750 조도 센서
1
이베이 구매
Max7219 32x8 LED 매트릭스
1
10µF 커패시터
2
Espressif ESP8266 ESP-01
1
NTP 시간 동기화용 (선택 사항)
LM3940IT3.3 (3.3V LDO 레귤레이터)
1
ESP01용
SparkFun 레벨 시프터 보드
1
ESP01용 필수
프로젝트 개요
Nick의 LED 워드 클락(Word Clock)을 보고 아두이노에 입문하게 되었습니다. 그의 코드를 다운로드한 후 추가 센서, 버튼, ESP01을 추가하며 수정했습니다.
BH1750: 조도 조건에 따라 디스플레이 자동 조도 조절, 야간에는 디스플레이 끄기 기능
BME280: 온도, 습도, 기압 표시
ESP01: pool.ntp.org에서 시간 가져오기 (NTP)
추가 버튼으로 설정 변경이 용이합니다. 조도 센서 설정, 폰트 변경, NTP/DST/UTC 설정 등을 버튼으로 조정 가능합니다. dotmatrixtool.com으로 제작한 6가지 새로운 폰트를 추가했습니다. 워드 클락에 단어를 추가하고 많은 데이터를 PROGMEM으로 이동해 RAM을 절약했습니다.
코드는 알려지지 않은 버그 수정과 약간의 조정 외에는 완료되었으며, 케이스 제작 예정입니다. 조도 센서 코드는 사용 환경에 맞게 조정해야 합니다(저는 밝은 햇빛 아래 창가에서 코딩했습니다).
ESP01은 NTP로 시간을 가져오며, 필요 없을 때 WiFi를 끄고 슬립 모드로 진입했다가 시리얼로 깨워 UNIX 시간 형식으로 시간을 가져옵니다. SSID와 비밀번호는 아두이노 코드에서 편의상 전달합니다. DST/UTC/BST 계산 기능도 포함되어 있으며 메뉴에서 설정 변경 또는 비활성화 가능합니다. 설정은 EEPROM에 저장되어 전원 차단 후에도 유지됩니다.
Arduino : Sent NTP request to ESP01
ESP01 : NTP request received from Arduino [attempt 1 of 3]
Connecting to SSID: TheInternets....connected
SSID: TheInternets, IP Address: 192.168.0.135
Signal Strength (RSSI): -42 dBm
Sending NTP packet to: 195.195.221.100 [attempt 1]
Sending NTP packet to: 195.195.221.100 [attempt 2]
UNIX1562848457
Disabling WiFi....ok
// 시계 설정
// [200] 기본 밝기 (0-15), 메뉴에서 설정 가능
byte intensity = 2;
// [201] 기본 시계 모드. 0 = 기본 모드
byte clock_mode = 0;
// [206] 랜덤 모드 - 몇 시간마다 표시 유형 변경. 0 = 끄기
bool random_mode = 0;
// [207] 폰트 랜덤 모드 - 몇 시간마다 폰트 변경. 1 = 켜기
bool random_font_mode = 0;
// [208] 12/24시간제. 0 = 24시간, 1 = 12시간
bool ampm = 0;
// 조도 설정
// [202] 기본 디스플레이 온/오프 모드. 0=일반, 1=항상 켬, 2=항상 끔, 3-5=시간 기반
byte display_mode = 5;
// [209] 자동 조도 조절 활성화
bool auto_intensity = 1;
// 조도 센서가 디스플레이를 끌 수 있는 시간 (24시간제, 8시~이 시간 사이 체크)
byte hour_off_1 = 21, hour_off_2 = 22, hour_off_3 = 23;
// 폰트 설정 (메뉴에서 설정, set_font_case() 루틴 참조)
// [203] 큰 시계 폰트 스타일
byte font_style = 2;
// [204] 큰 시계 폰트 오프셋 조정
byte font_offset = 1;
// [205] 큰 시계 폰트 열 조정
byte font_cols = 6;
// DST, NTP, UTC 설정
// [210] DST 기능 활성화
bool dst_mode = 1;
// [211] NTP 기능 활성화
bool ntp_mode = 1;
// NTP 값 적용 전 조정 초 (ESP01 데이터 처리 시간 고려)
byte ntp_adjust = 1;
// [213] UTC 오프셋 조정 (시간)
int8_t utc_offset = 0;
// 매일 NTP/DST 동기화 시간 (DST 사용 시 2시 권장)
byte ntp_dst_hour = 2;
// NTP 요청 재시도 횟수 (1 = 약 35초, 1-9)
byte ntp_max_retry = 3;
// NTP 타임아웃 (초, ntp_max_retry와 곱해짐)
byte ntp_timeout = 45;
// WiFi 설정 (ESP01로 SoftwareSerial로 전달)
// SSID + 비밀번호 총 길이 72자 초과 불가
const byte ssid_len = 8;
const char ssid[] = "YourSSID";
const byte pass_len = 12;
const char pass[] = "YourPassword";