ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노 레시피 : 온습도센서 사용하기 - 기본편
    아두이노 레시피 2025. 2. 23. 09:47

    # Recipe 7. 온습도 센서(DHT11) 모듈 / 기본 편

    온습도센서와 여러 센서(토양습도, 빗물감지, 조도)를 이용하여 만든 아두이노 기상관측기(WeatherStation)

    by AdrieSentosa (Instructables)

    안녕하세요~ 아두이노 셰프입니다. 지금쯤이면 한창 학교에서 친구들이 뭔가를 만들 시기인 듯해요. 그래서 조금 도움이 되고자, 기초 편은 잠시 제쳐두고 기본 편을 몇 개만 다뤄볼게요. 그 첫 번째는 온습도센서! 아마 수업에서 사용되는 센서 중 당연 탑 3안에 들걸요?ㅋㅋ 기상관측기, 교실 디지털 온습도계, 실험장치 환경센서 등 다양한 프로젝트에 응용가능한 요긴한 친구랍니다. 깊게 다루지는 않을게요. (그건 고급 편에서...) 친구들이 센서를 이용해 메이킹할 정도로만 해보죠. 그럼 온습도센서(DHT11) 시작하겠습니다!

    오늘의 재료 Ingredient


    <메인 재료>

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

    (제품에 따라 모양이 조금씩 다를 수 있어요. 상관없습니다~)

    <그 외 재료>

    아두이노 우노

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


    메이킹 방법 Steps

    Step 1. 선 연결하기 Wiring

    a. 센서의 S(시그널 핀)는 아두이노 D7번 핀에,

    b. 센서의 VIN(+)은 아두이노의 5V에,

    c. 센서의 GND(-)는 아두이노의 GND에 연결해 주세요.

    (제품에 따라 센서의 핀 배치가 그림과 다를 수 있어요!)

    - - - - - - - - - -

    Step 2. 라이브러리 설치하기 Code preparing

    코드를 동작하기 위해선 특정 라이브러리를 설치해야 돼요. 따라오실까요?

    how. 1

    'sketch' -> 'Include Library' -> 'Manage Libraries'에 들어가 주세요.(전 영어버전이라 이렇게 나와요ㅎ)

    how. 2

    검색창에 'dht11'이라고 검색해 주세요. 목록을 밑으로 내려보면 'SimpleDHT'가 있을 거예요.

    'Install'버튼을 눌러서 설치해 주세요. 이제 저의 코드를 사용할 수 있습니다~!

    - - - - - - - - - -

    how. 3

    메뉴창의 'file'-> Examples에 가면 여러분이 추가한 'SimpleDHT'에 대한 예제가 있어요.

    이 코드를 조금 수정해서 여러분의 코드를 만들었답니다~ 나중에 천천히 살펴보세요!

    Step 3. 아두이노 코드 Code review

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

    #include <SimpleDHT.h> //DHT11을 사용하게 해주는 코드모음(라이브러리)을 가져올게요.
    //이렇게 연결하라네요.
    // for DHT11, 
    //      VCC: 5V or 3V
    //      GND: GND
    //      DATA: 2
    int pinDHT11 = 2; // pinDHT11이라는 변수를 만들고 2라는 값을 설정할게요. '2'대신 pinDHT11 이라고 선언할게요.
    SimpleDHT11 dht11(pinDHT11); //SimpleDHT11 라이브러리에서 제공하는 클래스로 dht11이라는 객체를 생성하는거에요.
    //역시 아직은 몰라도 좋아요. 뜻만 설명하자면 센서를 동작할 수 있는 라이브러리의 코드를 여기 이 소스코드와 연결하는 코드랄까요;;
    //더 쉽게 얘기해볼까요? "센서의 시그널핀을 2번핀으로 사용하겠다." 끝!
    
    void setup() {
      Serial.begin(9600); //센서값을 모니터로 확인해야하니, Serial통신을 9600의 속도로 시작할게요.
      pinMode(LED_BUILTIN, OUTPUT); //내장된 LED도 사용하도록 OUTPUT모드로 설정하구요.
    }
    
    void loop() {
      // start working...
      Serial.println("================================="); //값이 계속 출력될텐데, 보기 좋게 구분선을 출력해보죠.
      Serial.println("Sample DHT11...");
      
      //이 코드들은 센서의 값을 읽도록 처리하는 코드들이에요. 아직은 각각의 뜻을 다 몰라도 돼요. 그냥 그렇구나 하고 넘어갈게요.
      //------------------------------
      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; //센서가 에러상태라면 코드를 더 이상 실행하지 않고 계속 성공할때까지 계속 에러처리를 반복한다.
      }
      //------------------------------
      //너무 어렵죠~? 괜찮아요 몰라도 돼요.ㅎㅎㅎ (그냥 혹시 궁금한 친구들을 위해 적어봤어요 >.<)
      
      Serial.print("Sample OK: "); //에러가 없다면 
      Serial.print((int)temperature); Serial.print(" *C, "); //시리얼 모니터에 온도('C)를 출력하고
      Serial.print((int)humidity); Serial.println(" H"); //시리얼 모니터에 습도(%)를 출력하라.
    
    
      //이제 이 센서로 간단하게 LED를 제어해보죠.
      if((int)temperature > 30 && (int)humidity > 50){ //&&는 C언어의 논리연산자인데요. 두 상태를 모두 만족해야 참이라는 뜻이에요.
        //즉 온도가 30이 넘고, 습도가 50이 넘어야 LED가 켜져요 
        digitalWrite(LED_BUILTIN,HIGH); //LED를 켜고
      }
      else{ //그게 아니라면
        digitalWrite(LED_BUILTIN,LOW); //LED를 끌게요.
      }
      
      // DHT11 sampling rate is 1HZ.
      delay(2000); //센서가 센싱하는데 1초정도 걸리기 때문에, 전체코드를 1.5초 이상의 텀으로 실행하는것을 권장해요.
    }

     

    Step 4. 동작시키기 Working

    ● 코드를 업로드해 주세요.(USB선은 뽑지 않고 유지합니다.)

    ● 오른쪽 상단의 시리얼모니터를 열어주세요. (아니면 메뉴창의 “Tools” → “Serial Monitor”로 들어가도 돼요.)

    ● 모니터에서 에러가 나지 않는다면 정상적으로 센싱이 시작될 거예요.

    ● 입김을 불거나, 라이터불꽃을 가까이 가져가보면서 주변 온습도를 바꿔보세요. 아두이노의 내장 LED가 어떻게 바뀌나요?


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


    과학으로 양념하기” Seasoning

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

    - - - - - - - - - -

    센서에 대하여

    과학원리

    토양습도센서를 기억하실지 모르겠어요.

    그때 "두 극 사이에 있는 토양의 수분함유량에 따라

    저항도가 달라진다"라고 했었는데요.

    오늘 이 온습도 센서는

    이 토양습도센서의 고급버전이라고 할 수 있어요.

    멋진 반도체기술이 적용되어 있거든요. (원리는 같아요)

    습도를 측정하는 부분은 두 개의 전극판과

    그 사이에 수분을 머금을 수 있는 반도체가 있어요.

    마치 토양을 사이에 둔 토양센서의 두 극처럼요.

    센서의 구조(습도측정 부분)

    이 수분을 머금는 반도체는

    수분함유량에 따라서 저항도가 달라집니다.

    많으면 저항도가 낮아져서 전기가 잘 통하고,

    낮으면 저항도가 높아져서 전기가 잘 안 통하거든요.

    막상 이렇게 살펴보니 센서도 별거 아니죠?

    동작원리

    두 전극판이 있다고 했죠?

    이 전극판에 전기를 흘려주어서

    반도체에 통과되는 전류량을 판단하는 것이

    기본적인 원리입니다.

    그래서 센서를 사용하면 조금 뜨거워져요.

    (얇은 금속판에 전류가 흐르니까요ㅎ)

    ‘변화하는 전기저항도를 측정한다’

    는 원리는 간단하지만

    이 센서는 습도를 측정하는 부분과,

    온도를 측정하는 부분이 합쳐진 복합센서랍니다.

    이름도 온습도잖아요ㅎ

    가만 보면 시그널핀이 한 개밖에 없죠?

    두 개의 측정된 데이터가 하나의 신호로 전송되거든요.

    그래서 이전 토양습도센서처럼 간단하게 읽지는 못하고

    신호를 해독(?)하는 과정이 필요해요.

    근데 이게 코드로는 어려우니까,

    우리는 남이 만들어놓은 코드(라이브러리)를 사용한 거고요ㅋㅋ

    - - - - - - - - - -

    코드의 동작 알고리즘

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

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

    (자세한 내용은 코드에 적어놓은 주석을 참고해 주세요~)

    절차는 전보다는 조금 복잡합니다.

    "센서가 센싱가능한 상태인지 확인한다." →

    "만약 아니라면 오류절차를 반복한다." →

    "에러가 없다면 읽은 데이터를 모니터에 출력한다." →

    "센서값이 조건에 부합한다면 LED를 켜고 아니면 꺼라"

    끝!

    오늘은 이벤트 느낌으로

    많이들 사용하는 온습도센서 사용하는 법을 다뤄봤어요.

    제 코드를 만약 응용하고 싶으면, 다른 건 안 건드리고

    IF문과 그 안의 코드만 바꾸면 되겠죠?

    여러분이 원하는 조건에,

    여러분이 원하는 결과로 만들어보세요~

    ’ 라이브러리’에 대한 내용은

    기초 편이 모두 끝나고 다뤄볼게요.

    오늘은 조금 어려웠는데, 어떠셨나요?

    여러분이 프로그래머가 아니니

    모든 코드를 이해할 필요는 없어요.

    다만, 알고리즘인 진행절차를 이해하고

    코드를 여러분이 원하는 대로 사용할 수 있게 되면 좋겠네요~

    - - - - - - - - - -

     

    센서요약 카드

    이름 : 온습도센서 (DHT11)

    설명 : 온도와 습도를 동시에 측정하는 센서이다. 측정을 위해 센서에 맞는 라이브러리 사용이 필요하다.

    센서의 구성 : S(시그널) 핀, GND, VIN으로 구성되어 있다.

Designed by Tistory.