아두이노/기초 예제

아두이노 예제 15. LCD에 글자 쓰기(I2C LCD 모듈 사용)

코딩런 2018. 4. 10. 01:57

 

 

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);과 같이 입력하면 된다.