본문 바로가기

ESP32

ESP32 DHT11 DHT22 온도 및 습도 센서 모니터 회로와 코드

반응형

 

Arduino IDE를 사용한 DHT11/DHT22 온도 및 습도 센서가 있는 ESP32

 

이 튜토리얼은 Arduino IDE를 사용하여 ESP32와 함께 DHT11 및 DHT22 온도 및 습도 센서를 사용하는 방법을 보여줍니다. 이러한 센서, 핀아웃, 배선 다이어그램, 마지막으로 Arduino 스케치에 대한 간단한 소개를 살펴보겠습니다.

 

 

Arduino IDE를 사용한 DHT11 DHT22 온도 및 습도 센서가 있는 ESP32

 

ESP32 또는 ESP8266 보드를 사용하여 웹 서버에 온도 및 습도 판독값을 표시하는 방법을 알아보세요.

 

  • Arduino IDE를 사용한 ESP32 DHT11/DHT22 웹 서버
  • Arduino IDE를 사용한 ESP8266 DHT11/DHT22 웹 서버

 

DHT11 및 DHT22 온도 및 습도 센서

 

DHT11 및 DHT22 센서는 온도와 상대 습도를 측정하는 데 사용됩니다. 이 센서는 제작자와 전자 취미인들에게 매우 인기가 있습니다.

 

Arduino IDE를 사용한 DHT11/DHT22 온도 및 습도 센서

 

이 센서에는 아날로그에서 디지털로 변환하고 온도와 습도를 디지털 신호로 내보내는 칩이 들어 있습니다. 따라서 모든 마이크로컨트롤러에서 사용하기 매우 쉽습니다.

 

Arduino 보드에서 이러한 센서를 사용하려는 경우 다음 튜토리얼을 읽어보세요.

 

Arduino를 사용한 DHT11/DHT22 습도 및 온도 센서 가이드

Arduno를 사용한 DHT11 온도 습도 센서

 

DHT11 대 DHT22

 

DHT11과 DHT22는 매우 유사하지만 사양이 다릅니다. 다음 표에서는 DHT11 및 DHT22 온도 및 습도 센서의 가장 중요한 사양을 비교합니다. 이러한 센서에 대한 보다 심층적인 분석은 센서의 데이터시트를 확인하세요.

 

  DHT11 DHT22
Temperature range 0 to 50 ºC +/-2 ºC -40 to 80 ºC +/-0.5ºC
Humidity range 20 to 90% +/-5% 0 to 100% +/-2%
Resolution Humidity: 1%
Temperature: 1ºC
Humidity: 0.1%
Temperature: 0.1ºC
Operating voltage 3 – 5.5 V DC 3 – 6 V DC
Current supply 0.5 – 2.5 mA 1 – 1.5 mA
Sampling period 1 second 2 seconds
Price $1 to $5 $4 to $10
Where to buy Check prices Check prices

 

 

DHT22 센서는 분해능이 더 좋고 온도 및 습도 측정 범위가 더 넓습니다. 그러나 약간 더 비싸고 2초 간격으로만 판독값을 요청할 수 있습니다.

 

DHT11은 범위가 작고 정확도가 떨어집니다. 그러나 1초마다 센서 판독값을 요청할 수 있습니다. 또한 약간 더 저렴합니다.

 

차이점에도 불구하고 비슷한 방식으로 작동하며 동일한 코드를 사용하여 온도와 습도를 읽을 수 있습니다. 코드에서 사용하는 센서 유형을 선택하기만 하면 됩니다.

 

DHT 핀아웃

 

DHT 센서에는 다음 그림과 같이 4개의 핀이 있습니다. 그러나 브레이크아웃 보드에서 DHT 센서를 구입하면 핀이 3개만 있고 핀 2에 내부 풀업 저항이 있습니다.

 

Arduino IDE를 사용한 DHT22 온도 및 습도 센서

 

다음 표는 DHT22/DHT11 핀아웃을 보여줍니다. 센서를 마주보고 있을 때 핀 번호는 왼쪽에서 오른쪽으로 1부터 시작합니다.

 

DHT pin Connect to
1 3.3V
2 Any digital GPIO; also connect a 10k Ohm pull-up resistor
3 Don’t connect
4 GND

 

필요한 부품

 

이 튜토리얼을 따르려면 DHT11 또는 DHT22 온도 센서를 ESP32에 연결해야 합니다. 10kΩ 풀업 저항을 사용해야 합니다.

 

다음은 회로를 만드는 데 필요한 부품 목록입니다.

 

  • ESP32(최고의 ESP32 개발 보드 읽기)
  • DHT11 또는 DHT22 온도 및 습도 센서
  • 10kΩ 저항
  • 브레드보드
  • 점퍼 와이어

 

이전 링크를 사용하거나 MakerAdvisor.com/tools로 바로 이동하여 프로젝트에 필요한 모든 부품을 최고의 가격으로 찾을 수 있습니다!

 

회로도

 

다음 회로도에 표시된 대로 DHT22 또는 DHT11 센서를 ESP32 개발 보드에 연결하세요.

 

 

Arduino IDE를 사용하여 DHT11/DHT22 온도 및 습도 센서가 있는 ESP32

 

이 예에서는 DHT 데이터 핀을 GPIO 4에 연결합니다. 그러나 다른 적합한 디지털 핀을 사용할 수 있습니다.

 

가이드를 통해 ESP32 GPIO를 사용하는 방법을 알아보세요. ESP32 핀아웃 참조: 어떤 GPIO 핀을 사용해야 합니까?

 

라이브러리 설치

 

DHT 센서에서 읽으려면 Adafruit의 DHT 라이브러리를 사용합니다. 이 라이브러리를 사용하려면 Adafruit Unified Sensor 라이브러리도 설치해야 합니다. 다음 단계에 따라 해당 라이브러리를 설치합니다.

 

Arduino IDE를 열고 Sketch > Include Library > Manage Libraries로 이동합니다. 라이브러리 관리자가 열립니다.

 

검색 상자에서 "DHT"를 검색하여 Adafruit의 DHT 라이브러리를 설치합니다.

 

Adafruit DHT 라이브러리 설치

 

Adafruit의 DHT 라이브러리를 설치한 후 검색 상자에 "Adafruit Unified Sensor"를 입력합니다. 아래로 스크롤하여 라이브러리를 찾아 설치합니다.

 

Adafruit Unified Sensor 드라이버 라이브러리 설치

 

라이브러리를 설치한 후 Arduino IDE를 다시 시작합니다.

 

ESP32 온도 및 습도 읽기 스케치

 

DHT 센서에서 온도와 습도를 읽으려면 Adafruit DHT 라이브러리를 기반으로 한 예를 사용합니다. 다음 코드를 Arduino

IDE에 복사합니다.

 

// Example testing sketch for various DHT humidity/temperature sensors written by ladyada
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include "DHT.h"

#define DHTPIN 4     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

 

코드 전체에 유용한 정보가 담긴 주석이 많이 있습니다. 따라서 주석을 살펴보는 것이 좋습니다. 계속 읽어서 코드 작동 방식을 알아보세요.

 

코드 작동 방식

 

먼저 DHT 라이브러리를 가져와야 합니다.

 

#include "DHT.h"

 

그런 다음 DHT 센서 데이터 핀이 연결된 디지털 핀을 정의합니다. 이 경우 GPIO 4에 연결됩니다.

 

#define DHTPIN 4 // DHT 센서에 연결된 디지털 핀

 

그런 다음 사용 중인 DHT 센서 유형을 선택해야 합니다. 라이브러리는 DHT11, DHT22, DHT21을 지원합니다. 사용 중인 센서 유형의 주석 처리를 해제하고 다른 모든 센서 유형의 주석 처리를 해제합니다. 이 경우 DHT22 센서를 사용합니다.

 

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

 

핀에 dht라는 DHT 객체를 만들고 이전에 지정한 센서 유형을 사용합니다.

 

DHT dht(DHTPIN, DHTTYPE);

 

setup()에서 Serial 디버깅을 9600의 전송 속도로 초기화하고 Serial Monitor에 메시지를 인쇄합니다.

 

Serial.begin(9600);

Serial.println(F("DHTxx test!"));

 

마지막으로 DHT 센서를 초기화합니다.

 

dht.begin();

 

loop()는 2000ms(2초) 지연으로 시작합니다. DHT22 최대 샘플링 기간이 2초이기 때문입니다. 따라서 2초마다 판독값을 얻을 수 있습니다.

 

delay(2000);

 

온도와 습도는 float 형식으로 반환됩니다. float 변수 h, t, f를 생성하여 습도, 섭씨 온도, 화씨 온도를 각각 저장합니다.

 

습도와 온도를 구하는 것은 아래와 같이 dht 객체에서 readHumidity() 및 readTemperature() 메서드를 사용하는 것만큼 쉽습니다.

 

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();

 

화씨 온도로 온도를 구하려면 true 매개변수를 readTemperature() 메서드에 인수로 전달해야 합니다.

 

float f = dht.readTemperature(true);

 

센서가 유효한 온도 및 습도 판독값을 반환했는지 확인하는 if 문도 있습니다.

 

if (isnan(h) || isnan(t) || isnan(f)) {
   Serial.println(F("Failed to read from DHT sensor!"));
   return;

 

 

습도와 온도를 얻은 후 라이브러리에는 열 지수를 계산하는 메서드가 있습니다. 아래와 같이 섭씨와 화씨로 열 지수를 얻을 수 있습니다.

 

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);

// 화씨로 열 지수 계산(기본값)

float hif = dht.computeHeatIndex(f, h);

// 섭씨로 열 지수 계산(isFahreheit = false)

float hic = dht.computeHeatIndex(t, h, false);

 

마지막으로 다음 명령으로 모든 판독값을 직렬 모니터에 인쇄합니다.

 

Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("%  Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F  Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));

 

데모

 

ESP32 보드에 코드를 업로드합니다. Arduino IDE 설정에서 올바른 보드와 COM 포트를 선택했는지 확인하세요.

 

코드를 업로드한 후, 시리얼 모니터를 9600의 전송 속도로 엽니다. 2초마다 시리얼 모니터에서 최신 온도 및 습도 판독값을 받아야 합니다.

 

ESP32 DHT11 DHT22 AM2302 AM2301 온도 습도 센서 읽기

 

 

문제 해결 - DHT 센서에서 읽기 실패

 

DHT11/DHT22 센서에서 온도 및 습도를 읽으려고 하는데 시리얼 모니터에 오류 메시지가 표시되면 다음 단계에 따라 센서를 작동시킬 수 있는지 확인합니다(또는 전담 DHT 문제 해결 가이드를 읽어보세요).

 

"DHT 센서에서 읽기 실패!" 또는 Nan 판독값

 

DHT 센서에서 "DHT 센서에서 읽기 실패!" 오류 메시지를 반환하거나 DHT 판독값이 "Nan"을 반환하는 경우:

 

해결된 문제 해결 DHT11 DHT22 AM2302 AM2301 DHT 센서에서 읽기 실패! 또는 Nan

 

다음 문제 해결 팁 중 하나를 시도해 보세요.

 

  • 배선: 전자 프로젝트를 빌드할 때는 배선이나 핀 할당을 다시 한 번 확인해야 합니다. 회로가 제대로 연결되었는지 확인하고 테스트한 후에도 여전히 작동하지 않으면 다음 문제 해결 팁을 계속 읽어 보세요.
  • 전원: DHT 센서의 작동 범위는 3V~5.5V(DHT11) 또는 3V~6V(DHT22)입니다. ESP32 3.3V 핀에서 센서에 전원을 공급하는 경우 경우에 따라 5V로 DHT에 전원을 공급하면 문제가 해결됩니다.
  • 불량 USB 포트 또는 USB 케이블: 때로는 PC USB 포트에서 직접 ESP32에 전원을 공급하는 것만으로는 충분하지 않습니다. 외부 전원으로 전원을 공급받는 USB 허브에 연결해 보세요. USB 케이블을 더 좋거나 짧은 것으로 교체하는 것도 도움이 될 수 있습니다. 충분한 전원을 공급하는 USB 포트가 있거나 좋은 USB 케이블을 사용하면 이 문제가 종종 해결됩니다.
  • 전원: 이전 팁에서 언급했듯이 ESP가 DHT 센서에서 제대로 읽을 수 있을 만큼 충분한 전원을 공급하지 못할 수 있습니다. 어떤 경우에는 더 많은 전류를 공급하는 전원으로 ESP에 전원을 공급해야 할 수도 있습니다.
  • 센서 유형: 프로젝트에 맞는 센서의 주석 처리를 해제/주석 처리했는지 다시 한 번 확인하세요. 이 프로젝트에서는 DHT22를 사용했습니다.

 

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

 

  • 샘플링 속도: DHT 센서는 판독값을 얻는 데 매우 느립니다(센서 판독값은 최대 2초가 걸릴 수 있음). 어떤 경우에는 판독값 사이의 시간을 늘리면 문제가 해결됩니다.
  • DHT 센서가 튀거나 고장났습니다. 안타깝게도 이러한 저렴한 센서는 때때로 완벽하게 괜찮아 보이지만 튀거나 고장났습니다. 따라서 올바른 회로와 코드를 조립하더라도 여전히 판독값을 얻지 못할 것입니다. 다른 센서를 사용하여 문제가 해결되는지 확인해 보세요.
  • 잘못된 통신 속도 또는 코드 업로드 실패: Arduino IDE 직렬 모니터에 아무것도 표시되지 않으면 올바른 통신 속도, COM 포트를 선택했는지 또는 코드를 성공적으로 업로드했는지 다시 확인하세요.

 

프로젝트를 빌드하는 동안 DHT와 유사한 문제를 경험했고, 항상 앞서 설명한 방법 중 하나를 따르면 해결되었습니다.

 

치명적인 오류: Adafruit_Sensor.h: 해당 파일 또는 디렉토리가 없습니다

 

코드를 컴파일하려고 할 때 발생하는 일반적인 오류도 있습니다. 다음 오류가 발생하는 경우:

 

치명적 오류: Adafruit_Sensor.h: 해당 파일 또는 디렉토리가 없습니다

 

fatal error: Adafruit_Sensor.h: No such file or directory 
#include <Adafruit_Sensor.h>

 

Adafruit Unified Sensor 드라이버 라이브러리를 설치해야 합니다. Arduino IDE에서 검색 상자에 "Adafruit Unified Sensor"를 입력하고 아래로 스크롤하여 라이브러리를 찾아 설치합니다.

 

Adafruit Unified Sensor 드라이버 라이브러리 설치

 

라이브러리를 설치한 후 Arduino IDE를 다시 시작하면 오류 메시지 없이 코드가 컴파일됩니다.

 

마무리

 

이 튜토리얼에서는 Arduino IDE와 ESP32를 사용하여 DHT11 또는 DHT22 센서에서 온도 및 습도 판독값을 얻는 방법을 알아보았습니다. Adafruit DHT 라이브러리를 사용하여 온도 및 습도 판독값을 얻는 것은 매우 간단합니다. DHT 객체에서 readTemperature() 및 readHumidity() 메서드를 사용하기만 하면 됩니다.

 

이제 이 프로젝트를 한 단계 더 발전시켜 스마트폰 브라우저를 사용하여 참조할 수 있는 웹 서버에 센서 판독값을 표시할 수 있습니다. ESP32로 웹 서버를 구축하여 센서 판독값을 표시하는 방법을 알아보세요. ESP32 DHT11/DHT22 웹 서버 - Arduino IDE를 사용한 온도 및 습도.

 

ESP32를 좋아하신다면 다음 리소스도 마음에 드실 수 있습니다.

 

Arduino IDE로 ESP32 배우기(eBook + 비디오 과정)

ESP32 웹 서버 - Arduino IDE

BME280이 있는 ESP32 웹 서버 - 미니 기상 관측소

20개 이상의 ESP32 프로젝트 및 튜토리얼

 

이 가이드가 도움이 되었기를 바랍니다.

 

읽어주셔서 감사합니다. 배움을 멈추지 마세요.

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^