ABOUT ME

어린아이부터 전문쉐프까지. 모두를 위한 주방처럼, 코딩 배우는 모든 이들을 위한 부엌입니다.

Today
Yesterday
Total
  • 아두이노 레시피 : LCD 모니터 - 기본편
    아두이노 레시피 2025. 2. 24. 15:22

    # Recipe 11. I2C LCD

    photo by circuitgeeks

    안녕하세요~ 아두이노셰프입니다. 오늘은 LCD를 다뤄볼까 해요. 지금까지의 센서레시피들이 모두 시리얼모니터에서만 값들을 출력해서 뭔가 아쉬웠죠? 컴퓨터 없이 센서를 쓰고 싶었는데 말이죠ㅠㅠ 그런 분들을 위해, 아주 쉽게 그리고 자세하게 LCD 사용법을 파헤쳐볼까 합니다. 기본적으로 LCD의 선연결은 꽤 복잡해요. 그래서 오늘은 실용편인만큼, I2C 모듈이 들어간 LCD를 사용해 볼 겁니다. 자 바로 시작해 보죠.

    오늘의 재료 Ingredient


     

    <메인 재료>

    I2C LCD 모듈 (16x2)

    <그 외 재료>

    아두이노 우노

    암-수 점퍼케이블(4개)


    메이킹 방법 Steps

    Step 1. 선 연결하기 Wiring

    a. LCD의 GND핀은 아두이노의 GND에,

    b. LCD의 VCC핀은 아두이노의 5V에,

    c. LCD의 SDA핀은 아두이노의 A4핀에,

    d. LCD의 SCL핀은 아두이노의 A5핀에 연결해 주세요.

    - - - - - - - - - -

    Step 2. 라이브러리 포함하기 pre setting

    코드를 동작시키려면 라이브러리를 설치해줘야 해요.

    Sketch -> Include Library -> Manage Libraries에 들어가서 라이브러리 매니저를 실행해 줍니다.

    검색창에 liquidcrystal i2c를 검색해 주시고 Marco Schwartz 가 만든 라이브러리를 설치해 주세요.

    (밑으로 내리다 보면 있을 거예요.)

    이제 모든 준비가 끝났으니 코드를 실행시켜 볼까요?

    Step 3. 아두이노 코드 Code review

    여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ

    // LCD를 제어하기 위해서 라이브러리를 추가해줄게요.
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    
    
    LiquidCrystal_I2C lcd(0x27, 16, 2);//만약 코드가 동작하지 않는다면 LCD주소를 바꿔보세요(LCD주소는 0x27, 0x20, 0x3F 중 하나에요.)
    //의미는 "0x27 I2C 주소를 가지고 있는 16x2 LCD객체를 생성한다" 인데요.
    //그냥 라이브러리에게 "내가 쓸 LCD는 가로16칸, 세로2줄짜리 LCD고, 너가 I2C 통신을 할때의 주소는 0x27야" 라고 알려준다고 생각해도 돼요~
    //(같은 말인가?ㅋㅋㅋㅋ >.<)
    
    void setup() {//여기있는 코드는 한번만 실행되요.
      lcd.init(); //LCD를 초기화 할게요.
      lcd.backlight(); //LCD는 그자체로 빛을 못내니까, 백라이트를 켜줍니다.
    }
    
    
    void loop() { //setup()이 한번 실행되고 나면, 여기있는 코드가 반복실행됩니다.
        lcd.setCursor(0,0);           // 0번째 줄 0번째 셀부터 입력하게 합니다. = lcd의 첫째줄 첫번째 칸부터 글자를 출력할거에요.
        lcd.print("NICE TO MEET YOU");       // 문구를 출력합니다. 
        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다. = lcd의 둘째줄 첫번째 칸부터 글자를 출력할거에요.
        lcd.print("I'm arduinochef");     // 문구를 출력합니다.
        delay(3000); //3초간 기다릴게요.
        lcd.clear(); //다음 글자출력을 위해 출력된 문구를 지웁니다.
    
        lcd.setCursor(0,0);           // 0번째 줄 0번째 셀부터 입력하게 합니다. = lcd의 첫째줄 첫번째 칸부터 글자를 출력할거에요.
        lcd.print("Have a Good day!");       // 문구를 출력합니다. 
        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다. = lcd의 둘째줄 첫번째 칸부터 글자를 출력할거에요.
        lcd.print("Awesome");     // 문구를 출력합니다.
        delay(3000); //3초간 기다릴게요.
        lcd.clear(); //다음 글자출력을 위해 출력된 문구를 지웁니다.
        
    }

     

    Step 4. 동작시키기 Working

    ● 코드를 아두이노 우노에 업로드해 주세요.

    ● 문구가 3초 주기로 바뀔 거예요.

    ● 여러분이 원하는 문구를 출력해 보세요~(영어로 해야 돼요)

    Q. LCD에 글자가 안 나타나요ㅠㅠ

    크게 두 가지 이유가 있어요.

    첫째, LCD뒤의 가변저항을 돌려주세요.

    글자의 명암비를 조절해 주어야 뚜렷하게 출력된답니다. 십자드라이버로 가변저항을 돌려서 글자 명암비를 맞춰주세요~

    둘째, LCD의 주소가 잘못됐을 수 있어요.

    I2C LCD는 아두이노와 I2C통신을 하는데, 이때 정확한 주소를 지정해 주어야 통신이 가능해요.

    만약 명암비를 조절했는데도 출력이 안된다면, LCD주소를 바꿔보세요.(LCD주소는 0x27, 0x20, 0x3 F 중 하나예요.)

    LiquidCrystal_I2C lcd(0x27, 16, 2);

    코드의 LiquidCrystal_I2C lcd(0x27, 16, 2); 부분 중 '0x27'를 바꾸면 돼요.

     


    오늘의 레시피는 여기까지입니다~ 더 깊은 맛을 원하시는 분은 아래 과학시즈닝을 참고해 주세요!


    과학으로 양념하기” Seasoning

    I2C_LCD에 대한 과학적 원리와 세부내용으로 레시피에 더 깊은 맛을 넣어봅시다.

    - - - - - - - - - -

    LCD에 대하여

    과학원리

    LCD(liquid crystal display)는 액정 디스플레이를 말해요.

    (이걸 알아야 되나? 싶지만 지금은 과학시간이잖아요ㅎ)

    자 쉽게 설명해 보죠.

    액정(液晶, Liquid Crystal)이란

    액체와 고체의 성질을 함께 가지고 있는 물질로,

    고체의 결정이 갖는 규칙성과 액체의 성질인 유동성을

    모두 지닌 물질이라는 뜻에서 액체결정, 줄여서 액정이라고 부릅니다.

    (사전에서 그러더라고요.)

    전기신호로 결정구조를 바꿀 수 있는 친구예요.

    즉, 이 결정을 통과하는 빛을 통제할 수 있는 거죠.

    그럼 액정을 어떻게 활용하길래

    디스플레이의 핵심 소재로 활용할 수 있을까요?

    기본 원리는 빛의 방향성에 숨어 있습니다.

    액정은 그 자체로 빛을 내지 못해서

    뒤에 백라이트처럼 광원을 필요로 해요.

    기본적으로 빛은 특정한 방향성 없이

    사방으로 뻗어나가는데요.

    편광필름으로 빛의 방향을 만들고

    액정으로 빛의 방향을 통제해서

    원하는 빛의 통과를 조절합니다.

    그렇게 빛이 통과하지 못한 곳은 검은색이 되고

    이게 모여 글자가 된답니다.

    액정이 필터역할을 해주는 거예요.

    원하는 걸 통과시킬 수 있는 필터~

    아후... 어렵네요 그냥 그런가 보다 하는 거죠 뭐..ㅋ

    동작원리

    원래 이 LCD모듈은 16개의 핀으로

    LCD제어신호, 출력할 데이터신호, 밝기 신호 등

    여러 신호들을 제어해야 하는데요.

    신호가 늘면 늘수록 선도 늘어나는 법이죠...

    그래서 이 여러 개의 신호를

    하나의 신호로 통합할 필요가 있는데

    이때 사용되는 통신규칙을 I2C라고 생각하시면 돼요.

    I2C를 살짝 소개하자면

    I2C, (Inter-Integrated Circuit)의 약자로

    직역하면 ‘내부통합회로’ 정도가 되겠네요.

    스마트폰 내부의 모습인데요.

    여기 있는 이 수많은 내부의 칩들은 개별적으로 동작하는 걸까요?

    아니겠죠. 서로 같이 일해서 스마트폰의 기능을 구현할 거예요.

    이때 서로 같이 일하려면

    IC칩들끼리 대화할 수단이 필요하겠죠?

    이 수단 중 하나가 I2C라고 생각하시면 될 거 같아요.

    여러 기기들과 소통을 해야 돼서

    각 기기별로 주소가 지정되어 있어요.

    그래서 코드에서 LCD의 주소를 명시해 준 겁니다!

    정리하면

    "LCD와 아두이노가 여러 신호를 주고받을 때 I2C라는 통신규칙을 사용한다."

    (아두이노의 기본 I2C핀은 A4와 A5번으로 고정되어 있답니다~)

    과학시간 끝!

    - - - - - - - - - -

    코드의 동작 알고리즘

    (주석을 참고해 주세요.)

    우리가 사용하는 LCD는 16X2 I2C LCD라고 불러요.

    16X2는 ‘가로 16칸, 세로 2줄’이라는 뜻이에요.

    1줄당 글자 16개를 쓸 수 있고 이게 2줄 있는 거죠.

    LCD를 표라고 생각하면 쉬워요.

    코드를 보면 setCursor()라는 함수가 있죠?

    커서(Cursor). 말 그대로

    어디부터 글자를 출력할 건지 시작위치를 정하는 함수예요.

    칸, 줄 순으로 적으면 됩니다.

    만약 (0,1)이라고 하면

    1번째 줄 0번째 칸부터 글자를 출력하라는 뜻이에요.

    왜 0번째 칸, 줄이라고 표현하냐면요...

    컴퓨터가 숫자를 셀 때, 1부터 세지 않아요.

    0부터 센답니다.ㅎㅎ

    그래서 0이라고 해야

    실제로는 LCD의 첫 번째 칸 혹은 첫 번째 줄이에요.

    - - - - - - - - - -

    모듈요약 카드

    이름 : I2C_LCD 모듈

    설명 : 원하는 글자 출력이 가능한 16X2 크기의 LCD이다. I2C통신을 사용하며 동작을 위해 명암비, I2C주소를 조정해주어야 한다.

    모듈의 구성 : GND, VCC, SDA, SCL 핀으로 구성되어 있다.

Designed by Tistory.