제 DS3231 RTC가 시간이 틀어지는 현상이 있었습니다. 평소처럼 컴파일 시 시스템 시간으로 업데이트하려 했지만, 컴퓨터의 다른 프로세스 때문에 컴파일/업로드가 중단되어 부정확했습니다.
GPS가 정확한 UTC 시간과 날짜를 제공한다는 것을 알고 이를 이용해 DS3231을 설정하기로 했습니다.
회로 연결
LCD 백팩 → 아두이노
GND - GND
VCC - 5V
SDA - SDA (A4)
SCL - SCL (A5)
DS3231 클록 모듈 → 아두이노
GND - GND
VCC - 5V
SDA - SDA (A4)
SCL - SCL (A5)
레벨 시프터 → 아두이노
5V - 5V
GND - GND
D3 - BUS
D4 - BUS
NEO 6M GPS → 레벨 시프터
3V - VCC
GND - GND
BUS - TXD (아두이노 D3로 연결)
BUS - RXD (아두이노 D4로 연결)
스위치 접점
스위치 - D9
스위치 - GND
전원
USB 케이블로 회로에 전원을 공급합니다.
소프트웨어
소프트웨어의 99%는 Adafruit GPS 라이브러리의 parsing.ino 예제입니다. 여기에 GPS에서 추출한 날짜/시간을 DS3231에 전달하는 코드와 DS3231의 시간을 LCD에 표시하는 코드를 약간 추가했습니다.
사용 라이브러리
Adafruit GPS Library v1.0.3
RTCLib (Adafruit) v1.2.0
NewLiquidCrystal (I2C 디스플레이 백팩용)
작동 방법
장치 전원 켜기
LCD에 DS3231 레지스터에 저장된 현재 날짜/시간 표시
GPS가 락(Lock)될 때까지 대기 (실내에서는 10분 이상 걸릴 수 있음)
버튼을 눌러 GPS 신호로 시간 설정
LCD에 새로운 시간 표시
작동 시 주의사항
GPS 락 달성 여부를 알리는 표시가 없습니다. 락 없이 설정 버튼을 누르면 DS3231 날짜가 2000:0:0, 시간이 0:0:0으로 설정될 수 있습니다.
GPS 모듈의 빨간 LED가 깜빡이기 시작하면 설정 버튼을 누르기 좋은 시점입니다.
처음 사용한 DS3231의 배터리가 방전되어 있었는지, 설정 시 날짜 2000:0:0, 시간 0:164:164로 설정되었습니다. 배터리가 충분히 충전되어 GPS 데이터를 받아들이고 스스로 정확히 작동하기까지 꽤 시간이 걸렸습니다.
GPS 모듈 특이사항
구입한 보드는 단순히 "NEO 6M GPS"라고만 표기되어 있었고 핀 기능만 표시되어 있었습니다. 데이터시트를 보니 장치는 약 3V에서 동작한다고 하여 레벨 시프터를 사용했습니다. 그러나 자세히 보니 보드에 4A2D 칩이 납땜되어 있었는데, 인터넷 검색 결과 전압 레귤레이터로 보이나 통신 라인까지 레벨 시프팅되는지는 보장할 수 없습니다(회로도 미제공).
또한 GPS 모듈마다 실내 수신 능력이 다르다는 글을 보고 LCD를 추가해 야외에서도 테스트할 수 있게 했습니다.
LCD 특이사항
사용한 I2C LCD의 주소가 0x3F입니다(대부분은 0x27). 화면에 아무것도 안 나오면 주소를 먼저 바꿔보세요.
라이브러리 특이사항
RTCLib(Adafruit v1.2.0)은 DS3231의 요일(Day) 레지스터를 설정하지 않고 날짜/시간 레지스터만 설정합니다. 요일은 날짜 레지스터 값을 이용해 공식으로 실시간 계산합니다. 처음에는 이상하게 여겼지만, 윤년 처리를 코드에서 따로 하지 않아도 되므로 합리적입니다.
UTC와 로컬 타임
UTC 검색 결과 제 로컬 타임은 변경이 필요 없었습니다. 필요하면 직접 코드를 추가하세요.