아두이노2015. 8. 25. 14:20

※ 아래의 라이브러리와 소스를 이용하면 Hello World 예제에서 첫글자인 H 만 출력이 된다는 의견이 있었습니다. 신버전 아두이노 IDE를 사용할 경우 맨 아랫쪽 추가내용을 참고 하시기 바랍니다.


이번엔 아두이노에 LCD를 연결해 보았다. 

원래의 LCD 모듈은 14개의 핀을 아두이노에 연결해야 제 기능을 했지만 

내가 가지고 있는 버전은  LCD에 Serial I2C 1602 Shield가 추가된 버전이라 4개의 핀만 아두이노에 연결하면 된다.



[16x2  LCD 의 표시구조]


[LCD 모듈의 앞모습]


[LCD 모듈의 뒷모습, 검은색의 I2C 쉴드가 붙어 있다. 핀배열은 위에서부터 GND, VCC, SDA, SCL]



[아두이노와 LCD의 연결]



먼저 LCD 관련 아래의 라이브러리 파일을 다운로드 받아 압축해제 후 아두이노 IDE 설치폴더의 libraries 폴더에 복사해야 한다.


#16x2 LCD 용 라이브러리 (이 글에서는 이 파일을 다운로드 받으면 됨.)

LiquidCrystal_I2C1602V1.zip


#20x4 LCD 용 라이브러리

LiquidCrystal_I2C2004V1.zip


#1602 LCD With I2c 데이터시트

1602 lcd with i2c interface.pdf






## Hello World 표시 소스 ##


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display
 
void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello, world!");
}
 
void loop()
{
}
cs



##결과##


여기서 한 가지 주의할 사항이 있다. 

만약 LCD모듈의 Contrast가 적당하지 않으면 글자가 보이지 않을 수도 있다. 

이럴 경우 뒷면의 파란색 부품의 + 부분을 미니 드라이버 등으로 살짝 돌려주어 Contrast를 맞춰주면 글자가 보인다.


[LCD Contrast 조절]





## LCD Function 정리 ##

  lcd.init();                      // LCD 초기화 

  lcd.backlight();           // LCD 백라이트를 켠다

  lcd.noBacklight();      // LCD 백라이트를 끈다

  lcd.noDisplay();          // LCD 표시된 내용을 숨긴다

  lcd.display();               // LCD 표시내용을 보여준다

  lcd.cursor();                // 커서를 표시한다

  lcd.noCursor();           // 커서를 없앤다.

  lcd.setCursor(0,0);    // 해당 LCD 좌표로 커서 이동

  lcd.home();                 //커서를 0,0 좌표로 이동

  lcd.blink();                   // 커서를 깜빡임

  lcd.noBlink();              // 커서를 깜빡이지 않음

  lcd.write(36);              // LCD 화면에 값을 출력, 아스키코드 입력 시 해당문자 출력

                                            좌측 예제의 경우 '$' 출력

  lcd.print("TEST");       // LCD 화면에 값을 출력

  lcd.clear();                   // LCD 모든 내용 지움

  lcd.scrollDisplayRight();    //lcd 내용을 우측으로 1칸 스크롤

  lcd.scrollDisplayLeft();      //lcd 내용을 좌측으로 1칸 스크롤

  lcd.autoscroll();                  // 출력내용을 자동으로 우에서 좌로 스크롤


기타 Function 참조는 https://www.arduino.cc/en/Reference/LiquidCrystal?from=Tutorial.LCDLibrary




## 각종 LCD Function 테스트 소스 ##


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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//Compatible with the Arduino IDE 1.0
//Library version:1.1
//arduino lcd function test
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2);  
 
void setup()
{
  lcd.init();
}
 
void loop()
{
  //Backlight on/off
  lcd.backlight();
  lcd.print("BACKLIGHT ON");
  lcd.setCursor(0,1);
  lcd.print("AFTER 5SEC OFF");
  delay(5000);
  lcd.noBacklight();
  delay(3000);
  lcd.clear();
 
  //display on/off
  lcd.backlight();
  lcd.display();
  lcd.print("DISPLAY ON!");
  lcd.setCursor(0,1);
  lcd.print("AFTER 5SEC OFF");
  delay(5000);
  lcd.noDisplay();
  delay(3000);
  lcd.display();
  lcd.clear();
 
  //cursor
  lcd.print("CURSOR APPEAR");
  lcd.setCursor(0,1);  
  lcd.cursor();
  delay(5000);
  lcd.clear();
  
  //corsor move
  lcd.print("CURSOR MOVE");
  for (int i=0; i < 10 ; i++) {
    lcd.setCursor(i,1);
    delay(500);
  }
  lcd.clear();
 
  //blink cursor
  lcd.print("CURSOR BLINK");
  lcd.setCursor(5,1);  
  lcd.blink();
  delay(5000);
  lcd.noCursor();
  lcd.clear();
 
  //write function
  lcd.print("ASCII CODE WRITE");
  lcd.setCursor(0,1);  
  lcd.write(36);
  lcd.write(37);
  lcd.write(38);
  delay(5000);
  lcd.clear();  
 
  //scroll right, left
  lcd.print("SCROLL RIGHT");
  for (int positionCounter = 0; positionCounter < 16; positionCounter++
  {
    lcd.scrollDisplayRight();
    delay(500);
  }
  lcd.clear();
 
  lcd.print("     SCROLL LEFT");
  for (int positionCounter = 0; positionCounter < 16; positionCounter++
  {
    lcd.scrollDisplayLeft();
    delay(500);
  }
  lcd.clear();
 
  //autoscroll
  lcd.print("     AUTO SCROLL");
  lcd.setCursor(15,1);
  lcd.autoscroll();
  for (int i=0; i < 10 ; i++) {
    lcd.print(i);
    delay(500);
  }
  lcd.clear();
  
  lcd.init();
}
 
cs



## 실행화면 ##




다음엔 센서의 측정 결과를 시리얼 모니터가 아닌 LCD에 출력해 봐야겠다.



=================================================================



2016.03.26 추가내용

위의 Hello World 를 실행 시 첫 글자인 'H' 만 출력된다는 댓글이 있어 조사해보니 라이브러리 파일을 바꾸고 일부 소스를 바꾸니 정상적으로 표시가 된다. 무슨 영향인지 확실하게는 모르겠으나 위의 라이브러리에 포함되어 있던 Hello World 예제 파일의 Compatible with the Arduino IDE 1.0 라는 주석이 마음에 걸린다. 혹시 잘 안되는 분들은 아두이노와 LCD의 연결은 변함이 없고 아래 올리는 라이브러리 파일과 Hello World 예제를 입력하여 테스트 해 보길 바란다.


■ 라이브러리 파일

LiquidCrystal_V1.2.1.zip


■ Hello World 소스(16x2 LCD 모듈의 경우)

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
77
78
/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// www.4tronix.co.uk/arduino/sketches/LiquidCrystal_V1.2.1.zip
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>
 
/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 16 chars 2 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x2721045673, POSITIVE);  // Set the LCD I2C address
 
/*-----( Declare Variables )-----*/
//NONE
 
void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters
 
  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight
 
// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  
 
//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("5tronix I2C LCD"); // Print text on second line
  delay(8000);  
 
// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
/*  lcd.clear();
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("Use Serial Mon");
  lcd.setCursor(0,1);
  lcd.print("Type to display"); */
 
 
}/*--(end setup )---*/
 
 
void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      //lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        //lcd.write(Serial.read());
      }
    }
  }
 
}/* --(end main loop )-- */
 
 
/* ( THE END ) */
 
 
cs



■ Hello World 소스(20x4 LCD 모듈의 경우)

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
77
78
79
80
81
82
83
84
85
 
/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// www.4tronix.co.uk/arduino/sketches/LiquidCrystal_V1.2.1.zip
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>
 
/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x2721045673, POSITIVE);  // Set the LCD I2C address
 
/*-----( Declare Variables )-----*/
//NONE
 
void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters
 
  lcd.begin(20,4);   // initialize the lcd for 20 chars 4 lines, turn on backlight
 
// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  
 
//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("4tronix I2C LCD"); // Print text on 2nd Line
  delay(1000);
  lcd.setCursor(0,2);
  lcd.print("0123456789ABCDEFGHIJ"); //Print 20 characters on 3rd line
  delay(1000);
  lcd.setCursor(0,3);
  lcd.print("4th Line of Text");
  delay(8000);  
 
// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
/*  lcd.clear();
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("Use Serial Mon");
  lcd.setCursor(0,1);
  lcd.print("Type to display"); */
 
 
}/*--(end setup )---*/
 
 
void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      //lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        //lcd.write(Serial.read());
      }
    }
  }
 
}/* --(end main loop )-- */
 
 
/* ( THE END ) */
 
 
cs


반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. nonamed

    F Malpartida library를 참조하세요 한 문자만 출력되는 현상 해결했습니다.
    https://arduino-info.wikispaces.com/LCD-Blue-I2C

    2016.01.16 20:57 [ ADDR : EDIT/ DEL : REPLY ]
  3. 지식충

    저두 H만 뜹니다 ㅠㅠ 해결 방법좀요 ㅠㅠㅠ 다 영어라 해석이 ㅎㅎ

    2016.03.25 23:07 [ ADDR : EDIT/ DEL : REPLY ]
    • 글 아래에 해결방법 덧붙였습니다. 새로운 라이브러리로 한번 시도해 보세요. 예전엔 분명히 됐었는데 IDE 와의 호환문제가 아닌가 싶네요. IDE 구버전 쓰는 분들도 있을테니 위의 글은 그냥 남겨두겠습니다.

      2016.03.26 02:12 신고 [ ADDR : EDIT/ DEL ]
  4. 지식충

    데네브님 좋은정보 항상 감사하게 생각합니다.!!

    2016.03.26 16:36 [ ADDR : EDIT/ DEL : REPLY ]
  5. Lcd 1행에만 출력이 되는경우는 뭐가 문제일까요???
    셋커서를 1행 2행 따로 출렬하게 해놨는데요

    2016.05.23 16:40 [ ADDR : EDIT/ DEL : REPLY ]
    • 아래쪽 새로 추가된 내용으로 하셨나요? 거기에서 커서를 둘째줄로 옮기는 명령이 lcd.setCursor(0,1); 입니다.

      2016.05.23 17:22 신고 [ ADDR : EDIT/ DEL ]
  6. 어렵당

    저 아래쪽에있는 파일로 하고 컴파일러도 바꿔봣는데 안되요 ㅠㅠ

    아래에있는파일등록하면되는거 맞지요? 기존에있던 파일지워서 해보고 다해봤는데 안되요 ㅠㅠ I2c.h파일을찾을수 없다고뜨면서

    2016.08.22 14:02 [ ADDR : EDIT/ DEL : REPLY ]
    • 음... 글쎄요. xx.h 에러는 라이브러리를 못 불러올때 에러이긴 한데 라이브러리 재설치 또는 기존 것과 충돌이 없는지 점검이 필요해 보이네요.

      2016.08.22 14:07 신고 [ ADDR : EDIT/ DEL ]
  7. 어렵당

    노 서치 디렉토리라떠여 ㅠㅠ

    2016.08.22 14:11 [ ADDR : EDIT/ DEL : REPLY ]
  8. 어렵당


    C:\Users\koni\Documents\Arduino\sketch_aug22c\sketch_aug22c.ino:7:31: fatal error: LiquidCrystal_I2C.h: No such file or directory

    #include <LiquidCrystal_I2C.h>

    ^

    compilation terminated.

    exit status 1
    보드 Arduino/Genuino Uno 컴파일 에러

    이렇게떠영

    2016.08.22 14:12 [ ADDR : EDIT/ DEL : REPLY ]
    • 라이브러리 에러구만요... 위에 라이브러리 zip 파일 다운 받아서 압축풀고 아두이노 ide 설치폴더 하위에 libraries 폴더에 카피하고 ide 재실행하고 해 보세요

      2016.08.22 14:15 신고 [ ADDR : EDIT/ DEL ]
  9. 어렵당

    음.. 폴더안에있는걸 밖으로뺐더니 이번엔이렇게되버렷네요


    C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\I2CIO.cpp:35:26: fatal error: ../Wire/Wire.h: No such file or directory

    #include <../Wire/Wire.h>

    2016.08.22 14:20 [ ADDR : EDIT/ DEL : REPLY ]
    • 음... wire.h 는 아두이노 ide 설치시 포함되는 것인데 ide 삭제하시고 다시 설치해보세요 뭔가 문제가 있는듯

      2016.08.22 14:46 신고 [ ADDR : EDIT/ DEL ]
  10. 어렵당

    이제 잘되네요 아두이노 버전이 상위버전으로 설치한점이 문제였네요

    그리고 이중폴더되어있는 것을 밖으로 빼주면 해결이되네요

    2016.08.22 15:43 [ ADDR : EDIT/ DEL : REPLY ]
  11. 디바라기

    이 글을 보고 여러 문제들을 해결하고 갑니다. 좋은 글 감사드려요!

    2016.10.15 17:47 [ ADDR : EDIT/ DEL : REPLY ]
    • 넵 감사합니다

      2016.10.15 17:48 신고 [ ADDR : EDIT/ DEL ]
    • 디바라기

      그 짧은 시간 안에 문제가 생겨버렸네요 ㅠㅠ
      다름이 아니라 LCD 화면에 H만 표시되어서 주신 라이브러리로 업그레이드를 했습니다. 그런데 '어렵당'님처럼 같은 오류 메시지가 뜨는데 역시 삭제 후에 다시 시도해보는 게 좋으려나요?
      IDE를 구버전으로 받는다면 몇이 좋을까요?

      2016.10.15 18:27 [ ADDR : EDIT/ DEL ]
    • 1.0 대 버전으로 해보세요

      2016.10.15 19:37 신고 [ ADDR : EDIT/ DEL ]
    • 디바라기

      덕분에 오류 잘 해결되었습니다.
      늦었지만 정말 감사드립니다.

      2016.11.07 01:51 [ ADDR : EDIT/ DEL ]
  12. 탐구생활

    H만 찍히는 경우

    구글링 해서 찾았는데요. LiquidCrystal_I2C.cpp 에서

    inline size_t LiquidCrystal_I2C::write(uint8_t value) {
    send(value, Rs);
    return 0;
    }

    return 0 부분을 return 1로 바꿔주니 전 해결됐네요. 최신 아두이노 IDE에서 작동됩니다.

    아래 링크에서 참고했습니다. bperrybap 이란 사람이 쓴 댓글입니다.

    http://forum.arduino.cc/index.php?topic=361411.0

    2017.05.09 03:46 [ ADDR : EDIT/ DEL : REPLY ]
  13. 탐구생활

    대네브 님의 블로그가 아두이노 관련 좋은 포스트가 많아 도움이 많이 되고 있습니다. 감사합니다.

    2017.05.09 15:12 [ ADDR : EDIT/ DEL : REPLY ]
  14. 시즈

    아무리해도 LCD에 글씨가 안떠서 2시간동안 해맸는데 contrast 조절하니까 바로 뜨네요 정말 감사합니다..

    2017.05.20 19:56 [ ADDR : EDIT/ DEL : REPLY ]
  15. 시즈

    근데 LCD모듈에 백라이트가 안켜지고 글씨만 뜨네요.. 위에 있는 소스 그대로 사용했는데 말이죠 ㅠㅠ 부품의 결함일까요?

    2017.05.20 20:12 [ ADDR : EDIT/ DEL : REPLY ]
    • 음... 글씨가 보인다는게 백라이트가 켜진겁니다. 백라이트가 안켜지면 글씨도 안보여요...

      2017.05.20 22:06 신고 [ ADDR : EDIT/ DEL ]
  16. 시즈

    글씨는 보이는데 파란불빛이라고 해야하는지 그게 안켜지네요ㅠㅠ

    2017.05.20 22:49 [ ADDR : EDIT/ DEL : REPLY ]
  17. ㅇ아ㅏ앙아아아아아아아 어제 하루종일 H만 나와서 고민했는데 이 글에 댓글을 이제야 봐버렸어 ㅠㅠㅠ 나만 그런게아니였구나

    2017.11.26 10:54 [ ADDR : EDIT/ DEL : REPLY ]
    • 그래서 이미 오래전에 추가내용을 올렸고 글의 서두에 밝혔습니다만...

      2017.11.27 20:14 신고 [ ADDR : EDIT/ DEL ]
  18. 16 x 2와 20 x 4의 차이는 어떻게 구별하나요?

    2018.04.23 09:53 [ ADDR : EDIT/ DEL : REPLY ]
  19. 박성준

    제가 질문을 잘못 올렸네여~
    차이가 아니라 16 x 2와 20 x 4 LCD의 부품을
    외관상으로 구별하는 방법 물어본다는게 질문을
    잘못 올렸네여~~

    2018.04.23 15:51 [ ADDR : EDIT/ DEL : REPLY ]
  20. 박성준

    LCD Shield를 Fritzing에서 그리려면 어떻게 해야하나여?

    2018.04.25 14:33 [ ADDR : EDIT/ DEL : REPLY ]
    • 프릿징 부품이 없으면 구글링해서 직접 찾으셔야 해요... 직접 찾아서 part import

      2018.04.25 15:21 신고 [ ADDR : EDIT/ DEL ]
  21. ㅇㅇㅈ

    라이브러리 이름 LiquidCrystal이 이미 존재합니다라고 뜨는데 아무리 찾아도 같은 이름의 라이브러리가 없을 때는 어떻게 해야하나요 ㅠㅠ?

    2019.11.08 18:55 [ ADDR : EDIT/ DEL : REPLY ]