온습도 센서(DHT-11)

온습도 센서 DHT-11

라이브러리 추가

공식 사이트에서 라이브러리를 다운로드받는다.

스케치라이브러리 포함하기ZIP 라이브러리 추가하기를 눌러 다운로드받은 압축파일을 선택한다.

또는 라이브러리 관리에서 DHT11을 검색하여 다운로드한다.

결선도

GND to GND
DATA to DIGITAL-PIN-2 또는 A0
VCC to 5V

샘플 코드

예제에서 DHT_unified_sensor를 선택하여 생성한다. 연결된 핀번호와 DHT_TYPE만 설정하면 예제는 정상적으로 작동한다.

설명을 수정한 예제는 다음과 같다.

//include는 자바의 import처럼 필요한 요소들을 미리 준비시키는 역할을 수행
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

//define은 매크로 설정을 수행
// - #define A B 라고 작성하면 프로그램 컴파일 직전에 A를 B로 바꾸라는 뜻(찾아 바꾸기)
#define DHTPIN A0     // DHT센서의 출력값을 받아들일 입력핀(디지털,아날로그 모두 가능)

//센서 유형 설정 매크로
#define DHTTYPE DHT11

//dht 센서 제어 객체
DHT_Unified dht(DHTPIN, DHTTYPE);//자바였다면 DHT-Unified dht = new DHT_Unified(DHTPIN, DHTTYPE);

//시간 지연 값
uint32_t delayMS;

void setup() {
  //출력을 위한 시리얼 준비
  Serial.begin(9600);
  
  //DHT-11 센서 준비
  dht.begin();

  //F() 매크로를 사용하면 문자열이 Flash memory 에 저장된다.(아두이노는 Flash memory가 일반 메모리보다 크다)
  Serial.println(F("DHTxx Unified Sensor Example"));

  //온도센서 정보를 얻어와서 출력
  // - &가 변수 앞에 작성되면 해당하는 변수의 "주소"를 말한다.
  // - C언어에서는 "참조" 개념 대신 "주소"를 이용하여 직접 접근하여 설정하는 방식을 사용함
  // - 만약 자바였다면 아래 코드는 다음과 같았을 것...
  // - sensor_t sensor = dht.temperature().getSensor();
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);

  //온도센서 정보 출력
  Serial.println(F("------------------------------------"));
  Serial.println(F("Temperature Sensor"));
  Serial.print  (F("Sensor Type: ")); 
  Serial.println(sensor.name);
  Serial.print  (F("Driver Ver:  ")); 
  Serial.println(sensor.version);
  Serial.print  (F("Unique ID:   ")); 
  Serial.println(sensor.sensor_id);
  Serial.print  (F("Max Value:   ")); 
  Serial.print(sensor.max_value); 
  Serial.println(F("°C"));
  Serial.print  (F("Min Value:   ")); 
  Serial.print(sensor.min_value); 
  Serial.println(F("°C"));
  Serial.print  (F("Resolution:  ")); 
  Serial.print(sensor.resolution); 
  Serial.println(F("°C"));
  Serial.println(F("------------------------------------"));
  
  // 습도 센서 정보 출력
  // - sensor = dht.humidity().getSensor();
  dht.humidity().getSensor(&sensor);
  
  Serial.println(F("Humidity Sensor"));
  Serial.print  (F("Sensor Type: ")); 
  Serial.println(sensor.name);
  Serial.print  (F("Driver Ver:  ")); 
  Serial.println(sensor.version);
  Serial.print  (F("Unique ID:   ")); 
  Serial.println(sensor.sensor_id);
  Serial.print  (F("Max Value:   ")); 
  Serial.print(sensor.max_value); 
  Serial.println(F("%"));
  Serial.print  (F("Min Value:   ")); 
  Serial.print(sensor.min_value); 
  Serial.println(F("%"));
  Serial.print  (F("Resolution:  ")); 
  Serial.print(sensor.resolution); 
  Serial.println(F("%"));
  Serial.println(F("------------------------------------"));
  
  //sensor의 최소딜레이 / 1000만큼 지연시간을 설정(임의로 설정도 가능)
  delayMS = sensor.min_delay / 1000;
}


void loop() {
  //미리 설정해둔 지연시간만큼 대기
  delay(delayMS);
  
  //온도 측정 이벤트를 확인하여 출력이 가능하다면 출력을 수행한다.
  //- sensors_event_t event = dht.temperature().getEvent();
  sensors_event_t event;
  dht.temperature().getEvent(&event);

  //측정결과가 숫자가 아니라면 오류메세지를 출력(센서고장,회로이상)
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  //측정결과가 숫자라면 섭씨온도로 출력
  else {
    Serial.print(F("Temperature: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }
  
  //습도도 동일하게 구하여 출력
  // - event = dht.humidity().getEvent();
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Humidity: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
  }
}

컴파일

Ctrl+R 또는 스케치 메뉴의 확인/컴파일을 눌러 컴파일을 진행한다.

업로드

Ctrl+U 또는 스케치 메뉴의 업로드를 눌러 업로드를 진행한다.

실행 결과

온습도 정보가 불러와진다.

Last updated