# 온습도 센서(DHT-11)

## 온습도 센서 DHT-11

<div align="left"><img src="/files/-Mf5XlASVIKHMcxijFW4" alt=""></div>

### 라이브러리 추가

[공식 사이트](https://github.com/adafruit/DHT-sensor-library)에서 라이브러리를 다운로드받는다.

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

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

<div align="left"><img src="/files/-Mf5XpE5W3UycMbd8_tc" alt=""></div>

### 결선도

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

### 샘플 코드

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

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

```cpp
//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` 또는 스케치 메뉴의 `업로드`를 눌러 업로드를 진행한다.

### 실행 결과

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sysout.co.kr/base-language/arduino/arduino-control/temperature-and-humidity-sensor-dht-11.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
