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)