초급 예제

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

I2C LCD로 문자 출력하기

2017-11-01 10:45:08

 

[이전 학습가이드] 온습도 센서(모듈)로 온/습도 확인하기

개요

 

1) LCD란 무엇인가?


LCD는 Liquid Crystal Display의 약자로 액정표시장치를 말합니다. 여기에서 액정 (Liquid Crystal)이란 액체처럼 유체의 성질을 가지면서 고체처럼 광학적 성질을 가지는 물질입니다. 또한 액정은 고체표면에 액정이 특정 방향으로 정렬할 수도 있어, 전기적 신호를 가해 원하는 방향으로 배열하여 빛을 투과시키거나 차단시킬 수 있습니다.
 

LCD는 이러한 액정의 성질을 이용합니다. 빛을 내는 백라이트, 백라이트에서 나온 빛을 한 방향으로  투과시키기 위한 편광판, 각 픽셀에 대한 액정 배열을 조절하여 투과하는 빛의 양을 제어하는 TFT, 그 다음으로 액정이 순서대로 위치하여 구성이됩니다. 또한 컬러 지원여부에 따라 컬러 필터가 추가될 수 있습니다.




LCD는 얇고 가벼우며 소비전력이 적은 장점은 있지만, 시야각이 제한적이고 어두운 곳에서는 선명함이 떨어지는 단점이 있습니다. 현재 LCD는 손목시계부터 TV에 이르기까지 광범위하게 활용되고 있습니다.


2) LCD 사용방법

 

이 예제에서 16개의 문자를 2줄로, 총 32개 문자를 표현할 수 있는 LCD를 사용합니다.

LCD는 아래와 같은 핀 배치로 구성되어 있으며, DB0-DB7까지의 핀들을 통해서 문자를 표시 할 수 있습니다.

 

 

 

3) 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, 0x3F

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

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

- 크기 : 41.5mm * 19mm * 15.3mm(L * W * H)

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 I2C LCD 1 I2C 1602 Serial LCD Module
3 점퍼케이블 4 M/F(암수) 케이블

 

부품명 오렌지 보드 LCD 점퍼케이블
파트 관련 이미지

 

 

하드웨어 making

브레드 보드

1. I2C LCD의 GND핀을 오렌지보드의 GND핀에 연결합니다.

2. I2C LCD의 VCC핀을 오렌지보드의 5V핀에 연결합니다.

3. I2C LCD의 SDA핀을 오렌지보드의 아날로그 A4핀에 연결합니다.

4. I2C LCD의 SCL핀을 오렌지보드의 아날로그 A5핀에 연결합니다.

 

 

 

 

전자회로도

 

라이브러리 설치하기

1. '스케치 -> 라이브러리 포함하기 -> 라이브러리 관리' 를 실행합니다.

 

 

 

2. 'liquid crystal i2c' 로 검색 한 후 Frank de Brabander가 만든 LiquidCrystal I2C 라이브러리를 설치해 줍니다.

 

 

 

I2C LCD의 I2C 주소 확인하기

#include <Wire.h>

void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);           
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }

  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);
}

 

I2C_LCD를 오렌지보드에 연결한 후 코드를 업로드 하면, 시리얼 모니터에 밑의 사진과 같이 현재 연결된 I2C_LCD의 I2C 주소가 나옵니다.

(* 밑의 사진은 주소 0x3F 로 나옵니다.)

 

 

소프트웨어 coding

/*
 제목		: I2C LCD에 문자 출력하기
 내용		: I2C LCD에 원하는 문자를 표시해 봅니다.  
 */

// LCD를 쉽게 제어하기 위한 라이브러리를 추가합니다.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

// 0x3F I2C 주소를 가지고 있는 16x2 LCD객체를 생성합니다.(I2C 주소는 LCD에 맞게 수정해야 합니다.)
LiquidCrystal_I2C lcd(0x3F, 16, 2);

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
	// I2C LCD를 초기화 합니다..
	lcd.init();
	// I2C LCD의 백라이트를 켜줍니다.
	lcd.backlight();
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() { 
	// random 함수를 사용하여 0부터 2까지의 숫자중 랜덤하게 값을 받습니다.
	int value = random(0, 3);
	// 랜덤 값이 0이라면 아래의 조건을 실행합니다.
	if (value == 0) {
		// 0번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.setCursor(0,0);		    		// 0번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.print("  KocoaFab.cc  ");     	// 문구를 출력합니다.
	}
	// 랜덤 값이 1이라면 아래의 조건을 실행합니다.
	else if (value == 1) {
		lcd.setCursor(0,1);		    		// 1번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.print("  Hello World!!  ");   	// 문구를 출력합니다.
	}
	// 랜덤 값이 2이라면 아래의 조건을 실행합니다.
	else if (value == 2) {
		// 0번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.setCursor(0,0);
		// 아래의 문장을 출력합니다.
		lcd.print("  KocoaFab.cc  ");
		// 1번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.setCursor(0,1);
		// 아래의 문장을 출력합니다.
		lcd.print("  Hello World!!  ");
	}
	// 1초간 대기합니다.
	delay(1000);
	// LCD의 모든 내용을 삭제합니다.
	lcd.clear();
}

 

* 코드 윗부분에 LiquidCrystal_I2C lcd(0x3F, 16, 2); 이 코드에서 0x3F를 위에서 찾은 자신의 I2C_LCD 주소로 바꿔 주셔야 LCD가 정상동작 합니다!!

 

코드에 I2C주소를 제대로 입력한 후에도 I2C_LCD에 글자가 출력되지 않으면 뒤에 가변저항을 돌려 LCD 문자 선명도를 조절해 보세요!

 

 

LCD를 활용한 프로젝트

LCD 게임기

LCD 화면에는 글자는 물론 각 종 원하는 그림, 혹은 문자를 자유롭게 출력할 수 있습니다.

위와 같은 특성을 이용해 LCD로 만든 게임 프로젝트입니다. 

 

출처 : https://youtu.be/SjmdqRy22gc

 

 

[다음 학습가이드] 오렌지보드(BLE) 블루투스 통신 사용해보기 안드로이드폰 / 아이폰

kocoafabeditor

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

코코아팹, 오렌지보드, 아두이노, 오픈소스하드웨어, SW교육, SW코딩, 코딩, 코딩 교육, 스마트홈, IoT 홈, IoT, DIY, 키트, kit, kocoafab, ornage board, arduino, opensource hardware, Software, education, physical computing, LCD, Character LCD