[아두이노] LCD16x2 I2C(LiquidCrystal_I2C) 제어

IOT/아두이노|2019. 2. 25. 09:00

[아두이노] LCD16x2 I2C(LiquidCrystal_I2C) 제어



어제 가상시뮬레이터에서 LCD 16x2를 제어를 해보았는데 오늘은 실제 LCD 16x2 I2C을 이용해서 동일한 코딩 로직으로 결과를 출력하는 실험을 해보겠습니다. 사실 LCD 16x2를 가지고 있어 그것도 보여드리면 좋았겠지만 그냥 편하게 실험하기 위해서 LCD 16x2 I2C를 사용해서 실험 했네요.

1. LCD 16x2 I2C



LCD 16x2 I2C의 뒤면 검은색 모듈이 추가되어 있는데 I2C 통신을 하기 위한 모듈입니다. 간단히 4핀으로 구성되어 있으면 아두이노에 연결할때도 그리 어렵지 않게 연결할 수 있습니다.


제가 소유한 LCD 16x2와 LCD 16x2 I2C 인데 보는것 같이 핀 4개짜리를 사용하는게 훨 편하겠죠.

LCD 16x2 I2C 핀 4핀으로 구성

  • Gnd
  • Vcc(5V)
  • 데이터핀(A4)
  • 클럭핀(A5)

LCD 16x2 I2C의 뒷면에 보시면 적혀있기 때문에 쉽게 연결 할 수 있습니다.

LCD 16x2 I2C 주의사항

  • 부품마다 주소가 다를 수 있다. : 제가 사용한 부품의 주소는 LiquidCrystal_I2C 라이브러리 에서 이 클래스를 사용하기 위해서 사용하는 LCD 16x2 I2C의 주소값이 필요한데 처음에 작동을 안해서 불량품인 줄 알았어요. 구글링해서 주소가 따로 있고 다르면 출력이 안된다는 사실을 나중에 알게 되었죠.
  • 가변저항을 조설해야 한다. : 파란색 작은 사각모형에 십자나사 모양이 있는데 첨에는 한쪽으로 감겨져 있어서 이걸 돌릴 생각없이 LCD에 불이 안들어와서 불량품인 줄 알고 삽질을 한 기억이 있네요. 이걸 돌려서 밝기를 조절해야하는데 처음 만질때는 생각을 못했네요.

LCD 16x2 I2C 주소 확인법

아두이노에서 I2C에 잡혀있는 주소를 알아볼 수 있습니다. 예제가 있으니 그걸 복사하셔서 자신이 사용하는 부품의 주소를 확인하시면 됩니다.

LCD 16x2 I2C 데이터 시트

이곳에 가셔서 LCD 16x2 I2C의 데이터 시트를 확인하시면 됩니다. 아주 간단하게 소개되어 있어서 보기 편할꺼에요. 이곳에 가시면 이표가 있는데 LCD 16x2 I2C 주소가 어떻게 지정되는지 확인 할 수 있습니다.


위에 LCD 16x2 I2C 뒤면 사진에서 파란사각모양(가변저항) 밑에 3개의 작은 사격형 모양으로 모듈 회로에 표시되어 있을꺼에요 각각 A0, A1, A2로 납땝이 어떤식으로 되어 있느냐에 따라서 주소가 바뀌게 됩니다. 인두가 있는분들은 주소를 변경해 볼 수 있겠죠. 그런데 별로 추천드리지 않고요 그냥 만들어져 있는 형태로 실험하세요.

하지만 2개이상을 쓸때 같은 주소인데 2개가 다른 용도로 개별적으로 출력을 하고자 할때는 한개 주소를 변경해줘야 겠죠. 변경해주면 해당주소에 해당값만 출력되게 됨으로 여러개를 같은 라인에 연결하여 사용할 수 있겠죠.

2. 회로도 구성


  • 준비물 : LCD 16x2 I2C 1개, 아두이노우노
  • 내용 : LiquidCrystal_I2C 라이브러리를 사용하며 값을 출력하기 위해서 LCD 16x2 I2C 회로도를 표현을 하자.


상단에 표시한 아무것도 적혀있지 않는 핀 두개가 있습니다. 거기 핀은 A5, A4라고 참고로 알아두시면 돼요. 위로 연결을 하던 아래로 연결을 하던 동일하니깐 아무곳이나 연결하세요.

3. 코딩



LiquidCrystal 함수

LiquidCrystal_I2C lcd(0x3F,16,2);  // 0x27 or 0x3F
  • LiquidCrystal_I2C lcd(주소,가로,세로) : LCD 16x2 I2C 부품의 주소와 출력사이즈값을 지정합니다.

이전 실험해서는 LiquidCrystal(rs, enable, d4, d5, d6, d7) 함수만 사용하였지만 LiquidCrystal_I2C클래스에는 생성자 함수 인자가 주소랑 가로x세로 값을 던져 줍니다. LiquidCrystal 클래스처럼 함수 선택장애는 없겠죠. 그외 함수들은 대충 비슷함으로 생략합니다.

설계는 이전 LCD16x2 (LiquidCrystal) 제어(아두이노) 소스랑 동일합니다. 동일한 형태로 진행했습니다.

혹시 함수를 자세히 보고 싶으시다면https://github.com/marcoschwartz/LiquidCrystal_I2C 가셔서 LiquidCrystal_I2C.h 파일을 살펴보세요. 그리고 함수 내부동작을 자세히 보기 위해서는 LiquidCrystal_I2C.cpp 파일을 열어보시면 됩니다.

코딩을 전체적으로 하면

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F,16,2);  // 0x27 or 0x3F

void setup()
{
  lcd.init(); //초기화
  lcd.backlight(); //배경불켜기
  lcd.setCursor(0, 0);
  lcd.print("Hello World");
  delay(1000);
  lcd.clear();
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("COUNT : ");
  for(int i=0;i<10;i++){ 
    lcd.setCursor(9, 1);
    lcd.print(i);    
    delay(1000);    
  }    
}

4. 라이브러리 추가하기


우선 LiquidCrystal_I2C 라이브러리를 사용하기 위해서는 아두이노 IDE에 라이브러리로 등록해 줘야 합니다. 나중에 다른 부품을 사용할때도 이 과정을 계속 수행해야 하기 때문에 잘 알아 두세요.

  • PC에 아두이노 IED 설치된 경우


라이브러리 관리를 누르고 검색어로 LiquidCrystal_I2C를 치시면 설치가능한 라이브러리 파일들이 나타납니다. 이렇게 설치해도 되고요 구글링하셔서 해당 라이브러리파일을 다운 받은 후 .zip 라이브러리추가하시면 됩니다. 그러면 파일->예제 열기가 있는데 추가되어 있을꺼에요. 그 예제로 실험하셔도 됩니다.

  • RaspberryPi3에다 아두이노 IED를 설치된 경우

제가 RaspberryPi3에 아두이노 IED를 설치해서 아두이노를 원격으로 실험하고 있는데요. 문제는 라이브러리 관리 항목이 없어서 일일히 다운 받아야 하는게 귀찮더군요.

구글 검색을 통해 해당 라이브러리 파일이 있는 GitHub 경로를 찾아야 합니다.


이렇게 페이지에 들어가면 Clone or download를 클릭하시면 경로가 나오고 그걸 복사를 합니다. 그리고 라이브러리파일을 저장할 디렉토리를 만든 후 그 위치에서 다운받습니다.

git clone https://github.com/marcoschwartz/LiquidCrystal_I2C.git

그리고 나서 아두이노 IED에서 Add Libray... 를 눌러 다운받았던 경로의 라이브러리파일을 등록해야 사용할 수 있습니다.


파일->예제 누르니 3개의 샘풀 예제가 등록되어 있네요. HelloWorld 예제로 실험하시거나 아니면 위 코딩으로 정상적으로 출력되는지 복사하셔서 실험하시면 됩니다.

5. 결과


동영상 결과는 간단히 실제 결과만 출력되는 걸 보여줍니다. 여기에 코딩된 것은 실행 시키고 달려가서 아두이노우노가 있는 위치까지 가서 촬영을 해야 했기 때문에 "Hellow World"의 출력 메시지를 최대한 딜레이 시간을 준 코딩으로 촬영 했네요.

마무리


오늘은 가상시뮬레이터에서는 실험 할 수 없습니다. 어제 LCD 16x2 로 출력은 가능했지만 실제 LCD 16x2 I2C가 가상시뮬레이터에는 없기 때문에 아쉽게도 오늘 실험은 실제 아두이노 부품이 있는분만 가능할 듯 싶네요.

대충 이런식으로 제어를 한다는 것만 보여 드렸으며 자세한 함수 설명은 생략했습니다. 계속 가상시뮬레이터 실험을 주된 실험으로 이루어지기 때문에 가상시뮬레이터에만 초점을 두겠습니다.

이제 LCD 16x2 로 출력을 할 수 있게 되면은 측정센서 부품을 사용할때 그 결과를 LCD 16x2로 출력시키면 좀 더 재미 있겠죠.


댓글()