본문으로 바로가기

 

 

LCD(액정표시장치, Liquid Crystal Dispaly)


 

아두이노 예제 12강에서 진행했던 LCD에 글자 쓰기는 실습을 해보기에는 좋은 예제이다. 하지만 디지털 포트를 많이 차지하기 때문에 여러가지 부품을 사용해야 한다거나 프로젝트를 진행할 시에는 효율적이지 못 하다. 그러므로 이번 시간에는 I2C LCD 모듈을 사용하여 글자를 써보도록 하겠다.

 

I2C LCD 모듈


기존 LCD에 모듈만 결합한 형태로 GND, VCC, SDA(Serial Data Line), SCL(Serial Clock) 등 총 4개의 핀으로 이루어져 있다. 총 12개의 배선을 단 4개의 배선으로 동작이 가능하기 때문에 여러 부품들을 함께 사용하기에 유용하다. 또한 I2C Converter에 가변 저항도 내장되어 있기 때문에 선명도 조절을 위한 가변 저항을 따로 달아줄 필요가 없다.

 

Arduino-LiquidCrystal-I2C-library-master.zip

http://codingrun.com/100

라이브러리 추가 방법은 위 링크를 참고하기 바란다.

 

사용 함수


 

함수를 사용하는 방법은 객체이름.함수();와 같이 사용한다. lcd 예제이기 때문에 보통 객체 이름을 lcd로 선언하며, lcd.print("Codingrun");과 같이 사용하면 된다.

 

실습 내용


LCD에 원하는 문자를 출력해 보자.

 

준비물


아두이노 보드, I2C LCD, 암수 점퍼선 4개

 

회로도


 

 

 

 

소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <LiquidCrystal_I2C.h>     //LiquidCrystal 라이브러리 추가 
LiquidCrystal_I2C lcd(0x3F162);  //lcd 객체 선언
 
void setup()
{
  lcd.begin(); //LCD 사용 시작
}
 
void loop()
{
  lcd.setCursor(50);    // 커서를 5, 0에 가져다 놓아라. (열, 행)
  lcd.print("Hi ^^");     // 5, 0에 Hi ^^를 출력해라.
  delay(1000);            // 1초 대기
  lcd.setCursor(31);    // 커서를 3, 1로 가져다 놓아라. (열, 행)
  lcd.print("Codingrun"); // Codingrun을 입력해라.
  delay(1000);            // 1초 대기 
  lcd.clear();            // 글자를 모두 지워라.
  delay(1000);            // 1초 대기
}
cs

EX15_I2CLCD.ino

 

 

 

글씨 출력이 안 되는 경우 (해결 방법)


LCD 관련 실습을 하다 보면, 네모만 나온다던가, 글씨가 출력이 안 되던가 하는 오류가 종종 일어난다. 가장 흔한 이유 중 하나는 I2C LCD 부품의 주소값이 다르기 때문이다. 이럴땐 i2c_scanner를 통해 주소값을 알아낸 다음, 객체 선언에서 주소값을 바꿔주면 된다.

 

i2c_scanner를 통해 주소값을 알아내는 방법은 아두이노 공식홈페이지를 참고하면 된다.

https://playground.arduino.cc/Main/I2cScanner

 

 

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
40
41
42
43
44
45
46
47
48
49
50
#include <Wire.h>
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the 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("Unknown 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);           // wait 5 seconds for next scan
}
cs

EX15_I2CLCD.ino

 

 

위 코드를 실행 해보면, 시리얼모니터에 내가 가지고 있는 i2c lcd의 주소값을 알 수 있다. 현재 필자는 0X3F이므로 LiquidCrystal_I2C lcd(0x3F162); 와 같이 입력하면 정상적으로 실행되는 것을 알 수 있다.

 

예를 들어 주소값이 0X27로 나온다면, LiquidCrystal_I2C lcd(0x27162);과 같이 입력하면 된다.