아두이노 - 탁상시계 #3

2023. 8. 20. 21:45아두이노/탁상시계

이번 글에서는 I2C LCD와 DS1302 모듈을 활용한 탁상시계의 프로그램 코드를 작성합니다.


완성품 사진

Arduino Uno의 브레드보드 확장 쉴드를 사용하여 회로도와 동일하게 조립하였습니다.


사용 라이브러리

  • LiquidCrystal_I2C.h
  • RtcDS1302.h
  • DHT11.h

라이브러리 설치

LiquidCrystal_I2C 라이브러리는 Arduino IDE의 라이브러리 매니저에서 바로 설치할 수 있습니다.

 

GitHub - Makuna/Rtc: Arduino Library for RTCs, Ds1302, Ds1307, Ds3231, Ds3232, Ds3234 and Pcf8563/BM8563 with deep support. Plea

Arduino Library for RTCs, Ds1302, Ds1307, Ds3231, Ds3232, Ds3234 and Pcf8563/BM8563 with deep support. Please refer to the Wiki for more details. Please use the Github Discussions to ask questions...

github.com

RtcDS1302 라이브러리는 위 링크를 통해 설치할 수 있습니다.

 

[아두이노 강좌] 온습도 센서(DHT11)

안녕하세요 에듀이노입니다. 오늘은 기본적인 센서이면서 IOT(사물인터넷) 또는 스마트홈에 유용한 센서...

blog.naver.com

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