아두이노 코딩 : I2C Character LCD 한 줄 고정, 한 줄 스크롤 하기 JHD-162A
Lucy Archive
Lucy 2023
2020. 8. 5. 00:08

아두이노 CLCD 깜빡임 없이 출력아두이노 CLCD 깜빡임 없이 출력

Arduino Uno I2C scroll single line without blinking

Arduino CLCD의 응용 예제로 첫 행은 고정, 아래 행은 스크롤 하는 예제를 소개합니다. 본 에제에서는 한 줄에만 스크롤을 적용하기 위해 라이브러리의 스크롤 함수(라이브러리의 autoscroll())를 사용하지 않고

수동으로 스크롤 코드를 생성하고, 깜빡임을 없애기 위해 라이브러리의 clear() 함수를 사용하지 않고 refresh

하는 코드를 소개합니다.

I2C CLCD 기본적인 사용법에 설명은 하단의 관련 포스트를 참조해주세요.


하드웨어

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • I2C CLCD x 1EA (본 예제에서는 I2C CLCD 16x2 모듈을 사용하였습니다.)
  • Jumper Wires

회로도 및 연결

Arduino Uno I2C CLCDArduino Uno I2C CLCD

아두이노 우노의 A4, A5 포트로 I2C 통신 단자를 연결하고, 5V와 GND 를 CLCD 와 연결합니다. CLCD I2C I/O 확장 모듈에 I2C 버스 내부 풀업이 있는 것으로 확인되어 별도의 풀업 저항은 필요하지 않습니다.

코드

  • 3~5행에서 I2C 주소와 CLCLD 행과 열을 수정 할 수 있습니다. 
  • 11~13행에서 첫 행에 기록할 문자열, 두 번째 행에 기록할 문자열을 설정할 수 있습니다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <LiquidCrystal_I2C.h>
 
const int lcdAddress = 0x27// 자신의 Device 의 주소를 입력
const int lcdColumns = 16// 가로 길이 (열)
const int lcdRows = 2// 세로 길이 (행)
 
LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows);
 
// line2string 16글자 이상일때, 이하일때 테스트용으로 2줄
// 두번째 행에 출력할 문자열
String line2string = "Welcome to my blog! I wish you all the best ;)";
//String line2string = "Welcome ;)";
String line1String = "Length > 16'";
 
void setup()
{
  lcd.init();
  lcd.clear();
  lcd.backlight();
}
 
void loop() {
    //첫 행에 고정 문자 출력
    lcd.setCursor(0,0);
    lcd.print(line1String);
 
    //두번째 행에 출력될 문자의 길이 저장
    int ilen = line2string.length();
    lcd.setCursor(0,1);
 
    // temp : 두번째 행에 출력할 실제 문자열 저장 변수
    String temp;
 
    // 두번째 행에 출력할 글자 길이가 16이하인지, 이상인지 분기
    if(ilen <= lcdColumns)
    {
        /* lcd.clear() 함수롤 따로 쓰지 않기 위해
           총 16칸에서 비어있는 문자를 공백으로 채움  */
        temp = line2string;
        for(int i = 0; i< lcdColumns - ilen ; i++)
        {
            temp += " ";
        }
        lcd.print(temp);
        delay(5000);
    } 
    else
    {
        /*  스크롤을 자연스럽게 하기 위해
            문자열의 앞뒤에 공백을 추가한 line2stringplus 변수 생성  */
        String line2stringplus = "                ";
        line2stringplus += line2string;
        line2stringplus += "                ";
        ilen = line2stringplus.length();
 
        /*  문자열이 16자 보다 길 경우
            순차적으로 16 글자 크기만큼 temp에 저장하여 LCD에 출력
            */
        for(int i = 1 ; i < ilen - lcdColumns ; i++)
        {
            lcd.setCursor(0,1);
            int end;
            if(ilen < i + lcdColumns)
            {
                end = ilen;
            }
            else
            {
                end = i + lcdColumns;
            }
            temp = line2stringplus.substring(i,end);
            lcd.print(temp);
            delay(200);
        }
    }
}
cs

코드 설명

  • 35줄 if문 : 2번째 행에 출력할 문자열 수가 16개 이하 또는 초과 인지에 따라 스크롤을 할지, 일반 출력을 할지 선택합니다.
  • 40줄 for문 : 2행에 출력할 문자열의 수가 16보다 작은 경우, 출력할 문자열 + " "(공백) 을 16자리 까지 채웁니다.
  • 47~76줄 else문 : 2행에 출력할 문자열의 추가 16보다 큰 경우, 스크롤을 자연스럽게 하기 위해 공백을 추가하고 16글자 만큼의 문자만 temp 변수에 저장하여 CLCD에 출력합니다.

String 객체 사용법 참조

  • String myString : myString 문자열 저장 객체를 생성
  • myString.length() : myString의 글자 수를 반환
  • myString += "text" : myString에 저장된 문자열 뒤에 "text" 문자열을 추가로 저장
  • myString.substring(start, end) : myString에 저장된 문자열의 start, end 인덱스 만큼의 문자열을 반환

스크롤 수동

2행에 출력할 문자열의 수가 16보다 긴 경우 아래 그림과 같이, 출력할 문자열 뒤에 공백을 추가하고, CLCD 에 출력 할 영역을 지정하여 출력합니다. 주석에서 설명하였지만, 이해를 돕기 위해 아래의 그림을 추가 하였습니다. 

수동으로 스크롤 코드 설명수동으로 스크롤 코드 설명

실행 결과

영상의 초반부에는 코드 11번 줄의 line2string 변수에 16글자 이상의 문자열을 입력한 경우, 영상의 후반부는 line2string 변수에 16글자 이하의 문자열을 입력한 경우입니다.


마무리

본 포스트에서는 I2C CLCD 의 사용법 응용 예제로, 한 줄만 텍스트를 스크롤 하는 코드를 소개하였습니다. 이 코드를 응용하면

원하는 공간 영역에 스크롤을 하고, CLCD를 깜빡임 없이 텍스트를 출력

하도록 적용이 가능 할 것이라 생각합니다. 

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

👉 아두이노 CLCD 관련글 목록 보기

👉 아두이노 I2C 통신 관련글 목록 보기

👉 아두이노 디스플레이 장치 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기