초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

I2C LCD 모듈

2016-11-10 16:51:54

개요

 

안녕하세요! 코코아팹입니다. 

LCD는 화면에 문자를 출력해주는 용도적 특징 때문에 다양한 프로젝트에 사용되는 부품이라고 할 수 있습니다. 

이번 튜토리얼에서는 LCD의 개념에 대해 알아보고, I2C 제어가 가능한 16*2 I2C Character LCD 모듈(I2C Converter) 사용법에 대해 알아보도록 하겠습니다.

 

<LCD를 활용한 프로젝트 : LCD를 활용해 알람 시계 만들기

 

 

 

 

 

LCD란? 

 

LCD란 Liquid Crystal Display의 약자로 액정 표시 장치를 말합니다. 액정(Liquid Crystal)이란 액체처럼 유체의 성질을 가지며, 고체처럼 광학 성질을 가지는 물질을 말합니다. 

또한 액정은 전기적 신호를 가해 원하는 방향으로 배열하여 빛을 투과시키거나 차단 시킬 수 있습니다. 

 

< 사진 출처 : 삼성 디스플레이 블로그

 

 

 

 

I2C LCD 모듈이란?

 

 

아두이노 프로젝트 제작에 있어 가장 보편적으로 사용되는 LCD는 16*2 Character LCD로서

1줄에 16개의 문자씩 총 2줄에 문자를 표기할 수 있는 LCD 입니다. 

대부분의 16*2 LCD는 5V 전원을 통해 Backlight를 동작 시킬 수 있으며, 가변 저항을 통해 문자의 명암(선명도)를 조절할 수 있습니다. 

 

코코아팹 튜토리얼을 통해 16*2 LCD 사용법을 알아보실 수 있습니다. 

 

- LCD에 문자 출력하기

 

< 16*2 Character LCD / 사진 출처 : oddwires

 

 

위 그림과 같이 16*2 Character LCD를 사용하기 위해서는 총 12개의 배선이 필요하며, 문자의 선명도 제어를 위해 가변 저항을 추가적으로 연결해주어야 하기 때문에 수고스러운 점이 있는 것은 사실입니다.

또한 아두이노와 연결하여 제어할 경우 총 6개의 digital Pin을 사용해야합니다. 몇 몇 안되는 센서 및 기타 부품과 함께 사용할 경우에는 큰 문제가 되지 않지만, 다양한 센서와 기타 부품을 사용할 경우에는 digital port 사용에 한계가 있습니다.

이런 사항들을 개선하고자 개발된 모듈이 바로 I2C LCD 모듈입니다. 

 

 

<I2C LCD 모듈 / 사진 출처 : addicore

 

 

 

I2C LCD 모듈(I2C Converter)의 경우 기존의 16*2 Character LCD에 결합하여 사용할 수 있는 breakout board 형태의 모듈입니다. 

모듈 단일 제품으로 판매하는 경우는 거의 없으며, LCD와 납땜되어 판매되는 경우가 대부분입니다. 

 

I2C LCD 모듈(I2C Converter)를 사용하면 I2C interface를 사용해 LCD 제어가 가능해지며, 총 4개의 배선으로 아두이노에 연결이 가능합니다. 

I2C interface를 사용하기 때문에 아두이노에 연결하여 제어할 경우 두 개의 AnalogPin(SDA, SCL)으로 제어가 가능합니다. 

 

 

 

제조사에 따라 제품 사양에 차이점이 있을 수 있으나 보편적으로 I2C LCD 모듈(I2C Converter)의 사양은 아래와 같습니다. 

 

- 1줄 16개 문자, 2줄 제어 가능.

- 동작 전압 : 5V

- i2C 주소(Address) : 0x20, 0x27

- 문자 선명도 : 가변 저항을 통해 문자의 선명도 조절 가능

- backlight :  점퍼 스위치를 통해 backlight On / Off 

 

 

 

 

 

 

부품 목록 

 

실습을 위해서는 아래 부품이 필요합니다. 

 

NO 부품명 수량 상세설명
1 오렌지보드 1 Arduino UNO
2 16*2 I2C Character LCD 1  
3 점퍼케이블 4 Female to Male

 

부품명 오렌지보드

16*2 I2C Character LCD

점퍼케이블

부품

사진

      

 

 

 

 

 

 

하드웨어 making

 

오렌지보드와 I2C 모듈의 연결 방법은 아래 표를 참고하세요.

 

I2C 모듈(I2C Converter) 오렌지보드
GND GND
VCC 5V
SDA (Serial Data Line) A4 / SDA
SCL (Serial Clock) A5/ SCL

 

 

브레드보드

 

 

전자 회로도(스키메틱)

 

 

 

 

 

 

소프트웨어 coding

 

I2C LCD 모듈(I2C Converter)을 제어하기 위해서는 라이브러리 추가해야합니다. 

아래 링크를 통해 라이브러리를 다운로드 받을 수 있습니다. 

 

I2C LCD 모듈(I2C Converter) 라이브러리 다운로드

 

 

라이브러리 추가 방법은 코코아팹에 있는 튜토리얼을 참고하세요. 

 

- 라이브러리 사용하기 (1)

- 라이브러리 사용하기 (2)

 

 

 

함수 설명

 

I2C LCD 모듈(I2C Converter)을 제어에 사용되는 함수 목록입니다. 

 

* 선언된 객체 이름이 lcd일 경우를 가정한 내용입니다.

 

lcd.begin(); LCD를 사용을 시작
lcd.display(); LCD에 내용을 표시
lcd.noDisplay(); LCD에 내용을 숨김
lcd.setCursor(col,row); row, col의 좌표로 커서를 위치
lcd.cursor(); LCD에 커서를 표시
lcd.noCursor(); LCD에 커서를 숨김
lcd.home(); 커서의 위치를 0,0으로 이동
lcd.blink(); 커서를 깜빡임
lcd.noBlink(); 커서를 깜빡이지 않음
lcd.backlight(); LCD backlight을 킴
lcd.noBacklight(); LCD backlight를 끔
lcd.write(val); LCD 화면에 val 출력(아스키 코드 입력 시에는 아스키 코드에 해당하는 문자 출력)
lcd.print(val); LCD 화면에 val 출력
lcd.clear(); LCD 화면의 모든 내용 지움
lcd.scrollDisplayRight(); 내용을 우측으로 1칸 이동
lcd.scrollDisplayLeft(); 내용을 좌측으로 1칸 이동
lcd.autoscroll(); 내용을 자동으로 우에서 좌로 스크롤

 

 

*Cursor 제어 함수와 관련하여 Cursor의 row와 col(줄과 행) 좌표에 대해 직관적으로 이해가 가지 않으시는 분은 아래 그림을 참고하시면 이해하기가 수월합니다!

 

< 16*2 LCD col & row 좌표 / 사진 출처 : Programming Electronics Academy >

 

 

 

LCD 제어에 필요한 함수를 알아보았으니 이제 직접 LCD에 문자를 출력해봐야겠죠?

LCD에 "Hello World"를 출력해봅시다. 

 

아두이노 IDE의 [파일] - [예제] - [Arduino-LiquidCrystal-I2C-Library] - [HelloWorld]를 실행하시거나 

아래 코드를 실행하시면 됩니다. 

 

/*
제목 : I2C LCD 제어하기
내용 : I2C LCD Converter를 사용해 16*2 Character 제어해보기

이 소스코드는 kocoafab에서 작성하였습니다. 
소스코드 배포시에는 출처를 남겨주시기 바랍니다. 

E mail : contact@kocoa.or.kr
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);  // I2C LCD 객체 선언

void setup()
{
  // initialize the LCD
  lcd.begin(); // lcd를 사용을 시작합니다.
  lcd.backlight(); // backlight를 On 시킵니다.
  lcd.print("Hello, world!"); // 화면에 Hello, world!를 출력합니다.
}

void loop(){
}

 

 

 

 

이상 없이 소스가 업로드 되었다면 아래 사진과 같이 LCD 화면에 Hello, world!가 출력되는 것을 확인할 수 있습니다. 

* 정상적으로 화면에 출력이 되지 않는다면, LCD와 오렌지보드 간의 연결을 다시 한 번 검토해주세요! 

 

 

 

 

 

LCD와 오렌지보드와의 연결과 LCD 동작에 이상이 없는 것을 확인하였으니 시리얼 모니터를 통해 입력 받은 값을 바탕으로 LCD 함수들을 사용해 LCD를 제어해봅시다!

아래 소스 코드를 오렌지보드에 업로드시켜주세요!

 

시리얼 모니터로 입력받은 데이터에 따라 동작하는 내용은 아래와 같습니다. 

 

 

- 1을 입력 받았을 때 : backlight가 1초가 소등되었다가 점등됩니다. 

- 2를 입력 받았을 때 : LCD에 표시된 글자가 1초간 사라졌다가 나타납니다. 

- 3을 입력 받았을 때 : Cursor가 1초간 깜빡이다가 사라집니다. 

- 4를 입력 받았을 때 : 커서가 1초간 화면에 나타났다가 사라집니다. 

- 5를 입력 받았을 때 : 화면에 표시된 내용이 1초간 우측으로 1칸 이동 후 원래 자리로 돌아옵니다. 

- 6을 입력 받았을 때 : 커서가 화면에 표시된 후 커서 위치가 col 0부터 16까지 이동 후에 사라집니다. 

 

/*
제목 : I2C LCD 제어하기
내용 : 시리얼 모니터를 통해 입력 받은 데이터로 LCD를 제어해보기

이 소스코드는 kocoafab에서 작성하였습니다. 
소스코드 배포시에는 출처를 남겨주시기 바랍니다. 

E mail : contact@kocoa.or.kr
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // I2C LCD 객체 선언

void setup()
{
  lcd.begin(); // lcd를 사용을 시작합니다.
  Serial.begin(9600);
  lcd.print("kocoafab.cc"); // lcd 화면에 kocoafab.cc 출력
  lcd.home(); // cursor의 위치를 0,0으로 이동
}

void loop() {


  if (Serial.available()) {  //시리얼 모니터를 통해 들어오는 데이터가 있다면
    char data = Serial.read(); // 데이터를 data 변수에 저장

// baklight 테스트
    if (data == '1') { 
      lcd.noBacklight();
      delay(1000);
      lcd.backlight();
    }

// Display 테스트 (글자 표시)
    if (data == '2') {
      lcd.noDisplay();
      delay(1000);
      lcd.display();
    }

// Cursor Blink 테스트 
    if (data == '3') {
      lcd.blink();
      delay(1000);
      lcd.noBlink();
    }

// Cursor 표시 테스트
    if (data == '4') {
      lcd.cursor();
      delay(1000);
      lcd.noCursor();
    }

// Scroll 테스트
    if (data  == '5') {
      lcd.scrollDisplayRight();
      delay(1000);
      lcd.scrollDisplayLeft();
    }

// Cursor 위치 변경 테스트
    if (data  == '6') {
      lcd.home();
      lcd.cursor();
      for (int i = 0; i < 16; i++) {
        lcd.setCursor(i, 0);
        delay(100);
      }
      lcd.noCursor();
      lcd.home();
    }
  }
}

 

 

 

 

많은 부품을 연결해야 하는 프로젝트 제작하고 있다면 I2C LCD를 사용해보는 것도 좋은 방법이겠죠?

이상으로 I2C LCD 사용 실습을 마쳐보았습니다! 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

I2C LCD, 아두이노, 오렌지보드

박동근 2016-11-11 14:04:28

화면 윗줄만 계속 하얀네모박스로 16개 채워져있어요..
아두이노 버젼도 낮춰보고 주소값도 변경해보고 포트도 확인하고 조도변경도해봣는데 어떡하죠?

kocoafabeditor 2016-11-17 10:01:22

안녕하세요! 박동근님.

해당 상태에서 RESET을 눌러주시면 정상적으로 출력되는 것을 확인할 수 있습니다.

최윤범 2016-11-18 17:02:32

저는 오렌지 나노를 사용하는데요, 박동근님과 마찬가지로 화면 윗줄만 하얀네모박스로 채워져 있습니다. 나노보드 위의 리셋버튼을 아무리 눌러도 변함이 없습니다. 해결방법 없을까요?

이형호 2017-02-10 11:58:33

좋네요~ 자료를 좀 봐야할것 같습니다.

봉의종 2017-03-06 11:22:06

위에 하얀네모박스만 나오시는 분들 I2C 주소가 0x27이 아닐 수 있어요~ 저 같은 경우는 0x3F로 고치니 잘 나오네요^^
https://forum.arduino.cc/index.php?topic=128635.0
여기 참조하세요~!

셜록홈즈 2017-06-16 09:47:52

브레드보드 레이아웃에서 LCD에 연결하는 I2C Converter의 소자이름을 머라고 검색하면나오나요..?
동일하게 fritzing을 그려가서면 공부하고 있는데... 아무리 검색해도 소자가 안나오네요..

하늘 2018-03-05 20:08:17

힘내세요!

BLUUU 2018-11-03 23:23:39

잘읽었습니다..

kocoafab 2019-01-08 17:28:00

@최윤범
혹시 LCD 에 아무런 변화가 없으시면 코드 15번째 줄에 있는 0x27을 0x3F 로 바꾸셔서 다시 해보시길 바랍니다.

@설록홈즈
프리징에 사용한 I2C_LCD 부품은 구글에서 I2C_LCD.fzpz 로 검색해서 나온것을 이용하였습니다.

shinplest 2019-11-08 17:16:25

안녕하세요! 글 잘 읽고 모듈 잘 사용하고 있습니다만, 백라이트를 켜면 너무 밝아서 백라이트 밝기를 줄이고 싶습니다. 구글링을 해도 모듈에서 제어하는 방법은 잘 찾지를 못했는데, 이 라이브러리로는 백라이트 밝기 제어가 불가능한가요?

shinplest 2019-11-08 17:18:58

아 참고로 모듈뒤에 가변저항을 돌려도 백라이트 밝기가 조정되는것이 아닌 글씨 선명도가 조정되더군요..! 백라이트 밝기자체를 줄이고 싶습니다!

rlaqhqls 2021-03-20 08:53:59

저도 계속 하얀박스로 나와서 위에 말하신 걸로 다 해보았는데 아직도 하얀박스가 남아있는데요...