2023년 12월 14일 목요일

[초보의 아두이노] i2c를 통한 16x2 LCD 제어

개요

16*2 LCD는 직접 아두이노와 연결해 제어할 수도 있지만 I2C를 이용하는 쪽이 간결하고 핀도 적게 사용한다.

I2C 제어에는 SDA(Serial Data), SCL(Serial Clock) 핀을 사용한다.


한글은 사용할 수 없으며, 모듈에 따라 정규 아스키 코드 외에 약간의 추가 문자(보통 일본어 표기용 가나 문자가 보인다)가 있다.

문자 하나는 5*8도트로 이루어져 있다 (즉, LCD 전체의 해상도는 80*16 도트)


결선도



HELLO WORLD 출력 코드

#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
 
void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  lcd.clear();
 
  lcd.setCursor(0,0);
  lcd.print("Hello World!");
}
 

LiquidCrystal_I2C.h : i2c lcd 제어 라이브러리

LiquidCrystal_I2C 클래스 : i2c 주소, 컬럼 수, 라인 수

※이번에 사용한 모듈의 i2c 주소는 0x27이지만 모듈에 따라 다르다. 0x3F라던가.


setCursor(x, y) : 문자를 출력할 위치를 지정 (basic을 배운 사람은 지금 많지 않겠지만, basic의 locate 명령과 같다)

print(출력할 문자열)


출력된 모습






사용자 정의 문자 (Custom Character)

16*2 LCD는 최대 8개까지의 사용자 정의 문자를 사용할 수 있다.

비트맵 디자인이 익숙하지 않은 사람은 아래 페이지를 이용하면 편리하다.

Custom Character Generator for HD44780 LCD Modules



커스텀 문자 정의/출력 코드

#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
byte smile[8] = {
  0b00000,
  0b00000,
  0b01010,
  0b01010,
  0b00000,
  0b10001,
  0b01110,
  0b00000
};
byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};
byte fighter[8] = {
  0b00100,
  0b01110,
  0b00100,
  0b10101,
  0b10101,
  0b11111,
  0b11111,
  0b10101
};
byte loderunner[8] = {
  0b11000,
  0b11100,
  0b11100,
  0b01000,
  0b00111,
  0b10100,
  0b01011,
  0b01000
};
 
void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  lcd.clear();
 
  lcd.setCursor(0,0);
  lcd.print("Custom Character");
 
  lcd.createChar(0, smile);
  lcd.createChar(1, heart);
  lcd.createChar(2, fighter);
  lcd.createChar(3, loderunner);
 
  for(int i=0;i<4;i++){
    lcd.setCursor(i*2,1);
    lcd.write(byte(i));
  }
}

createChar(문자코드, 비트맵배열)
write(문자코드)
※문자코드는 원래 아스키코드가 들어가는데, 사용자 정의 캐릭터는 0~7에 할당된다.
일반적인 아스키코드를 지정해서 createChar를 해도 변화는 없다.

실행 결과


제한적이지만 애니메이션을 만들 수도 있다. 단, 보통 이 LCD 모듈은 잔상이 매우 심하고, 오랜 시간 빠른 쓰기를 계속하면 오동작을 일으킨다. 너무 과도한 출력을 하지 말자..


커스텀 문자 애니메이션 코드

#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
byte loderunner[8] = {
  0b11000,
  0b11100,
  0b11100,
  0b01000,
  0b00111,
  0b10100,
  0b01011,
  0b01000
};
byte loderunner2[8] = {
  0b11000,
  0b11100,
  0b11100,
  0b01000,
  0b00100,
  0b00110,
  0b01100,
  0b00100
};
byte loderunner3[8] = {
  0b01100,
  0b01110,
  0b01110,
  0b00100,
  0b01110,
  0b00110,
  0b01011,
  0b01000
};
 
void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  lcd.clear();
 
  lcd.setCursor(0,0);
  lcd.print("Custom Character");
 
  lcd.createChar(0, loderunner);
  lcd.createChar(1, loderunner2);
  lcd.createChar(2, loderunner3);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
  for(int i=0;i<3;i++){
    lcd.setCursor(0, 1);
    lcd.write(byte(i));
    delay(300);
  }
}

 실행 결과



댓글 없음:

댓글 쓰기

1/12 거○먼트 스타일 자동권총 데이터(STL)

  3D프린터로 출력해서 쓸 수 있는 클래식한 자동권총 모델. 1/12 스케일로 그립 크기는 30MS의 무장손에 맞춘 수준. 슬라이드 후퇴고정된 상태와 일반상태 두 가지를 만들었다. 후퇴고정 모델에서 배럴과 가이드의 굵기 때문에 시행착오가 좀 있었던 ...