ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노 레시피 : 온습도를 LCD로 출력하기 - 초중급편
    아두이노 레시피 2025. 2. 24. 18:25

    # Recipe 12. LCD 응용하기

    오늘은 이걸 해보죠! by arduinochef

    안녕하세요~ 아두이노 셰프입니다. 봄비가 내릴 줄 알았는데 태풍급 비가 쏟아진다고 하네요... 따뜻한 봄의 정취 속에서 일하고 싶었는데 아쉽네요ㅠㅠ 여러분의 주말계획은 어떠신가요? 전 이번 주말 동안 프로젝트 레시피를 써보려고 해요. 센서, 모듈 하나하나를 알아가는 것도 중요하지만 그 재료들이 서로 어떻게 어울리는지 아는 것도 중요하니까요~ 첫출발은 온습도센서의 데이터를 LCD에 출력해 볼 거예요. (이거 은근 유용하니까) 저의 템플릿, 잘 활용해 보세요!

    라이브러리가 이미 있다고 가정하고 진행합니다.

    만약 라이브러리 설치법이나 각 재료의 사용법이 궁금하신 분들은

    이전 'LCD기초 편'과 '온습도센서 기초 편' 포스팅을 참고해 주세요!

    오늘의 재료 Ingredient


    <메인 재료>

    온습도센서(모델명 : DHT11)

    I2C_LCD 모듈(16x2)

     

    <그 외 재료>

    아두이노 우노

    브레드보드

    암-수 케이블(4개)

    수-수 케이블(5개)


    메이킹 방법 Steps

    Step 1. 선 연결하기 Wiring

    a. 온습도 센서의 S는 아두이노의 D2번 핀에,

    b. LCD 모듈의 SCL은 아두이노의 A5번 핀에,

    c. LCD 모듈의 SDA는 아두이노의 A4번 핀에,

    d. 나머지 각각의 전원(+,-)들은 브레드보드로 연결해 주세요.

    (음.. 브레드보드 사용법을 한 번 다룰 필요가 있겠군요)

    (그림을 참고해 주세요!)

    - - - - - - - - - -

    Step 2. 아두이노 코드 Code review

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

     

    // LCD를 제어하기 위해서 라이브러리를 추가해줄게요.
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    #include <SimpleDHT.h> //DHT11을 사용하게 해주는 코드모음(라이브러리)을 가져올게요.
    
    
    LiquidCrystal_I2C lcd(0x3F, 16, 2);//만약 코드가 동작하지 않는다면 LCD주소를 바꿔보세요(LCD주소는 0x27, 0x20, 0x3F 중 하나에요.)
    int pinDHT11 = 2; // pinDHT11이라는 변수를 만들고 2라는 값을 설정할게요. '2'대신 pinDHT11 이라고 선언할게요.
    SimpleDHT11 dht11(pinDHT11); //SimpleDHT11 라이브러리에서 제공하는 클래스로 dht11이라는 객체를 생성하는거에요.
    //아직 이해하지 못해도 좋아요~
    
    void setup() {//여기있는 코드는 한번만 실행되요.
      lcd.init(); //LCD를 초기화 할게요.
      lcd.backlight(); //LCD는 그자체로 빛을 못내니까, 백라이트를 켜줍니다.
    }
    
    
    void loop() { //setup()이 한번 실행되고 나면, 여기있는 코드가 반복실행됩니다.
      //이 코드들은 센서의 값을 읽도록 처리하는 코드들이에요. 아직은 각각의 뜻을 다 몰라도 돼요. 그냥 그렇구나 하고 넘어갈게요.
      //------------------------------
      byte temperature = 0; //1바이트 크기의 temperature변수를 생성하고 0으로 초기화한다.
      byte humidity = 0; //1바이트 크기의 humidity변수를 생성하고 0으로 초기화한다.
      int err = SimpleDHTErrSuccess; //err라는 이름의 정수형변수를 선언하고 라이브러리의 SimpleDHTErrSuccess 라는 상태값을 할당한다.
      if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { //전달한 매개변수가 NULL로 반환되었다면 에러코드를 출력하여 처리한다.
        Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err)); //에러코드 출력
        Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000); //에러코드 출력
        return; //센서가 에러상태라면 코드를 더 이상 실행하지 않고 계속 성공할때까지 계속 에러처리를 반복한다.
      }
      //------------------------------
      //너무 어렵죠~? 괜찮아요 몰라도 돼요.ㅎㅎㅎ (그냥 혹시 궁금한 친구들을 위해 적어봤어요 >.<)
    
        // 자, 이제 값을 출력해보죠.
        lcd.setCursor(0,0); // 0번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("H : ");  // 습도값은 H로 표시할게요.
        lcd.setCursor(4,0); // 0번째 줄 4번째 셀부터 입력하게 합니다.
        lcd.print((int)humidity); // 'H'옆에 습도값을 출력할게요.
        lcd.setCursor(6,0); //0번째 줄 6번째 셀부터 입력하게 합니다.
        lcd.print("%"); //%로 포화도를 표현할게요.
        
        lcd.setCursor(8,0); // 0번째 줄 8번째 셀부터 입력하게 합니다.
        lcd.print("T : "); //온도값은 T로 표시할게요.
        lcd.setCursor(12,0); //0번째 줄 12번째 셀부터 입력하게 합니다.
        lcd.println((int)temperature); //'T'옆에 온도값을 표시할게요.
        lcd.setCursor(14,0); //0번째 줄 14번째 셀부터 입력하게 합니다.
        lcd.print("C "); //C로 섭씨를 표현할게요.
        
    
        delay(3000); //3초간 기다릴게요.
    }

    Step 3. 동작시키기 Working

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

    ● 입김을 불거나, 불을 가까이 가져가 보세요. LCD의 표시된 값들이 바뀌나요?


    오늘의 레시피는 여기까지입니다~ 프로젝트는 과학시즈닝이 없습니다.

    센서, 모듈의 사용법과 원리가 궁금하신 분들은 기초 편 포스팅을 참고해 주세요~


    코드의 동작 알고리즘

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

    알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.

    코드가 어떻게 동작되는지 알아볼까요?

    알고리즘은 온습도센서를 다뤘을 때와 같습니다.

    "읽고 출력한다."

    그때는 시리얼모니터로 출력했다면

    이번엔 LCD로 출력했다는 차이 밖에 없습니다.

    Serial.print대신 lcd.print를 쓴 거죠.

    대신 LCD는 표처럼

    글자별로 출력위치를 정해줘야 하니까

    (16칸 두줄 밖에 없잖아요ㅎ)

    setCursor함수로

    각각의 글자수가 표시될 위치를 정해주었어요.

    온습도레시피와 LCD레시피를 이미 했다면,

    “에이 이게 다야?”라고 생각할 수 있어요.

    예, 이게 답니다...

    (OLED면 모를까...)

    LCD를 응용하는 건 진짜 이거면 되거든요...ㅋ

    이제 원하는 프로젝트에 응용할 수 있나요?

     

Designed by Tistory.