Home IoT Hub Series · 03

[3편] 거실 온습도 센서 - DHT22 + D1 Mini로 첫 번째 센서 노드 만들기

[3편] 거실 온습도 센서 - DHT22 + D1 Mini로 첫 번째 센서 노드 만들기 대표 이미지

2편에서 두뇌를 완성했다. 이제 첫 번째 센서를 붙인다. 거실 온도와 습도를 찍어서 두뇌로 쏘는 작은 노드다. 이걸 만들고 나면 나머지 18개도 똑같은 패턴이다. 센서만 바꿔 끼우면 된다.

ESP8266 보드와 DHT11 온습도 센서를 연결한 실물 테스트 사진
실물 테스트 사진입니다. 사진 속 파란 센서는 DHT11 모듈입니다. 이 글의 기본 코드는 DHT22 기준이지만, DHT11도 같은 DHT 계열이라 VCC·DATA·GND 연결 흐름은 거의 같습니다. 실제 DHT11을 사용할 때는 코드의 DHTTYPEDHT11로 바꿔야 합니다.

준비물과 가격

부품수량개당 가격비고
Wemos D1 Mini (ESP8266)1개2,000원센서 노드 본체
DHT22 온습도 센서1개2,000원DHT11보다 정밀. 온도 ±0.5℃, 습도 ±2%
점퍼 와이어 (암-암)3개앞서 산 10개 묶음에서 쓴다
Micro USB 케이블 + 충전기1세트집에 굴러다니는 구형 충전기 재활용
합계4,000원(충전기·케이블 제외)

핀 연결

[3편] 거실 온습도 센서 - DHT22 + D1 Mini로 첫 번째 센서 노드 만들기 배선도

DHT22는 핀이 3개(혹은 4개)다. VCC, DATA, GND만 연결하면 된다.

센서/모듈보드 연결
VCC (1번 핀)3.3V
DATA (2번 핀)D1 (GPIO5)
GND (4번 핀)GND
DHT22 모듈에 따라 핀 순서가 다를 수 있다. 보드 앞면에 +, out, -라고 적혀 있으면 +가 VCC, out이 DATA, -가 GND다. 글씨가 안 보이면 센서 정면에서 왼쪽부터 VCC-DATA-NC-GND 순서인지 확인한다. NC는 아무것도 연결하지 않는 핀이다.

센서 노드는 어디에 연결하나

2편에서 만든 두뇌가 IoT_Hub_Net이라는 자체 Wi-Fi를 만들고 있었다. 이 센서 노드는 그 네트워크에 접속한다. 집 공유기가 아니라 두뇌가 만든 Wi-Fi에 붙는 거다. 그래서 집 공유기 부하도 없고, SSID/비밀번호도 우리가 정한 대로(IoT_Hub_Net / iothub1234) 고정되어 있다.

센서 노드가 데이터를 보내는 주소는 두뇌의 AP IP다. 2편 코드에서 WiFi.softAP()로 만든 쪽, 즉 192.168.1.1이다.

선행 작업: 라이브러리 설치

DHT22는 전용 라이브러리가 필요하다. Arduino IDE의 툴 → 라이브러리 관리에서 설치한다.

라이브러리검색어
DHT sensor libraryDHT sensor library
검색하면 DHT sensor library by Adafruit가 나온다. 이것만 설치하면 된다.

🚨 코드 넣기 전에 반드시!!

센서 노드는 따로 바꿀 Wi-Fi 정보가 없다. 두뇌의 AP(IoT_Hub_Net, 비번 iothub1234)에 접속하도록 코드에 이미 박혀 있다. 단, 한 가지 확인할 것: 두뇌가 켜져 있고 IoT_Hub_Net이 살아 있는 상태여야 센서 노드가 붙을 수 있다. 두뇌 USB를 먼저 꽂고, 센서 노드를 나중에 꽂아라.

전체 코드

아래 코드를 Arduino IDE에 붙여넣고 그대로 업로드하면 된다. Wi-Fi SSID/비밀번호는 이미 IoT_Hub_Net / iothub1234로 설정되어 있으니 바꿀 필요 없다. DHT22 라이브러리만 설치되어 있으면 바로 컴파일된다.

[3편] 거실 온습도 센서 - DHT22 + D1 Mini로 첫 번째 센서 노드 만들기 - 전체 코드
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <DHT.h>

// =============================================
// 1. Wi-Fi 설정 (두뇌의 AP에 접속)
// =============================================
const char* ssid     = "IoT_Hub_Net";
const char* password = "iothub1234";

// 두뇌의 AP IP (2편 코드에서 WiFi.softAP로 만든 주소)
const char* hubURL = "http://192.168.1.1";

// =============================================
// 2. DHT22 센서 설정
// =============================================
#define DHTPIN  5    // D1 (GPIO5)
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// =============================================
// 3. 전송 간격 (밀리초)
// =============================================
#define INTERVAL 15000  // 15초마다 전송

// =============================================
// setup
// =============================================
void setup() {
  Serial.begin(115200);
  dht.begin();

  // Wi-Fi 연결 (두뇌의 AP에 붙는다)
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  Serial.print("Connecting to IoT_Hub_Net");
  int dots = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    dots++;
  }
  Serial.println();
  Serial.print("Connected! IP: ");
  Serial.println(WiFi.localIP());
  Serial.print("Sending to: ");
  Serial.println(hubURL);
  Serial.println("---");
}

// =============================================
// loop
// =============================================
void loop() {
  // DHT22에서 값 읽기
  float temp = dht.readTemperature(); // 섭씨
  float hum  = dht.readHumidity();    // 습도 %

  // 읽기 실패 체크
  if (isnan(temp) || isnan(hum)) {
    Serial.println("DHT22 read failed, retrying...");
    delay(2000);
    return;
  }

  // 시리얼 출력 (디버깅용)
  Serial.print("Temp: "); Serial.print(temp);
  Serial.print(" C, Hum: "); Serial.print(hum);
  Serial.println(" %");

  // 두뇌로 HTTP GET 전송
  // no1=온도, no2=습도
  WiFiClient client;
  HTTPClient http;
  String url = String(hubURL) + "/set?no1="
             + String(temp) + "&no2=" + String(hum);
  http.begin(client, url);
  int code = http.GET();
  http.end();

  Serial.print("HTTP "); Serial.print(code);
  Serial.print(" -> "); Serial.println(url);
  Serial.println();

  delay(INTERVAL);
}

업로드

1. USB 케이블로 Wemos D1 Mini를 PC에 연결한다. 2. Arduino IDE에서 툴 → 보드 → ESP8266 Boards → LOLIN(WEMOS) D1 R2 & mini 선택. 3. 포트 선택 후 업로드. 4. 끝나면 툴 → 시리얼 모니터 열고 보드레이트 115200 확인.

확인할 것

시리얼 모니터

센서 노드가 부팅되면 이런 식으로 출력된다:

Connecting to IoT_Hub_Net..........
Connected! IP: 192.168.1.2
Sending to: http://192.168.1.1
---
Temp: 24.5 C, Hum: 58.0 %
HTTP 200 -> http://192.168.1.1/set?no1=24.50&no2=58.00
  • Connected!가 떴다 → Wi-Fi 연결 성공
  • HTTP 200이 떴다 → 두뇌에 데이터 전송 성공
  • 15초마다 한 줄씩 올라온다

두뇌 OLED 확인

두뇌의 OLED를 보자. 1번 Living Temp24.5, 2번 Living Hum58.0으로 바뀌어 있을 것이다. --였던 빈칸이 실제 값으로 채워지는 첫 순간이다.

웹 대시보드 확인

PC에서 두뇌의 STA IP(예: http://192.168.0.50)로 접속. 1번과 2번 카드가 초록빛 숫자로 살아 있다.

안 될 때 체크포인트

센서 노드가 Wi-Fi에 붙지 못한다

증상원인해결
Connecting...에서 무한 대기두뇌가 꺼져 있음두뇌 USB 전원 확인. IoT_Hub_Net이 스마트폰 Wi-Fi 목록에 보이는지 확인
Connecting...에서 무한 대기거리가 너무 멈센서 노드를 두뇌 근처로 가져와서 테스트. ESP8266 AP 도달 거리는 벽 1~2개 통과하면 약해진다
Connected!는 뜨는데 IP가 0.0.0.0DHCP 실패두뇌를 재부팅한 후 센서 노드도 재부팅

HTTP 200이 안 뜬다

증상원인해결
HTTP -1두뇌 HTTP 서버 응답 없음센서 노드가 진짜 IoT_Hub_Net에 붙었는지 확인. 다른 Wi-Fi에 붙었으면 192.168.1.1로 요청이 안 간다
HTTP 404URL 오타코드에서 /set?no1= 부분에 오타가 없는지 확인

DHT22 값이 이상하다

증상원인해결
nan 또는 0.0만 나옴배선 오류DATA 핀이 D1(GPIO5)에 제대로 꽂혔는지 확인. VCC는 3.3V인지 확인 (5V에 꽂으면 센서가 탈 수 있다)
값이 계속 같은 숫자센서 불량DHT22는 2초에 한 번만 읽을 수 있다. 우리 코드는 15초 간격이니 문제없음. 그래도 같으면 센서 교체
온도가 너무 높음D1 Mini 자체 발열D1 Mini가 미세하게 열을 내니까 DHT22를 와이어로 살짝 띄워서 설치. 보드에 바짝 붙이면 1~2℃ 높게 나온다

지금까지 뭘 한 거냐면

  • Wemos D1 Mini + DHT22로 첫 번째 센서 노드를 만들었다.
  • 센서 노드는 두뇌의 AP IoT_Hub_Net에 무선으로 붙어서, 15초마다 온도와 습도를 HTTP GET으로 전송한다.
  • 두뇌 OLED의 1번·2번 슬롯이 --에서 실제 값으로 바뀌었다.
  • 이 패턴만 알면 나머지 센서도 똑같다: 센서 읽기 → URL 만들기 → HTTP GET.

다음 글 예고

다음 편에서는 현관문 열림 감지를 붙인다. MC-38 리드스위치 + Wemos D1 Mini. 문이 열리면 두뇌에서 경고가 울리는 걸 확인할 수 있다. 부저 테스트도 제대로 해볼 기회다.

준비물: Wemos D1 Mini (2,000원), MC-38 리드스위치 (800원)