LiguidCrystal에 해당하는 글 1

[아두이노] LCD16x2 (LiquidCrystal) 제어

IOT/아두이노|2019. 2. 24. 17:07

[아두이노] LCD16x2 (LiquidCrystal) 제어



오늘은 LCD 16x2 에 값을 출력하는 실험입니다. 회로도는 arduino.cc에서 제공되는 샘플을 그대로 따라 실험을 하였습니다. 저도 LCD 16x2 부품을 사용할때마다 이전에 실험했던 디자인을 찾아서 보고 회로도를 표현만드네요. 우선 사용하는 핀이 많아서 좀 햇갈리고 잘못 표현할 수 있어서 그냥 예제의 표현을 기반으로 가상시뮬레이터로 정상적으로 결과가 나오는지 실험해 보는걸로 하겠습니다.

1. LCD 16x2



15, 16핀은 백그라운드 밝기라서 220옴을 달았더군요. 1번 Gnd, 2번 Vcc, 3번 Vo로 여기에 출력 글자의 밝기가 결정되더군요.
DB0~7까지 데이터 핀이고, 나머지 RS, R/W, Enable핀으로 구성되어 있습니다.

2. 회로도 구성


  • 준비물 : LCD 16x2 1개, 저항 220옴 1개, 10k 가변저항기 1개, 아두이노우노, 뻥판
  • 내용 : LiquidCrystal(rs, enable, d4, d5, d6, d7) 을 사용하여 값을 출력하기 위해서 16x2 회로도를 표현을 하자.
  • 인용자료 : https://www.arduino.cc/en/Reference/LiquidCrystal(아무 예제나 클릭해도 됨)

//LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal lcd(3, 4, 9, 10, 11, 12);

우선 이 함수를 사용하기 위해서 rs, enable핀과 데이터 데이터 4,5,6,7번 핀을 사용을 해야합니다. 회로도 디자인은 적당한 핀으로 디자인이 깔끔하게 보이게 하기 위해서 3, 4, 9, 10, 11, 12핀에 연결했습니다. 그리고 15(Vcc)번과 16(Gnd)핀이 있는데 15번에 220옴을 붙여서 적당히 백그라운의 밝기를 고정시켰습니다. 그리고 전원으로 1번은 Gnd 2번 Vcc로 연결하는데 3번에 10k 가변저항을 붙여서 글자의 밝기를 조절하도록 배치된 회로도 만들어 보도록 하겠습니다.


우선 가장 심풀하게 표현된건데 사실 실제로 LCD 16x2를 구매하실때 이 부품을 잘 안사고 LCD 16x2 I2C 를 이용합니다. LCD 16x2 뒷면에 I2C모듈이 붙어 있어서 아두이노에서 필요한 핀이 2개뿐이 안필요해서 여러개의 부품 제어때 LCD 16x2 I2C를 주로 사용합니다. 기본 제어 부품들이 LCD 16x2 뒷면에 모듈로 다 붙어 있어서 따로 복잡하게 회로도를 만들 필요가 없어서 많이 사용합니다.


총 4핀에서 전원핀 2개를 제외하면 아두이노에서 사용할 2핀만 연결하시면 됩니다. 힘들데 선을 연결할 필요없이 4개의 핀만 연결하니 실제로 실험할 경우 저 부품을 사서 실험하겠죠. 문제는 가상시뮬레이터에서는 힘들게 선을 다 배치해야 합니다. 하지만 선을 배치함으로 LCD 16x2의 부품에 대해서 보다 자세히 이해할 수 있기 때문에 귀찮아 하지 마시고 한번 디자인 해보세요.

3. 코딩



LiquidCrystal 함수

LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

아두이노의 핀 회로도 배치가 달라지겠죠. 실험해서는 LiquidCrystal(rs, enable, d4, d5, d6, d7) 함수만 사용합니다.

그외 함수들

제블러그에서 대충 함수를 요약한 건데 가져왔네요.https://www.arduino.cc/en/Reference/LiquidCrystal 보시면 오른쪽에 함수목록들이 있는데 가서 함수들을 읽어보시면 됩니다. 간단히 요약하면은

begin(가로,세로) => 화면나누기
setCursor(가로,세로) => 커서의 위치
print(출력문자열) => 출력
write(출력문자) => 출력
clear() => 화면지우기
noDisplay() => 끄기
display() => 켜기
scrollDisplayRight() => 오른쪽으로 한칸이동
scrollDisplayLeft() => 왼쪽으로 한칸이동
autoscroll() => 자동으로 왼쪽이동
lcd.createChar(0, 문자배열값) => 직접 문자를 만듬(write(byte(0))출력)

외우지 마시고 대충 정리했다가 LCD 16x2를 사용하실때 이 함수들을 적어놨다가 사용하시면 됩니다.

설계

제 블로그에서 간단히 실험한 예제을 그대로 사용했네요. LCD 16x2에 "Hello World"를 출력해보고 "COUNT : 숫자"로 출력되게해서 카운터를 세보자.

  1. LiquidCrystal를 사용하기 위해서 객체를 선언해야지. 그런데 클래스 보니깐 선언때 생성자함수이네! 사용할 핀을 넘겨줘야 하는군!
  2. 초기작업이 끝났으니 이제 lcd 객체변수로 화면을 16x2로 세팅해야지
  3. 이제 LCD 16x2의 값을 출력할 커서의 위치는 잡아야 줘야지.
  4. "Hello World" 출력해야지
  5. 다음 "COUNT: 숫자"로 카운트를 세면서 값을 출력해야지. 그런데 그냥 출력하면 기존의 쓰여진 값에 덮어씌워지니깐 clear()함수로 화면을 지워야지
  6. "COUNT: 숫자" 숫자를 매번 clear하고 지우기 그러니깐 "COUNT : "한번만 하고 숫자만 갱신하는게 실속 있겠다. 그러면 바로 카운터 숫자가 나오는 위치만 갱신하면 되겠죠. 아까 글자가 출력할 커서의 위치를 지정하는 함수가 있었죠. 그 함수로 숫자의 위치 "COUNT : "은 공백포함 8자리니깐 setCursor(9, 1)를 이용해서 갱신하면 쉽게 표현되겠군.

코딩을 전체적으로 하면

#include <LiquidCrystal.h>

//LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal lcd(3, 4, 9, 10, 11, 12);

void setup()
{
  lcd.begin(16,2);
  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);    
  }    
}

for문을 이용해서 0~9까지 i의 값이 1씩 증가하고 그 값이 커서(setCursor(9,1)로 두번째 줄의 9번째칸에 i값을 출력이 됩니다.
0~9까지 아니는 1초 단위로 그 값을 찍게되는 것이죠. 자세히 보시면 위에서 함수에 대한 요약된거랑 매칭해서 이해하세요.
대충 이런식으로 값들을 찍어낼 수 있습니다. 나중에 센서값을 측정하면 바로 LCD 16x2로 출력할 수 있겠죠.

4. 결과


동영상 결과를 회로도를 최대한 보기 편하게 배치하다 보니깐 LCD 16x2가 거꾸로 배치했네요. 그래서 글자가 거꾸로 나오는 것처럼 되었네요.

마무리


LCD 16x2 만 잘 사용하시면 이제 다양한 실험을 작은 LCD 모니터로 그 값을 출력할 수 있어서 보기 편하실꺼에요. 이걸 모니터 대용으로 아두이노상에서 모든걸 해결 할 수 있게 되겠죠. 한번 초음파센서와 결합해서 거리값을 출력시켜보세요. 다음편에 이 두 부품을 결합한 에제로 복습 실험을 할지 아니면 실제로 LCD 16x2 I2C 를 이용해서 2핀으로만 제어하는 걸 보여드릴때 고민해봐야 겠네요.
암튼 LCD 16x2를 연습을 하시고 다 소개하지 못했지만 참고자료에 링크한 곳에 가셔서 함수들을 한번 읽어보시면 표현을 해보세요.

오늘은 LiquidCrystal 에서 사용함수들만 이해만 해주세요. 그리고 예제가 어떻게 출력되는지만 잘 살펴보시면 그냥 무난히 LCD 16x2를 사용하실 수 있을꺼에요.


댓글()