발렌타인데이 선물: DIY 교제일수 카운터 만들기
부품 및 소모품
| DS3231 실시간 클록(RTC) 모듈 |
× |
1 |
| 아두이노 KYX-5461AS 4자리 7세그먼트 디스플레이 |
× |
1 |
| 브레드보드 (범용) |
× |
1 |
| 점퍼 와이어 (범용) |
× |
1 |
| 아두이노 우노 (Arduino UNO) |
× |
1 |
| 1kΩ 저항 |
× |
1 |
프로젝트 소개
2017년 9월, 대학 2학년이던 저는 한 여학생을 만나게 되었습니다. 그녀와 그녀의 친구들이 사는 숙소로 이사했는데, 마침 저희 둘만 한 층을 쓰게 되었죠. 자연스럽게 가까워져 절친이 되었고, 몇 달 뒤 연인이 되었습니다. 우리가 사귀기 시작한 날은 2017년 12월 10일(영국 날짜 표기)이었습니다.
약 1년이 지나고 기념일을 앞두고 무엇을 할까 고민하다가, 전자공학을 전공하는 제 특기를 살려 선물을 만들기로 했습니다. 교제한 일수를 세서 사진 액자에 넣고, 우리 사진을 함께 두면 의미 있겠다고 생각했습니다.
이 글을 보시는 분이 기념일 선물 아이디어를 찾고 계시든, 단순히 흥미로운 프로젝트를 찾고 계시든, 직접 만들어 볼 만한 재미있는 프로젝트입니다. 모든 제작 과정을 자세히 공유하겠습니다.
이 프로젝트에서 가장 어려운 부분은 코드입니다. 컴파일하고 업로드하면 제 기념일이 표시되는 샘플 템플릿을 만들었고, 여러분의 기념일로 쉽게 수정할 수 있도록 코드에 주석을 달아두었습니다.
즐겁게 만들어 보세요!
코드 (DaysCounter.ino)
아래 라이브러리들을 아두이노 IDE 라이브러리 폴더에 설치해야 합니다:
- RTClib 라이브러리 (ZIP)
- SevSeg 라이브러리 (ZIP)
아두이노 IDE에서 스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가로 설치하세요.
날짜 설정 방법: 코드 7번째 줄의 DateTime dtBegin (2017, 12, 9, 0, 0, 0); 부분에서 앞의 세 숫자(년, 월, 일)를 여러분이 사귄 날짜로 변경하세요. 예: 2014년 4월 6일이면 2014, 4, 6으로 수정.
#include <RTClib.h>
#include <SevSeg.h>
SevSeg sevseg;
RTC_DS3231 rtc;
DateTime dtBegin (2017, 12, 9, 0, 0, 0); // !!!! 여기 날짜 수정 !!!!
TimeSpan tsPassed;
void showInfo(const DateTime& dt) {
Serial.print("NOW:");
Serial.print(dt.year(), DEC); Serial.print('/');
Serial.print(dt.month(), DEC); Serial.print('/');
Serial.print(dt.day(), DEC); Serial.print(' ');
Serial.print(dt.hour(), DEC); Serial.print(':');
Serial.print(dt.minute(), DEC); Serial.print(':');
Serial.print(dt.second(), DEC); Serial.print("\tPASSED:");
Serial.print(tsPassed.days(), DEC); Serial.print(' ');
Serial.print(tsPassed.hours(), DEC); Serial.print(':');
Serial.print(tsPassed.minutes(), DEC); Serial.print(':');
Serial.print(tsPassed.seconds(), DEC); Serial.println();
}
void delayWithUpdate(uint32_t parDelay) {
uint32_t started = millis();
while (millis() < started + parDelay) {
sevseg.refreshDisplay();
}
}
void setup() {
Serial.begin(9600);
Serial.println(__TIME__);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
delay(1000);
// 시간 설정용 (최초 1회만 주석 해제 후 업로드, 다시 주석 처리 후 업로드)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
byte numDigits = 4;
byte digitPins[] = {7, 8, 9, 10};
byte segmentPins[] = {2, 3, 4, 5, 11, 12, 13, 6};
bool resistorsOnSegments = false;
byte hardwareConfig = COMMON_CATHODE;
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = true;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(100);
sevseg.setNumber(1234, 1);
delayWithUpdate(1000);
sevseg.setNumber(8888, 1);
delayWithUpdate(1000);
}
void loop() {
sevseg.refreshDisplay();
DateTime now = rtc.now();
tsPassed = now - dtBegin;
static uint32_t nextReportMillis = 0;
static uint16_t prevDaysPassed = 0;
if (tsPassed.days() != prevDaysPassed) {
prevDaysPassed = tsPassed.days();
sevseg.setNumber(prevDaysPassed, 0);
}
sevseg.refreshDisplay();
if (millis() > nextReportMillis) {
showInfo(now);
nextReportMillis = millis() + 5000;
}
}
회로도
Circuito.io 회로도 링크를 복사해 브라우저에 붙여넣으세요.
- "Add Components" 클릭
- 검색: RTC 추가
- 검색: 7 segment display 20mm (Generic 선택, SparkFun 아님)
- 다이어그램대로 점퍼 와이어 연결