본문 바로가기
Hardware/MCU(Arduino,ESP8266)

아두이노, LCD 1602 I2C 모듈 사용하기 (feat. 주소에러)

by lovey25 2019. 11. 20.
반응형

아두이노와 LCD를 I2C로 연결해서 출력을 하는 방법입니다.

아두이노와 I2C 모듈이 있는 LCD 그리고 케이블들만 준비하시면 되겠습니다. (여기에서는 아두이노 나노 사용했습니다.)

하드웨어

LCD 1602 I2C 모듈

사용할 LCD 1602 i2c  모듈의 사진입니다. 생김새를 보면 앞면은 LCD만 떡하나 달려있고 뒷면에는 이렇게 i2c변환 모듈이 달려있습니다.

이 변환 모듈이 없다면 LCD의 16개 핀을 다 컨트롤 해줘야 하는데 800원짜리 변환모듈만 있으면 단 4개의 핀으로 모든일을 다 할 수 있으니 참 편합니다.

하드웨어 연결

결선은 4개의 각 핀을 아두이노와 LCD 모듈을 동일하게 연결해 줍니다. GND와 VCC는 잘 알겠는데 SDA, SCL은 뭐지 할 수 있을텐데요. i2c라는 통신방식을 이용하는 2개의 단자를 부르는 이름이라고 생각하면 될 것 같습니다. (자세한 내용은 i2c통신에 대해서 찾아보시면 많은 자료를 접하실 수 있어요.) 그럼 아두이노 핀에는 SDA, SCL이 안써져 있는데 어디에 연결할까요? 아두이노 보드 기본 스펙을 찾아보시면 아두이노 나노와 우노의 경우에는 아날로그핀 4번과 5번이 각각SDA, SCL용으로 지정되어 있는걸 아실 수 있어요. 그래서 다음과 같이 하나씩 연결만 해주면 끝입니다. 역시 간단합니다.

LCD - 아두이노
GND - GND
VCC - 5V
SDA - SDA (A4)
SCL - SCL (A5)

소프트웨어

라이브러리 설치

i2c모듈을 사용하기 때문에 거기에 맞는 라이브러리를 준비해 주어야 합니다. (Visual Studio의 확장프로그램인 Visual Micro 기준입니다.) 메뉴에서 'Visual Micro Explorer' 를 선택해서 창을 열어줍니다.

그리고 'Manage Livraries' 탭에서 'i2c', 'lcd' 라는 검색어로 검색을 해주면 많은 라이브러리들을 확인할 수 있는데요. 그중에서 저는 한글사용이 가능해 보이는 라이브러리가 눈에 보여서 이걸 사용해 보기로 했습니다. 클릭해서 라이브러리 설치를 합니다.

한국분이 만드신거 같은데 사용법 및 최신 동향은 여기서 확인하시면 됩니다.

https://github.com/junwha0511/LiquidCrystal_I2C_Hangul

펌웨어

이제 Visual Micro 새 프로젝트를 하나 만들어서 코딩을 해 보겠습니다.

프로젝트를 만든 다음 먼저 설치했던 라이브러리를 추가해 줘야 겠죠. 아래 그림처럼 메뉴를 따라가서 설치했던 'LiquidCrystal_I2C_Hangul' 라이브러리를 선택해서 소스코드에 추가합니다.

그리고 아래 코드를 참고하셔서 펌웨어를 완성합니다. 

#include <LiquidCrystal_I2C_Hangul.h>

LiquidCrystal_I2C_Hangul lcd(0x27, 16, 2); //주소:0x27, 열16, 행2 클래스 초기화

void setup() {
	lcd.init();				// LCD 시동
}

void loop() {
	lcd.backlight();		// 백라이트 켜기
	lcd.setCursor(4, 0);	// 4열 0행으로 커서이동 
	lcd.print("It is");		// 문자출력
	lcd.setCursor(4, 1);	// 4열 1행으로 커서이동
	lcd.print("English!");	// 문자출력
	delay(2000);			// 2초간 대기
	lcd.clear();			// 화면지우기
	//@ 한글출력
	lcd.setDelayTime(500);	// lcd출력속도 조절
	lcd.printHangul(L"일이삼사오육칠팔", 0, 8);	// lcd.printHangul(문자열, 시작점, 길이);
	delay(2000);			// 2초간 대기
	lcd.clear();			// 화면지우기
	lcd.noBacklight();		// 백라이크 끄기
	delay(1000);			// 1초간 대기
}

결과

한글은 초,중,종성을 표현해야하는 특징이 있어서 영어와는 달리 문자표현에 2개의 행을 모두 사용합니다. 그리고 라이브러리의 정확한 동작방법은 모르겠는데 어떤 제약이 있는지 한글자씩 흘러가듯 나타나고 한번에 2글자씩만 표현이됩니다. 잘못된게 아니니 놀라지 마세요.

업로드를 하면 이렇게 동작합니다. ^^

 

끝!

 

PS. LCD 주소값이 다른 문제가 발생할 경우

인터넷이나 책에서 LCD예제를 보고 따라하는경우 가끔씩, 똑같이 했는데 화면에 아무것도 표시되지 않아서 당황하는 경우가 있습니다. 처음 사용하시는 분이 알아차리기 힘든 대표적인 오류가 주소값을 잘못 지정해서 나타나는 오류인데요. 

16x2 LCD가 제작될 때 할당되는 주소값으로는 0x3F와 0x27이 있다고 합니다. 그러니까 가지고 있는 부품에 따라서 이 주소값을 다르게 해줘야 한다는건데 다행인것은 옵션이 두개 뿐이라는겁니다. (아직 이 두가지 주소말고는 못본것 같아요.) 그래서 만약 똑같이 했는데 화면에 아무것도 안뜬다 싶으면 위에 있는 코드에서 3행 LiquidCrystal_I2C(주소값,16,2)에서 주소값을 다른걸로 변경해 보세요.
(주소값을 확인 하는 확실 한 방법은 아래글을 참고해 주세요)

 

아두이노 I2C 스캐너, LCD 1602 I2C 모듈 주소 찾기

LCD 1602 I2C 모듈을 사용하는 방법을 소개한 포스팅(https://kwonkyo.tistory.com/309)에서 주소값 불일치로 인한 오류에 대해서 언급한 적이 있었습니다. 이번에는 LCD의 이 주소값을 확실하게 확인 할 수

kwonkyo.tistory.com

 

끝!

반응형

댓글