Home IoT Hub Series · 03
[3편] 거실 온습도 센서 - DHT22 + D1 Mini로 첫 번째 센서 노드 만들기
![[3편] 거실 온습도 센서 - DHT22 + D1 Mini로 첫 번째 센서 노드 만들기 대표 이미지](/iot-lab/assets/living-room-dht22-sensor-node-hero.png)
2편에서 두뇌를 완성했다. 이제 첫 번째 센서를 붙인다. 거실 온도와 습도를 찍어서 두뇌로 쏘는 작은 노드다. 이걸 만들고 나면 나머지 18개도 똑같은 패턴이다. 센서만 바꿔 끼우면 된다.

DHTTYPE만 DHT11로 바꿔야 합니다.준비물과 가격
| 부품 | 수량 | 개당 가격 | 비고 |
|---|---|---|---|
| Wemos D1 Mini (ESP8266) | 1개 | 2,000원 | 센서 노드 본체 |
| DHT22 온습도 센서 | 1개 | 2,000원 | DHT11보다 정밀. 온도 ±0.5℃, 습도 ±2% |
| 점퍼 와이어 (암-암) | 3개 | — | 앞서 산 10개 묶음에서 쓴다 |
| Micro USB 케이블 + 충전기 | 1세트 | — | 집에 굴러다니는 구형 충전기 재활용 |
| 합계 | 4,000원 | (충전기·케이블 제외) |
핀 연결
DHT22는 핀이 3개(혹은 4개)다. VCC, DATA, GND만 연결하면 된다.
| 센서/모듈 | 보드 연결 |
|---|---|
| VCC (1번 핀) | 3.3V |
| DATA (2번 핀) | D1 (GPIO5) |
| GND (4번 핀) | GND |
+, 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 library | DHT 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 라이브러리만 설치되어 있으면 바로 컴파일된다.
#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 Temp가 24.5, 2번 Living Hum이 58.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.0 | DHCP 실패 | 두뇌를 재부팅한 후 센서 노드도 재부팅 |
HTTP 200이 안 뜬다
| 증상 | 원인 | 해결 |
|---|---|---|
HTTP -1 | 두뇌 HTTP 서버 응답 없음 | 센서 노드가 진짜 IoT_Hub_Net에 붙었는지 확인. 다른 Wi-Fi에 붙었으면 192.168.1.1로 요청이 안 간다 |
HTTP 404 | URL 오타 | 코드에서 /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. 문이 열리면 두뇌에서 경고가 울리는 걸 확인할 수 있다. 부저 테스트도 제대로 해볼 기회다.