반응형

※ 아래의 라이브러리와 소스를 이용하면 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


반응형

+ Recent posts