2015년 5월 29일 금요일

아두이노의 LiquidCrystal 라이브러리 예제들

 다음 예제들은 DFRobot사의 LCD쉴드를 이용하여 실험을 진행하였다.
[그림 2] 실험에 사용된 LCD쉴드와 회로도
회로도를 보면 RS가 8번 핀, RW가 9번핀, 그리고 D4~D7번 핀이 4번에서 7번핀까지로 결선되어 있음을 알 수 있다. 따라서 LiquidCrystal 클래스의 인스턴스는 첫 번째 생성자를 이용하여 다음과 같이 생성하면 된다.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
이제 예제들을 작성해 보도록 하겠다.

첫 번째 예제

 첫 번째 예제로 간단한 문자열을 출력하는 프로그램이다.

// 헤더파일을 인클루드 시킨다.
#include <LiquidCrystal.h>
// 회로도를 참조하여 LCD 객체를 생성/초기화시킨다.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
   // LED의 행수와 열수를 주어 표시를 시작한다.
   lcd.begin(16, 2);
   // LDC에 문자열을 표시한다.
   lcd.print("hello, world!");
}
void loop() {
   // 커서의 위치를 0열, 1행(두 번재 행)으로 설정한다.
   lcd.setCursor(0, 1);
   // 초를 표시한다.
   lcd.print(millis()/1000);
}

두 번째 예제

 LiquidCrystal 라이브러리에는 blink() 와 noBlink() 함수가 있는데 깜박이는 직사각형의 커서를 표시할 것인지 아닌지를 설정하는 함수이다. 다음 예제를 이것을 이용한 것이다.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
   lcd.begin(16, 2);
   lcd.print("hello, world!");
}
void loop() {
   lcd.noBlink();
   delay(3000);
   lcd.blink();
   delay(3000);
}
유사한 함수로 cursor() 함수와 noCursor()함수가 있는데 이것은 밑줄 모양의 커서를 표시할 것인가 말 것인가를 설정하는 것이다. 이 경우 밑줄 커서는 깜박이지 않는다.

세 번째 예제

 LiquidCrystal 라이브러리의 공용 멤버함수 중에는 display()함수와 noDisplay()함수가 있다. 함수 명에서 알 수 있듯이 화면에 표시를 할 것인지 말 것인지를 설정하는 것이다.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
   lcd.begin(16, 2);
   lcd.print("hello, world!");
}

void loop() {
   lcd.display();
   delay(3000);
   lcd.noDisplay();
   delay(3000);
}

위 예제어서 noDisplay()함수가 실행되면 화면에 표시된 문자열이 사라지지만 그 내용은 내부 메모리에 여전히 남아있다. 따라서 display()함수가 호출되면 되살아나는 것이다. 또한 이 함수들을 이용하면 화면 전체를 깜박이는 효과를 줄 수도 있다.

네 번째 예제

문자열이 표시되는 방향을 바꾸는 함수로 rightToLeft()함수와 leftToRight()함수가 있다. 다음 예제는 이것을 이용한 것이다.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int thisChar = 'a';
void setup() {
   lcd.begin(16, 2);
   lcd.cursor();
}
void loop() {
   // ‘m’ 이 표시되면 방향을 바꾼다.
   if (thisChar == 'm') {
       lcd.rightToLeft();
   }
   // 's'가 표시되면 방향을 다시 바꾼다.
   if (thisChar == 's') {
       lcd.leftToRight();
   }
   // 'z'가 표시된 후 처음 조건으로 다시 리셋한다.
   if (thisChar > 'z') {
       lcd.clear(); // 화면을 지운 후 커서를 처음 자리로
       thisChar = 'a';
   }
   lcd.write(thisChar);
   delay(1000);
   thisChar++;
}

다섯 번째 예제

 이번에는 터미널에 입력한 문자를 LCD에 표시하는 프로그램을 작성해 보자.
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
   lcd.begin(16, 2);
   Serial.begin(9600);
}
void loop() {
   // 문자가 전송되면
   if (Serial.available()) {
       // 전체 문자열이 들어올 때까지 잠시 기다린다.
       delay(100);
       lcd.clear();
       // 전송된 모든 문자를 표시한다.
       while (Serial.available() > 0) {
           lcd.write(Serial.read());
       }
   }
}

여섯 번째 예제

 화면의 내용을 스크롤(scroll)하는 예제이다.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
   lcd.begin(16, 2);
   lcd.print("hello, world!");
   delay(1000);
}
void loop() {
   // 왼쪽으로 스크롤
   for (int cnt = 0; cnt < 13; cnt++) {
       lcd.scrollDisplayLeft();
       delay(150);
   }
   // 오른쪽으로 스크롤
   for (int cnt = 0; cnt < 29; cnt++) {
       lcd.scrollDisplayRight();
       delay(150);
   }
   // 다시 왼쪽으로 스크롤하여 제자리로
   for (int cnt = 0; cnt < 16; cnt++) {
       lcd.scrollDisplayLeft();
       delay(150);
   }
   delay(1000);
}

이 예제에서는 scrollDisplayLeft() 함수와 scrollDisplayRight() 함수를 이용하여 수동으로 이동시켰다. 반면 autoScroll()함수를 사용하면 문자가 표시되기 전에 왼쪽으로 자동으로 이동이 된다.


댓글 없음:

댓글 쓰기