Home IoT Hub Series · 16
[16편] 불 껐나, 문 잠갔나 한 번에 확인하자 - 조명과 도어락 상태 노드
![[16편] 불 껐나, 문 잠갔나 한 번에 확인하자 - 조명과 도어락 상태 노드 대표 이미지](/iot-lab/assets/living-light-door-lock-hero.png)
이 글은 2편: 두뇌 만들기에서 구축한 중앙 NodeMCU 서버에 연결되는 우리집 IoT 허브 구성 문서입니다. 조도센서와 도어락 상태 입력을 함께 보내 거실 점등 상태와 현관 보안 상태를 중앙 허브에서 같이 보게 합니다. 수집된 데이터는 로컬 무선망
IoT_Hub_Net을 통해 중앙 서버의 11번 거실 조명과 10번 현관문 잠금 슬롯(/set?no11=조명&no10=잠금)을 갱신하며, 20채널 스마트홈 통합 컨트롤러의 판단 근거로 사용됩니다.한 개의 D1 Mini로 두 가지를 동시에 체크한다. 조도센서(아날로그)로 거실 조명이 켜졌는지 판단하고, 도어락 센서(디지털)로 현관문이 잠겼는지 확인한다. 11번 슬롯(Living Light)과 10번 슬롯(Door Lock).
준비물과 가격
| 부품 | 수량 | 개당 가격 |
|---|---|---|
| Wemos D1 Mini | 1개 | 2,000원 |
| 조도센서 (LDR + 10kΩ) | 1세트 | 1,500원 |
| 도어락 상태 센서 | 1개 | 2,000원 |
| 점퍼 와이어 5개 | — | — |
| 합계 | 5,500원 |
핀 연결
| 센서/모듈 | 보드 연결 |
|---|---|
| LDR 한쪽 | 3.3V |
| LDR 다른쪽 | GND |
| VCC | 3.3V |
| GND | GND |
| OUT | D1 (GPIO5) |
전체 코드
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* ssid = "IoT_Hub_Net"; const char* password = "iothub1234"; const char* hubURL = "http://192.168.1.1"; #define LIGHT_PIN A0 #define LOCK_PIN 5 // D1 #define LIGHT_TH 700 // 이 값 이상 = 조명 ON #define INTERVAL 5000 void setup() { Serial.begin(115200); pinMode(LOCK_PIN, INPUT_PULLUP); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Connecting to IoT_Hub_Net"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected!"); } void loop() { int lightRaw = analogRead(LIGHT_PIN); String light = (lightRaw > LIGHT_TH) ? "ON" : "OFF"; String lock = (digitalRead(LOCK_PIN) == LOW) ? "1" : "0"; // LOW = 잠김(센서 접점 닫힘), HIGH = 해제 Serial.print("Light: "); Serial.print(lightRaw); Serial.print(" -> "); Serial.print(light); Serial.print(" | Lock: "); Serial.println(lock); WiFiClient client; HTTPClient http; String url = String(hubURL) + "/set?no11=" + light + "&no10=" + lock; http.begin(client, url); http.GET(); http.end(); Serial.println("HTTP -> " + url); delay(INTERVAL); }
LIGHT_TH는 설치 환경에 따라 조정해야 합니다. 조명을 켠 상태와 끈 상태의 A0 값을 시리얼 모니터로 확인한 뒤 중간값으로 설정합니다.확인
거실 조명을 켜고 끄면서 11번 Living Light가 ON↔OFF로 바뀌는지 확인. 현관문을 잠그고 열면서 10번 Door Lock이 바뀌는지 확인.
시리얼 모니터
업로드가 끝나면 Arduino IDE의 툴 → 시리얼 모니터를 열고 보드레이트를 115200으로 맞춥니다. 다음은 정상 동작을 확인하기 위한 시리얼 모니터 출력 예시입니다. 이 로그는 실제 캡처가 아니라, 조명 11번 슬롯과 도어락 10번 슬롯이 함께 갱신되는지 확인하는 예시입니다.
[BOOT] Home IoT Node #16 - Light and door lock [SENSOR] light_raw=842 light=ON [INPUT] optocoupler door_lock=CLOSED [FILTER] street_light_guard=PASS [HTTP] GET /set?no11=1&no10=1 [HUB] 200 OK - slots no11/no10 updated [SAFETY] door-lock line isolated by optocoupler
Connected또는connected가 보이면 Wi-Fi 연결 단계는 통과한 것입니다.HTTP 200또는200 OK가 보이면 두뇌 서버에 값이 전달된 것입니다.- 값이 갱신되지 않으면 먼저 URL의 슬롯 번호와 센서 배선을 함께 확인합니다.
다음 글 예고
에어컨 IR 제어. VS1838B + IR LED로 만능리모컨처럼 에어컨을 켜고 끈다. 시리즈 마지막 고급 편.
D1 Mini 하나로 거실 조명과 현관문 상태를 동시에 지키기
CDS 조도센서(거실 조명 켜짐 여부)와 리드센서(현관문 잠금 여부)를 한 보드에 물리면, 작은 D1 Mini 한 대가 '우리집 IoT 허브'의 든든한 문지기가 됩니다. 여기서는 배선이나 코드가 아니라, 이 조합을 어디에 어떻게 설치하고 무엇에 쓰는지에 집중합니다.
안 될 때 체크포인트
이 노드는 코드만 보면 짧아 보일 수 있지만, 실제 집에 붙이면 센서 위치·전원·무선망·노이즈 때문에 값이 쉽게 흔들립니다. 아래 항목은 두뇌 서버에 잘못된 판단 근거가 들어가지 않도록 현장에서 먼저 점검할 내용입니다.
| 증상 | 가능한 원인 | 현장 해결 방법 |
|---|---|---|
| 불을 껐는데 켜짐으로 표시됨 | TV 화면, 가로등, 창밖 빛이 조도센서에 직접 들어옴 | 검은 수축튜브로 센서 시야각을 좁히고 천장 조명 방향만 보게 고정합니다. |
| 낮과 밤 기준이 자주 바뀜 | LDR 저항값이 설치 위치와 날씨에 따라 크게 변함 | 첫 며칠 로그를 보고 현장 기준 임계값을 정하며, 켜짐/꺼짐 임계값을 분리합니다. |
| 도어락 신호 연결이 위험함 | 도어락 내부 전압과 ESP8266 3.3V 로직이 직접 맞지 않음 | 도어락 메인보드에 직결하지 말고 포토커플러나 릴레이 접점처럼 절연된 방식으로 상태만 읽습니다. |
| 잠금 상태와 실제 상태가 어긋남 | 수동 조작이나 자동잠금 지연을 즉시 반영하지 못함 | 잠금 모터 동작 순간보다 최종 래치 위치나 상태 LED 같은 안정된 신호를 기준으로 삼습니다. |
활용 방안
- 외출 시 조명 끄기 알림: 현관문이 잠기고(리드 열림) 일정 시간 뒤에도 CDS가 '밝음'이면 "거실 불 켜둔 채 나가셨어요" 푸시 발송.
- 현관 미잠금 경보: 밤 시간대(CDS 어두움)에 리드센서가 '문 열림/미잠금'이면 취침 방범 알림.
- 재실 추정: 낮에 조명 ON이 지속되면 재실 가능성, 문 잠김 + 조명 OFF가 길게 이어지면 외출로 추정해 난방·대기전력 절약 루틴 트리거.
- 전기 절약 리포트: 조명이 하루 몇 시간 켜져 있었는지 로그로 쌓아 주간 절전 리포트 생성.
- 방범 시나리오: 외출 상태로 판단된 동안 문이 열리면 즉시 침입 의심 알림 + 스냅샷 카메라 연동.
추천 설치 장소
- CDS(조도센서): 조명 직하보다 반사광을 노리세요. 전구를 정면으로 보면 켜짐/꺼짐 구분은 쉽지만 외광(창문 햇빛)에 취약합니다. 천장 모서리나 벽 상단에서 실내 반사광을 받게 두면 낮 햇빛과 조명 빛을 함께 안정적으로 읽습니다. 창문 직사광이 바로 닿는 자리는 피하는 것이 좋습니다.
- 리드센서 + 자석: 리드센서는 고정된 문틀에, 자석은 움직이는 문짝(또는 데드볼트 쪽)에 부착합니다. 문이 완전히 닫혔을 때 둘이 10mm 이내로 정렬되도록 하고, 표시선을 서로 마주보게 맞추세요. 도어락 데드볼트 위치에 자석을 붙이면 '닫힘'이 아니라 '잠금'까지 감지할 수 있습니다.
실전 팁 / 주의점
- CDS 임계값 캘리브레이션: 낮/밤을 하나의 값으로 나누면 오판이 잦습니다. 하루 동안 아날로그 값을 로그로 남겨 '한낮·흐림·조명만·완전 암전' 4구간을 확인한 뒤, 조명 판정용 임계값과 밤낮 구분용 임계값을 따로 두는 것이 좋습니다. 5~10초 이동평균으로 순간 그림자·깜빡임을 걸러냅니다.
- 리드센서 간격과 문 휨: 계절에 따라 문이 휘거나 처지면 간격이 벌어져 '항상 열림'으로 오작동합니다. 여유 있게 정렬하고, 오작동이 잦으면 자석을 한 단계 큰 것으로 바꾸거나 위치를 미세 조정합니다.
- 아날로그+디지털 동시 처리: D1 Mini는 ADC가 A0 하나뿐이니 CDS는 A0, 리드센서는 디지털 입력(내부 풀업)으로 배분합니다. 리드센서는 상태 변화 시에만 처리(엣지 감지), CDS는 주기 샘플링으로 나누면 루프가 가벼워집니다. 채터링은 소프트웨어 디바운스로 흡수합니다.
자주 묻는 질문
- Q. 커튼을 치면 CDS가 밤으로 착각하지 않나요? A. 그래서 반사광 위치와 조명 전용 임계값 분리가 중요합니다. 조명 ON 판정은 밤낮 판정과 다른 값을 쓰면 커튼 상황에서도 조명 여부는 정확히 잡힙니다.
- Q. 문을 살짝 닫기만 하고 잠그지 않아도 '잠금'으로 뜹니다. A. 자석을 문짝 가장자리가 아니라 데드볼트가 걸리는 위치에 옮기세요. 문 닫힘과 실제 잠금 위치가 달라 이를 구분할 수 있습니다.
- Q. 두 센서 알림이 서로 헷갈리게 옵니다. A. 상태를 조합해 시나리오 단위로 알림을 묶으세요(예: '문 잠김+조명 ON→외출 시 소등 알림'). 단일 센서 이벤트보다 조합 조건이 오알림을 크게 줄입니다.
이 글은 2편의 중앙 두뇌 서버와 3~19편의 분산 엣지 노드가 함께 구성하는 20채널 홈 IoT 시스템의 일부입니다. 필요한 편으로 이동해 슬롯과 센서 흐름을 함께 확인합니다.
[1편] 우리집 IoT 허브 전체 그림[2편] 중앙 두뇌 서버 만들기 · 슬롯 1~20[3편] 집 안 온습도, 감으로 보지 말고 숫자로 보자 · 슬롯 1·2[4편] 문 닫았나 계속 신경 쓰일 때 · 슬롯 9[5편] 냉장고가 제대로 돌고 있는지 눈으로 확인하자 · 슬롯 12[6편] 창문 열어도 될까? · 슬롯 3[7편] 욕실 곰팡이 생기기 전에 습도부터 잡자 · 슬롯 19[8편] 보일러가 실제로 도는지 배관 온도로 확인하자 · 슬롯 5·17[9편] 외출했는데 가스레인지가 켜져 있지 않을까? · 슬롯 6[10편] 가스 냄새가 나기 전에 먼저 경고받자 · 슬롯 7[11편] 집을 비웠을 때 불꽃 징후를 먼저 잡자 · 슬롯 8[12편] 머리가 멍한 이유가 공기 때문인지 확인하자 · 슬롯 13·14[13편] 전기세 무지 나오네, 이번 기회에 눈으로 보자 · 슬롯 15[14편] 물 새는지, 얼마나 쓰는지 숫자로 보자 · 슬롯 16[15편] 비 오는 줄 모르고 창문 열어두지 않게 · 슬롯 18[16편] 불 껐나, 문 잠갔나 한 번에 확인하자 · 슬롯 11·10[17편] 리모컨 없이 에어컨을 IoT 허브에서 제어하자 · 슬롯 4[18편] 강아지 밥그릇이 비었는지 눈으로 보자 · 슬롯 20[19편] 사람 있을 때만 시원하게, 없을 땐 아끼자 · 슬롯 1·4[20편] 집 안 상태가 한 화면에 보이기 시작했다 · 슬롯 전체