아두이노 - 탁상시계 #3
2023. 8. 20. 21:45ㆍ아두이노/탁상시계
이번 글에서는 I2C LCD와 DS1302 모듈을 활용한 탁상시계의 프로그램 코드를 작성합니다.
완성품 사진
Arduino Uno의 브레드보드 확장 쉴드를 사용하여 회로도와 동일하게 조립하였습니다.
사용 라이브러리
- LiquidCrystal_I2C.h
- RtcDS1302.h
- DHT11.h
라이브러리 설치
LiquidCrystal_I2C 라이브러리는 Arduino IDE의 라이브러리 매니저에서 바로 설치할 수 있습니다.
RtcDS1302 라이브러리는 위 링크를 통해 설치할 수 있습니다.
DHT11 라이브러리는 위 링크의 첨부파일을 통해 설치할 수 있습니다.
// 라이브러리 설치 방법 링크
탁상시계 프로그램 코드
Arduino IDE를 통해 프로그램 코드를 작성하고 업로드합니다.
#include <LiquidCrystal_I2C.h>
#include <RtcDS1302.h>
#include <DHT11.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
ThreeWire myWire(7, 6, 8);
RtcDS1302<ThreeWire> Rtc(myWire);
int dht_pin = A0;
DHT11 dht11(dht_pin);
void setup() {
Serial.begin(9600);
pinMode(5, INPUT);
lcd.init();
lcd.backlight();
lcd.clear();
// 시작 화면
lcd.setCursor(2, 0);
lcd.print("DS1302 START");
delay(2000);
lcd.clear();
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
print_date_time(compiled);
RtcDateTime now = Rtc.GetDateTime();
}
void loop() {
int p_btn = digitalRead(5);
if (p_btn == HIGH) {
RtcDateTime now = Rtc.GetDateTime();
print_date_time(now);
}
else {
lcd.clear();
print_temp_humi();
delay(2000);
lcd.clear();
}
delay(100);
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
void print_date_time(const RtcDateTime& dt)
{
char datestring[11];
char timestring[9];
// 날짜 부분
snprintf_P(datestring,
countof(datestring),
PSTR("%04u.%02u.%02u"),
dt.Year(),
dt.Month(),
dt.Day());
lcd.setCursor(0, 0);
lcd.print(datestring);
// 요일 부분
lcd.setCursor(11, 0);
lcd.write(B00101000);
lcd.setCursor(12, 0);
switch(dt.DayOfWeek()) {
case 0:
lcd.print("SUN");
break;
case 1:
lcd.print("MON");
break;
case 2:
lcd.print("TUE");
break;
case 3:
lcd.print("WED");
break;
case 4:
lcd.print("THU");
break;
case 5:
lcd.print("FRI");
break;
case 6:
lcd.print("SAT");
break;
default:
lcd.print("ERR");
break;
}
lcd.setCursor(15, 0);
lcd.write(B00101001);
// 시간 부분
snprintf_P(timestring,
countof(timestring),
PSTR("%02u:%02u:%02u"),
dt.Hour(),
dt.Minute(),
dt.Second());
lcd.setCursor(4, 1);
lcd.print(timestring);
}
// 온,습도 부분
void print_temp_humi() {
int i, i_humi, i_temp;
float f_humi, f_temp;
if((i = dht11.read(f_humi, f_temp)) == 0) {
i_humi = f_humi;
i_temp = f_temp;
lcd.setCursor(0, 0);
lcd.print("TEMP:");
lcd.setCursor(5, 0);
lcd.print(i_temp);
lcd.setCursor(7, 0);
lcd.write(B11011111);
lcd.setCursor(8, 0);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("HUMI:");
lcd.setCursor(5, 1);
lcd.print(i_humi);
lcd.setCursor(7, 1);
lcd.write(B00100101);
}
}
작동 사진
전원이 들어오면 2초간 해당 화면을 출력합니다.
2초가 지나면 시계 화면을 출력합니다.
Push Button을 누를 경우 해당 화면을 출력합니다.
임시 RTC 모듈 리셋 코드
시간 오차가 발생했을 때 사용할 임시 RTC 시간 초기화 프로그램 코드입니다. RTC 모듈 내의 시간이 해당 프로그램 코드를 업로드 했을때의 시간으로 초기화됩니다.
#include <RtcDS1302.h>
ThreeWire myWire(7, 6, 8);
RtcDS1302<ThreeWire> Rtc(myWire);
void setup() {
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
Rtc.SetDateTime(compiled);
RtcDateTime now = Rtc.GetDateTime();
}
void loop() {
}
개선 및 추가 예정 사항
- DS3231 RTC 모듈 구매 후 DS1302 모듈과 교체
- 버튼을 눌러 특정 모드로 이동할 수 있는 기능 추가
- 알람 기능 추가
- 조도에 따른 I2C LCD 밝기 조정 기능 추가
'아두이노 > 탁상시계' 카테고리의 다른 글
아두이노 - 탁상시계 #2 (0) | 2023.08.20 |
---|---|
아두이노 - 탁상시계 #1 (0) | 2023.08.20 |
아두이노 - 탁상시계 바로가기 (0) | 2023.08.20 |