Arduino Uno I2C 16x2 CLCD 기본 사용법
I2C 캐릭터 LCD 를 소개하고, I2C CLCD용 라이브러리의 기본 사용법에 대해 설명
합니다.Character LCD (캐릭터 LCD)
Character LCD 는 아래 왼쪽그림과 같이 텍스트를 출력 전용 LCD 입니다. CLCD는 8x2, 12x2, 16x1 20x2, 20x4, 24x2 등의 사이즈, 글자색, 배경색에 따라 다양한 종류가 있습니다. 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"): 텍스트 쓰기
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 장치와 연결하기 위해 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(0, 1); // 초단위 시간을 출력 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(0, 0); //0부터 for (int thisChar = 0; thisChar < 13; thisChar++) { lcd.print(thisChar); delay(300); } //커서를 16,1로 이동 lcd.setCursor(16, 1); //오토스크롤 켜기 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 통신 사용법을 익힌다는 개념으로 가볍게 봐주세요.
끝까지 봐주셔서 감사합니다.^^
'Embedded > Arduino' 카테고리의 다른 글
아두이노 코딩 : 타이머 인터럽트로 7-세그먼트 카운트 (5611AH) (0) | 2020.08.05 |
---|---|
아두이노 코딩 : I2C Character LCD 한 줄 고정, 한 줄 스크롤 하기 JHD-162A (0) | 2020.08.05 |
아두이노 강좌 #17 I2C 통신으로 아두이노 우노와 ESP32 통신 하기 (0) | 2020.07.29 |
아두이노 강좌 #16 I2C 통신 소개와 구현 방법 (2) | 2020.07.28 |
아두이노 코딩 : 조도센서(CDS,포토레지스터)로 LED Dimming 하기 (0) | 2020.07.26 |