초보자를 위한 아두이노 코딩 입문-14: I2C인터페이스 1602 LCD 디스플레이 출력
16핀을 가지는 1602 lcd 디스플레이는 사용법이 그다지 복잡하지는 않으나 핀 수로 인해 점퍼 선 와이어링 작업이 과한 편이다. lcd 디스플레이의 1602 라는 숫자의 의미는 2줄에 줄마다 16개의 문자를 디스플레이 할 수 있다는 의미이다.
그 배선 사례를 보자.
이 정도 규모의 배선 규모는 웬만한 아두이노 선수가 아니라면 점퍼선 배선 작업에 대한 부담을 느낄 수밖에 없다.
따라서 과중한 점퍼선 작업 부담을 줄이기 위해서 1602 lcd PCB의 뒷면에 백팩(backpack)회로가 부착된 I2C 인터페이스를 사용하는 lcd 디스플레이를 구매하여 사용해보자.
백팩 PCB만은 시중에서 660원의 저렴한 가격으로 구입할 수 있지만 처음부터 아예 백팩이 부착된 I2C lcd 디스플레이 구매하는 것이 납땜 작업을 피할 수 있는 스마트한 방법이다. 그냥 1602 와 I2C(IIC) 1602는 가격 및 사용법이 완전히 다르므로 구매에 주의하도록 하자. I2C(IIC) 1602는 택배비 제외 4,500선에 구매가 가능하다.
I2C 인터페이스의 장점으로는 와이어링에 필요한 전기 배선이 전원선 GND 와 5V, SCL 과 SDA 4개의 점퍼선이면 충분하며 2개의 라이브러리 즉LiquidCrystal_I2C.h 과 Wire.h 사용이 필요하다.
Wire.h 는 I2C 인터페이스를 지원하며, LiquidCrystal_I2C.h는 I2C 인터페이스 lcd 디스플레이를 지원한다.
아래는 16핀 백팩 PCB회로가 납땜되어 있는 lcd의 뒤태이다. 우측 상단에 가변 저항이 1개 부착되어 있는데 이는 lcd의 백라이트 밝기를 조절하기에 사용된다. 흔히 완전히 조립한 상태에서 이 저항 값을 조정하지 않음으로 인해 착각하는 수가 있을 수 있는데 반드시 한번 드라이버로 나사를 돌려 보아 밝기를 조절해야 한다.
I2C lcd 배선은 GND->GND, Vcc->5V, SDA->A4, SCL->A5 에 연결한다. A4, A5 는 각각 아날로그 핀을 뜻한다.
아두이노 편집기의 스케치 탭 메뉴의 라이브러리포함하기에서 ZIP 라이브러리 추가를 실행하여 라이브러리 LiquidCrystal_I2C.h 를 설치하도록 하자.
이 라이브러리는 구글에서 i2c 1602 lcd 로 검색하면 뜨는 코코아팹에서 Arduino-LiquidCrystal-I2C-library-master.zip 파일을 다운 받도록 한다.
i2c 방식으로 lcd를 사용하기 위해서는 Wire.h 라이브러리도 필요한데 이 라이브러리는 아두이노에 디폴트로 설치되어 있으므로 코드 전반부에 그냥 헤더파일만 불러 쓰면 된다.
아두이노 코딩으로 들어가기로 하자.
헤더 라이브러리 바로 밑에서 클라스 명령 LiquidCrystal_I2C lcd(0x3F,16,2)를 실행한다. I2C 디바이스의 주소 즉 address를 의미하는 0x3F에서 0x 는 아두이노에서 헥사 데이터를 의미하며, 실제 헥사 값은 3F이다.
setup() 에서 초기화(lcd.init) 및 백라이트(lcd.backlight) 제어 명령을 실행한다. 주의할 점은 I2C 인터페이스를 쓸 경우와 쓰지 않을 경우의 중요한 차이점은 초기화 명령이 서로 다르다는 점이다. 즉 I2C 인터페이스의 초기화는 lcd.init() 이지만 반면에 I2C를 쓰지 않는 경우에는 lcd.begin() 명령을 사용한다.
lcd.setCursor(2,0)에서 2는 앞에서부터 2칸을 건너 띄어 0번째 줄 즉 첫 번째 줄을 의미한다. 마지막으로 lcd.print(“Hello, world!)를 실행하면 lcd에 출력이 이루어진다.
준비가 되었으면 위 그림의 간단한 코드를 실행보기 바란다. 아울러 코드가 대단히 간단해도 실패할 수 있는데 백팩회로를 부가함에 따라 하드웨어적으로 I2C 주소가 구매 시점부터 0x27로 변경된 제품들이 섞여 있어 사용자가 아래에 첨부된 스캐너 코드(i2cscanner)를 사용하여 시리얼 모니터에서 확인해 볼 필요가 있다.
i2cscanner
#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("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
}//끝
마지막으로 이 코드를 사용하여 16자에 맞춰 "Welcome Steemit!" 을 출력해 보았습니다. 잘라가셔서 신입회원 환영 피켓으로 쓰셔도 좋겠지요?
연관 블로그
Reposting: 초보자를 위한 아두이노 코딩연재-4: 아두이노 편집기(Arduino IDE) 다운로드 및 설치
https://steemit.com/kr/@codingart/reposting-4-arduino-ide
아두이노 코딩 문법 및 편집의 모든 기초연재-9: 비오는 날 창가에서 조도센서 저항값 변화에 따른 LED ON OFF
https://steemit.com/kr/@codingart/9-led-on-off
초보자를 위한 아두이노 코딩연재-6: CH340G 드러이버 설치, 아두이노 코딩에 의한 LED ON OFF
https://steemit.com/kr/@codingart/6-ch340g-led-on-off
초보자를 위한 아두이노 코딩 입문-13: 클레멘타인 멜로디 톤 연주
https://steemit.com/kr/@codingart/12
초보자를 위한 아두이노 코딩 입문-12: Adafruit DTH11 센서를 이용한 온습도 모니터링
https://steemit.com/kr/@codingart/11-adafruit-dth11
초보자를 위한 아두이노 코딩 입문-11: “초음파 센서 SR-04 거리 측정”
https://steemit.com/kr/@codingart/11-sr-04
오오.. 아두이노 관련해서 좋은글들을 많이 올려 주시는군요..
우연히 발견.. ㅎㅎ 저도 아주 잠깐 해본적이 있어서요~
가입인사글 홍보도 안되고 했던데~ 이글을 가입인사처럼 해서 @홍보해 드립니다~
글 쓰실때 100% 스파말고 50:50으로 글쓰세요~ 그리고 들어오는 스팀달러를 스팀으로 바꾸셔서 바로 스팀파워 업을 하시는 것이 더 이득입니다...!!
귀중한 점들을 가르쳐 주셔 감사합니다.
저도 @happyberrysboy 글이 좋았어요. @krguidedog 님 글도 읽어 볼께요.
저는 코딩 잘모르는데..
아는 사람들이보면 좋을거같아서 리스팀해요^^
홍보가 좀 잘되면좋겠네요ㅎㅎ
아두이노 코딩 잘모르시는 분들을 위한 블로그라서 1번 부터 읽으시면 부품 구매에서 부터 편집기 깔기를 포함하여 순서대로 되어 있습니다. 물론 누구든지 독학 가능하지요. 이런 글 시리즈가 처음은 아니고 세번째라 좀 더 세심하게 작성하고 있습니다. 감사합니다.