NEW 트랙 오픈 중 · 초·중·고 맞춤형 코딩·메이킹 상시 상담, 성인 개인 맞춤형 생성형 AI 실무 아케데미, 대표자 및 실무자 AX 모델 컨설팅
← 목록으로 돌아가기
아두이노 메이킹

텍스트LCD에 가변저항 값, RTC 년월일시분 표시하기

작성자: 잡** 조회수: 1

2줄에 16글자가 들어가는 텍스트 LCD에 텍스트를 가변저항의 변하는 값을 표시합니다. 그리고 RTC(Real Time Clock) 모듈인 DS3231 칩을 사용하여 시간을 표시합니다. LCD나 RTC 모듈은 

I2C 방식으로 아두이노와 통신합니다. ​ 

 


 

아두이노에서 DS3231를 이용하기 위해서 라이브러리를 추가해야 합니다 . 라이브러리 매니저에서 RTClib 검색 후 설치 후에 다음 코드가 정상적으로 업로드 되는지 확인합니다.

#include <wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;  
void setup() {
}
void loop() {
}

 

DS3231는 건전지가 달려 있어서 시간을 계속 카운트 합니다. 처음에 시간을 설정하기 위해서 다음과 같은 코드를 아두이노에 업로드하고, 시리얼모니터를 이용하여 시간을 설정합니다.

#include <wire.h>
#include "RTClib.h" 
#define DS3231_I2C_ADDRESS 104
RTC_DS3231 rtc; 
byte seconds, minutes, hours, day, date, month, year;

// 10진수를 2진화 10진수인 BCD 로 변환 (Binary Coded Decimal)
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

//시리얼모니터 이용 시간설정
// T(설정명령) + 년(00~99) + 월(01~12) + 일(01~31) + 시(00~23) + 분(00~59)  
//                                                                        + 초(00~59) + 요일(1~7, 일1 월2 화3 수4 목5 금6 토7)
// 예: T2305191519006 (2023년 5월 19일 15시 19분 00초 금요일)
void set3231Date()
{
  year    = (byte) ((Serial.read() - '0') *10 +  (Serial.read() - '0'));
  month   = (byte) ((Serial.read() - '0') *10 +  (Serial.read() - '0'));
  date    = (byte) ((Serial.read() - '0') *10 +  (Serial.read() - '0'));
  hours   = (byte) ((Serial.read() - '0') *10 +  (Serial.read() - '0'));
  minutes = (byte) ((Serial.read() - '0') *10 +  (Serial.read() - '0'));
  seconds = (byte) ((Serial.read() - '0') * 10 + (Serial.read() - '0'));
  day     = (byte) ((Serial.read() - '0'));
 
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(seconds));
  Wire.write(decToBcd(minutes));
  Wire.write(decToBcd(hours));
  Wire.write(decToBcd(day));
  Wire.write(decToBcd(date));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}
void setup() {
  Serial.begin(9600);
  rtc.begin();
}

void loop() {

  if (Serial.available())  // Look for char in serial queue and process if found
  {      
    if (Serial.read() == 84) 
    {   
      //If command = "T" Set Date
      set3231Date();
      Serial.println(" ");
    }
  }
  
  DateTime now = rtc.now();
  Serial.print(now.year());
  Serial.print("/");
  Serial.print(now.month());
  Serial.print("/");
  Serial.print(now.day());
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute());
  Serial.println();
  delay(300);
}

 

시간 설정이 되었다면 다음 코드를 이용하여 텍스트 LCD에 시간과 가변저항의 값을 출력해 봅니다.

#include <wire.h>
#include "RTClib.h" 
#include <liquidcrystal_i2c.h>

LiquidCrystal_I2C lcd(0x27,16,2); 
RTC_DS3231 rtc; 

void setup() {
  Serial.begin(9600);
  lcd.init(); 
  lcd.backlight();
  rtc.begin();
}
void loop() {
  DateTime now = rtc.now();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(now.year());
  lcd.print("/");
  lcd.print(now.month());
  lcd.print("/");
  lcd.print(now.day());
  
  lcd.setCursor(0,1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute());

  int r = analogRead(0);
  lcd.setCursor(10,1);
  lcd.print(r);
  delay(300);
}

 

📎 첨부파일 (0개)

클릭 시 원본 파일명으로 즉시 다운로드됩니다.

등록된 첨부파일이 없습니다.

💬 응원 댓글 (0)

함께 보면 좋은 다른 작품·게시물