아두이노 강좌 #18 I2C Character LCD 기본 함수 사용 방법 (JHD 162A LiquidCrystal_I2C)
Lucy Archive
Lucy 2023
2020. 7. 30. 02:40

아두이노 I2C CLCD 기초아두이노 I2C CLCD 기초

Arduino Uno I2C 16x2 CLCD 기본 사용법

Character LCD(CLCD) 는 아두이노 텍스트 출력 장치로 사용 할 수 있는 표시 모듈 중 하나 입니다. 아두이노에서 CLCD를 사용하려면 최소 6개 이상의 포트을 사용해야 해서 핀의 소모가 큽니다. 하지만, I2C I/O 확장 모듈이 함께 내장된 캐릭터 LCD는 단 2개의 포트만 사용하여 쉬운 연결 구성이 가능합니다. 본 포스트에서는

I2C 캐릭터 LCD 를 소개하고, I2C CLCD용 라이브러리의 기본 사용법에 대해 설명

합니다.

Character LCD (캐릭터 LCD)

Character LCD 는 아래 왼쪽그림과 같이 텍스트를 출력 전용 LCD 입니다. CLCD는 8x2, 12x2, 16x1 20x2, 20x4, 24x2 등의 사이즈, 글자색, 배경색에 따라 다양한 종류가 있습니다. LCD를 제어하기 위해 우측 블록다이어그램과 같이 많은 핀들이 필요로 합니다.

아두이노 LCD(좌) Character LCD 사진, (우) CLCD 블록다이어그램

I2C Character LCD

I2C Character LCD 는 기존 Charcter LCD 에 I2C 확장 모듈이 결합된 모듈로 Arduino 의 2포트만 사용하여 LCD 에 텍스트 출력이 가능합니다. I2C 캐릭터 LCD 를 사용하기 위해 아두이노 라이브러리 매니저에서는 LiquidCrystal_I2C 라이브러리를 제공합니다. 이 라이브러리를 사용하면 I2C 통신 코드 없이, 라이브러리에서 정의된 LiquidCrystal 클래스를 사용하여 쉽게 LCD 동작 구현이 가능합니다.

LiquidCrystal_I2C 라이브러리 설치 방법

Arduino IDE 의 메뉴 > 툴 > 라이브러리 관리를 선택 후 라이브러리 매니저에서 LiquidCrystal_I2C 를 검색 후 라이브러리를 설치합니다. 라이브러리 설치 이후에는 아두이노 코드 선언부에 #include <LiquidCrytal_I2C.h> 코드를 작성해야 해당 라이브러리의 기능을 사용할 수 있습니다.

라이브러리 주요 지원 함수

LiquidCrystal_I2C 라이브러리에는 많은 기능의 함수를 제공하고 있습니다. 본 포스트에서는 필수적으로 필요한 함수만 다루었습니다. 제가 생각하는 기본적이고 주요한 함수의 리스트는 아래와 같습니다. 아래 2번째줄 이하의 함수들은 모두 LiquidCrystal_I2C 로 생성된 객체의 메서드 함수입니다.

  • LiquidCrystal_I2C : 클래스 객체 생성
  • name.begin() : 설정 초기화
  • clear() : 화면 초기화
  • backlight() : 백라이트 켜기
  • nobacklight() : 백라이트 끄기
  • cursor() : 커서 밑줄 깜빡임 켜기
  • noCursor() : 커서 밑줄 깜빡임 끄기
  • blink() : 커서 위치 깜빡임 켜기
  • noBlink() : 커서 위치 깜빡임 끄기
  • autoscroll() : 오토스크롤 켜기
  • noAutoscroll() : 오토스크롤 끄기
  • setCursor(column, row) : 커서 위치 이동
  • print("String") : 텍스트 쓰기
LiquidCrystal_I2C 클래스 객체 생성 구문은 아래와 같습니다.

Syntax

  • LiquidCrystal_I2C lcd(Addr, Columns, Rows)

Parameters

  • lcd : 객체명
  • Addr : I2C 장치의 주소를 입력
  • Columns : LCD 열의 길이
  • Rows : LCD 행의 길이

Returns : 반환 값 없음

Example

  • LiquidCrystal_I2C myLCD(0x27, 16, 2) : 0x27 주소의 케릭터 16x2 LCD 객체 myLCD 를 생성


Hardware

준비물

아래에 소개 할 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • I2C CLCD x 1EA (본 예제에서는 16x2 CLCD 사용, 다른 사이즈 사용도 무관 합니다.)
  • Jumper Wires

회로도 및 연결

아두이노 I2C 캐릭터 LCD(좌) 회로도, (우) 연결 예시

I2C 장치와 연결하기 위해 18, 19번 포트를 I2C 통신 포트로 사용하였습니다. I2C 통신은 Pull-up 저항으로 버스에 전압을 인가해 주어야 합니다. 해당 모듈에 있는 I2C I/O 확장 모듈의 내부 회로도를 찾지 못해 200% 확신은 못하지만, 동작 상태나 전HIGH 전압이 정상적으로 유지되는 것으로 보아 I2C I/O 확장 모듈에 풀업 저항이 있는 것으로 예상됩니다.

I2C I/O 확장 모듈

I2C 캐릭터 LCD 의 후면 부에는 아래 그림과 같이 검은색 I2C 모듈이 LCD 모듈과 연결 되어 있습니다. 이 모듈에는 아래와 가팅 사용자가 조절 할 수 있는 부분들이 있습니다.

  • 가변저항 : LCD 백라이트의 밝기를 조정
  • A0, A1, A2 저항 : I2C Device의 주소를 지정


예제1 : I2C Address Scan

I2C 디바이스와 통신하기 위해 I2C 장치에 연결된 주소가 필요합니다. 이 모듈을 구매시 일반적으로 A0, A1, A2 가 Open 상태로 되어 있어 주소가 0x27 로 설정되어 있지만, 제조사에 따라 다른 주소를 사용하거나, 초기 상태가 다를 수 있어 확인 이 필요합니다.

코드

Arduino Uno 보드가 켜지면 I2C 장치 Scan 을 1회 실행 후 무한대기 상태(while(1);)로 진입합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <Wire.h>
 
void setup() {
    Wire.begin();
    Serial.begin(115200);
    while(!Serial){
    ;
    }
    delay(3000);
    Serial.println("Program start...");  
    delay(3000);
}
 
void loop() {
    int statusTransmission;
    int flag = 1
    Serial.println("I2C Device Scanning....");
    
    delay(100);
    for(int i=0 ; i<127 ; i++)
    {
        Wire.beginTransmission(i);
        /* Slave 로 부터 정상적으로 ACK 가 도착하면 Wire.endTransmission() 이 '0'를 반환*/
        statusTransmission = Wire.endTransmission();
        if(statusTransmission == 0)
        {
            Serial.print("Connected I2C Device Address : 0x");
            if(i < 16)
                Serial.print("0");
            Serial.println(i,HEX);
            flag = 0;
        }
    }
    if(flag == 1){
        Serial.println("No I2C devices found");
    }
    Serial.println("Program End...");
    while(1);
}
cs

I2C 주소 스캔 코드에 대해서는 이전 포스트에 소개 되어있으니 필요하시면 참고해주세요. 링크는 포스트 하단에 있습니다.

실행 결과

예제2 : 커서 깜빡임 켜기/끄기

코드

1초 간격으로 커서 깜빡임을 켜고 끄는 예제입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <LiquidCrystal_I2C.h>
 
const int lcdAddress = 0x27// 자신의 Device 의 주소를 입력
const int lcdColumns = 16// 가로 길이 (열)
const int lcdRows = 2// 세로 길이 (행)
 
LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows);
 
void setup()
{
  lcd.init();
  lcd.clear();
  lcd.backlight();
  lcd.print("Cursor On/OFF");
}
 
void loop() {
  // 커서 밑줄 끄기
  lcd.noCursor();
  delay(1000);
  // 커서 밑줄 켜기
  lcd.cursor();
  delay(1000);
}
cs

실행 결과


예제3 : 커서 지정 및 문자 출력

코드

커서를 하단 왼쪽으로 고정하여 숫자 카운트 출력하는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <LiquidCrystal_I2C.h>
 
const int lcdAddress = 0x27// 자신의 Device 의 주소를 입력
const int lcdColumns = 16// 가로 길이 (열)
const int lcdRows = 2// 세로 길이 (행)
 
LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows);
 
void setup()
{
  lcd.init();
  lcd.clear();
  lcd.backlight();
  lcd.print("Yongmini-Arduino");
}
 
void loop() {
  // 커서 위치를 1행의 첫번째 칸으로 이동
  lcd.setCursor(01);
  // 초단위 시간을 출력
  lcd.print(millis() / 1000);
}
cs

실행 결과

예제4 : 오토스크롤

코드

오토스크롤을 켜고 끄는 예제입니다. 오토스크롤을 On/Off 에 따라 오토스크롤에 대한 동작 이외에 setCursor() 함수의 동작이 어떻게 봐뀌는지 이해가 필요합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <LiquidCrystal_I2C.h>
 
const int lcdAddress = 0x27// 자신의 Device 의 주소를 입력
const int lcdColumns = 16// 가로 길이 (열)
const int lcdRows = 2// 세로 길이 (행)
 
LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows);
 
void setup()
{
  lcd.init();
  lcd.clear();
  lcd.backlight();
}
 
void loop() {
    //커서를 0,0로 이동
    lcd.setCursor(00);
    //0부터 
    for (int thisChar = 0; thisChar < 13; thisChar++) {
        lcd.print(thisChar);
        delay(300);
    }
    //커서를 16,1로 이동
    lcd.setCursor(161);
    //오토스크롤 켜기
    lcd.autoscroll();
    for (int thisChar = 0; thisChar < 13; thisChar++) {
        lcd.print(thisChar);
        delay(300);
    }
    lcd.noAutoscroll();
    lcd.clear();
}
cs

실행 결과


마무리

이번 포스트에서 LiquidCrystal_I2C 라이브러리의 기본적인 함수에 대해 소개하였습니다. 이후 포스트는 LiquidCrystal_I2C 라이브러리 없이 I2C CLCD 를 구현하는 방법에 대해 소개할 예정입니다. I2C 통신 사용법을 익힌다는 개념으로 가볍게 봐주세요.

끝까지 봐주셔서 감사합니다.^^

관련포스트

👉 아두이노 CLCD 관련글 목록 보기

👉 아두이노 I2C 통신 관련글 목록 보기

👉 아두이노 디스플레이 장치 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기