LCD 1602A
디지털시계에서 시간이 나오는 것 까지는 작동시켜 보았는데, 컴퓨터 Serial Monitor에서 나오는 다양한 정보를 모두 보여주지는 못한다.
그래서 더 많은 정보를 보여주는 디스플레이를 사용하는 방법을 배워보자.
이번에 공부할 디스플레이는 LCD 기반의 모듈로 16 글자를 2줄로 보여주는 장치(1602A)이다.
물론 글자라고 하는 것은 영문 알파벳이나 숫자를 기반으로 한다. 한글 또는 도형을 그려서 보여줄 수 있는 디스플레이는 나중에 한글 글자꼴 출력에 대한 부분과 함께 설명하려고 한다.
1602A 디스플레이는 여러 개의 핀으로 연결을 하는 기본 형태와 4개의 핀만 연결해도 되는 I2C 인터페이스를 가지는 형태의 제품이 있다. 그러나 두 개는 동일한 기본 모듈에 I2C 인터페이스만을 장착한 형태의 동일한 모듈이다.
위의 사진 상단에 있는 제품은 I2C 인터페이스가 장착된 형태이고 아래의 두 가지 제품은 기본 형태의 제품을 보여준다. 필요에 따라서는 이렇게 I2C 인터페이스를 달지 않고, 브레드보드 상에 장착된 핀으로 서로 연결을 할 수도 있다.
아래의 사진은 그렇게 회로를 구성한 모습이다.
서로의 핀이 1:1로 매칭 되므로 같은 핀 위치에 이렇게 장착하면 서로 납땜을 한 것과 동일한 효과를 볼 수 있다.
이번 프로젝트에서는 좀 더 회로 구성이 평이한 I2C 버전으로 회로를 꾸며보려 한다.
아두이노 보드와 함께 사용하는 대부분의 LCD 패널은 히다찌의 HD44780 칩셋을 기반으로 만들어져 있고, 관련 라이브러리를 설치하여야 사용이 가능하다.
다른 라이브러리 설치처럼 Tool 밑의 라이브러리 관리에서 LiquidCrystal I2C를 검색하면 아래의 라이브러리가 보일 것이다. 이를 먼저 설치하고 회로를 꾸며 보자.
일단 간단히 회로를 구성해 보자면,
I2C 인터페이스에 있는 4개의 핀을
GND-GND
VCC-5V
SDA-A4
SCL-A5
에 연결한다.
그리고 아래와 같은 코드를 실행하면 LCD가 동작하게 된다.
만일 LCD가 위의 사진처럼 흐리게 보이거나 문자가 선명하지 않으면, 작은 스크루 드라이버로 인터페이스 사진의 파란색 가변저항을 돌려 화면이 보이도록 조정할 필요가 있다.
코드 내용을 살펴보면
Line 1~2는 라이브러리를 포함한 것
Line 7의 LiquidCrystal_I2C lcd(0x27,16,2);는 0x27번 주소에 LCD를 연결하였고, 한 줄의 문자는 16자, 2줄이 디스플레이됨을 알려주면 명령어이다.
코멘트에서 이야기한 것처럼 대부분의 LCD 디스플레이의 경우 주소가 0x27이나 0x3F인데, 내가 가지고 있는 디스플레이는 0x27이므로 위의 명령어가 잘 동작한다.
lcd.init(); // LCD의 사용 시작을 알림
lcd.backlight(); // LCD 뒤의 LED 불을 켜는 명령
lcd.setCursor(1,0); // 글자를 쓸 위치를 2번째 칸, 첫 번째 줄로 지정 (모든 가로 세로는 0부터 시작)
lcd.print("Hello, world!"); // 해당 글자 출력
lcd.setCursor(0,1); // 글자를 쓸 위치를 1번째 칸, 두 번째 줄로 지정
lcd.print("Have a nice day!"); // 해당 글자 출력
시작한 김에 이전에 만들었던 디지털시계에서 보여주는 모든 정보를 이 LCD 패널에 표시해 보자.
필요한 연결은 DS1302를 추가로 연결하기만 하면 된다. LED 전자시계가 연결되어 있어도 좋다.
RTC, 4 digit 7 Segment, 1602A LCD panel 이렇게 모든 것을 연결해서 동작을 확인해 보자.
"33. 디지털시계 만들기#2:RTC, LED 이용"에서 사용된 회로에 1602A만을 추가해서 다음의 코드를 추가해 보자.
LCD를 시작하는 기본 라이브러리와 함수를 부른 후에...
LCD에 표현되는 데이터의 자릿수를 맞추기 위하여 요일의 자수를 아래와 같이 3자리로 만들고,
String dayAsString(const Time::Day day) {
switch (day) {
case Time::kSunday: return "Sun";
case Time::kMonday: return "Mon";
case Time::kTuesday: return "Tue";
case Time::kWednesday: return "Wed";
case Time::kThursday: return "Thu";
case Time::kFriday: return "Fri";
case Time::kSaturday: return "Sat";
}
return "(unknown day)";
}
void printTime() 에 다음을 추가하고
char buf1[17], buf2[17];
snprintf(buf1, sizeof(buf1), "%04d-%02d-%02d %s",
t.yr, t.mon, t.date, day.c_str());
snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d",
t.hr, t.min, t.sec);
displayLCD(buf1, buf2);
다음 함수를 추가한다.
void displayLCD(char *buf1, char *buf2){
lcd.setCursor(0,0);
lcd.print(buf1);
lcd.setCursor(0,1);
lcd.print(buf2);
}
이런 코드를 추가하면 아래의 그림과 같이 4자리 디지털시계와 모든 정보를 보여주는 LCD의 모습을 아래의 사진처럼 구현할 수 있다.
LCD에는 날짜 요일 시간까지 모든 정보가 표시되고, LED 패널에는 현재의 시간과 분이 표시된다.
키보드에 있는 글자를 디스플레이하는 방법을 이렇게 간단하다.
그렇다면 이런 디스플레이에서 한글을 출력하는 것은 가능할까??
1602A와 같이 글자가 나타날 자리가 미리 세팅되어 있는 LCD는 한글 출력이 힘들다.
그러나 이를 가능하게 하는 꼼수를 보여주고, 차후에 더 나은 LCD 패널을 이용하여 한글에 대해 깊이 다루어 보도록 하겠다.