시스템: IoT 기반 서버실 누수·환경 모니터링 (leak_sms_v3)
+버전: v2606 · 작성일: 2026-07-19
+
1. 시스템 개요
+Raspberry Pi 센서 노드가 각종 측정·이벤트를 cafe24 서버로 HTTPS POST 보고하고, 서버가 저장·판정(SMS)·대시보드 표시하는 단일 통합 시스템이다.
+| 항목 | +내용 | +
|---|---|
| 센서 노드 | +Raspberry Pi 4 Model B (누수·환경 측정) | +
| 표시 장치 | +Raspberry Pi Zero 2 W + ST7789V 미니 디스플레이 (읽기전용) | +
| 서버 | +cafe24 웹호스팅 PHP + MySQL | +
| 전송 | +HTTPS POST | +
| 인증 | +X-Signature = HMAC-SHA256(API_KEY, raw_body) — 전 노드 공통 |
+
| 판정 위치 | +전부 서버 측 (Pi는 원측정 보고만; 누수만 로컬 디바운스·이벤트 분류) | +
핵심 원칙: 임계 판정·SMS는 서버가 담당한다. 센서 노드는 측정값을 그대로 보고하며, 임계값 변경 시 노드 재배포 없이 서버 설정만 조정한다.
++
2. 센서 형태 총괄
+물리 센서 3종 + 카메라 1종 + 표시 장치 1종.
+| 센서 | +모델 | +인터페이스 | +연결 핀 (BCM / 물리핀) | +측정 항목 | +
|---|---|---|---|---|
| 누수 감지 | +e-con 5C-08 저항식 2선(2전극) 프로브 + 10MΩ 풀다운(보드) | +GPIO 디지털 | +GPIO17 / 물리 11 | +누수 유무 (2상태) | +
| 카메라 | +Pi Camera (누수 노드 동승) | +CSI 15핀 (Pi 4) | +CSI 커넥터 | +정지영상 (누수 시) | +
| 온습도 | +SHT30 | +I2C bus 1 | +SDA=GPIO2/핀3, SCL=GPIO3/핀5 | +온도·습도 | +
| 미세먼지 | +PMS7003 | +UART (/dev/serial0) |
+TXD→RXD=GPIO15/핀10 | +PM1.0 / PM2.5 / PM10 | +
| 표시 장치 | +ST7789V TFT (센서 아님) | +SPI | +WIRING 참조 | +상태 표시 전용 | +
+
3. 센서별 상세 내용
+3-1. 누수 감지 센서 (sensor_id 1 / 3)
+-
+
- 모델·회로: e-con 5C-08 저항식 리크 2선(2전극) 프로브 — 전극 A→3V3(핀1), 전극 B→GPIO17(핀11). 외부 10MΩ 풀다운은 GPIO17↔GND 사이 보드 부품(센서 선 아님). 내부 풀저항 OFF(PUD_OFF) — 내부 풀다운(50kΩ) 사용 시 누수에도 라인이 HIGH로 못 올라가 감지 실패. +
- 활성 레벨:
ACTIVE_LOW = False— 건조 시 GPIO LOW(0), 누수 시 HIGH(1).
+ - 노이즈 제거: 디바운스 500ms + 엣지 후 확인재독 3회 × 0.3s (총 ~0.9s). 엣지 단독으로는 상태를 바꾸지 않아 서버실 EMI 순간 블립을 거부하고 실제 물(지속)만 통과시킨다. +
- 보고 주기: 정상 600초(10분) 주기, 누수 중 10초 재보고. +
- 이벤트:
leak_alert(누수 발생) /leak_recovery(복구) /periodic(정상 주기).
+
서버 판정·경보:
+| 항목 | +값 | +
|---|---|
| 누수 경보 SMS 쿨다운 | +1800초 (30분) | +
| 감지 확인창 | +60초 | +
| 복구 확인창 | +180초 | +
| 오프라인 판정(heartbeat) | +1200초 (20분 미보고 → 오프라인) | +
| SMS 태그 | +[누수감지] / [누수복구] |
+
3-2. 카메라 (누수 노드 동승)
+-
+
- 형태: Pi Camera, Pi 4 CSI 15핀 리본. (Zero 2 W는 22핀이라 리본 비호환 — 15핀 리본 또는 15↔22 어댑터 필요.) +
- 촬영:
rpicam-still(Bookworm) /libcamera-still(Bullseye), 640×480, JPEG 품질 60 (약 50–80KB).
+ - 동작: 누수 감지 시 촬영 후
photo_upload.php로 업로드. 서명 canonical =device_id|sensor_id|log_id|timestamp(공백 없음). 서버 측 MIME(finfo)·크기 상한·무작위 파일명 검증.
+ - 비활성:
CAMERA_ENABLED = False로 촬영·업로드 생략 가능.
+
3-3. 온습도 센서 SHT30 (sensor_id 2, 누수 노드 동승 시 1 / 3)
+-
+
- 인터페이스: I2C bus 1, 주소 0x44(ADDR=GND) 또는 0x45(ADDR=VDD). 브레이크아웃 모듈(내장 풀업) → VCC/GND/SDA/SCL 4선 직결, 외부 풀업 저항 불필요. SDA=GPIO2(핀3), SCL=GPIO3(핀5). +
- 타당성 범위: 온도 -40 ~ 125℃, 습도 0 ~ 100%RH. 범위 밖은
out_of_range로 보고.
+ - 보고 주기: 단독 Pi-B(id2) 3600초(1시간). 누수 노드 동승(id1/3) 시 600초(10분). 동일 sensor_id 안에서
metric_type로 구분.
+
서버 임계값:
+| 항목 | +임계 | +히스테리시스 | +
|---|---|---|
| 고온 | +30℃ | +1.0℃ | +
| 저온 | +10℃ | +1.0℃ | +
| 고습 | +70% | +3.0% | +
| 저습 | +20% | +3.0% | +
| 이슬점 여유 | +3.0℃ | +1.0℃ | +
| 경보 쿨다운 | +1800초 (30분) | +— | +
| 오프라인 판정 | +7500초 (~125분, 1시간 주기 2회 미보고 + 여유) | +— | +
3-4. 미세먼지 센서 PMS7003 (누수 노드 동승, sensor_id 1 / 3, metric_type="pms7003")
+-
+
- 인터페이스: UART
/dev/serial0, 9600bps 8N1, 3.3V 로직. PMS7003 TXD → Pi RXD = GPIO15(핀10). UART 활성화 + 시리얼 로그인 콘솔 비활성화 필요(enable_uart=1).
+ - 측정: PM1.0 / PM2.5 / PM10 (대기환경 농도, µg/m³). +
- 타당성 범위: 0 ~ 1000 µg/m³. 범위 밖은
out_of_range.
+ - 보고 주기: 600초(10분). 독립 노드가 아니라 누수 노드 위에 동승(SHT30와 동일 방식). +
서버 임계값:
+| 항목 | +임계 | +히스테리시스 | +
|---|---|---|
| PM2.5 고농도 | +75 µg/m³ | +10 µg/m³ | +
| PM10 고농도 | +150 µg/m³ | +10 µg/m³ | +
| 경보 쿨다운 | +1800초 (metric 공용) | +— | +
+
4. 노드 구성
+| 배포 폴더 | +대상 | +sensor_id | +탑재 센서 | +
|---|---|---|---|
| 01_server_cafe24 | +cafe24 웹호스팅 | +— | +서버 (수신·MySQL·SMS·대시보드) | +
| 02_pi_a_node_id1 | +Pi-A 노드 | +1 | +누수 + 카메라 + SHT30 + PMS7003 | +
| 03_pi_b_sht30_id2 | +Pi-B | +2 | +SHT30 단독 (온습도) | +
| 04_pi_c_node_id3 | +Pi-C 신규 현장 | +3 | +누수 + 카메라 + SHT30 + PMS7003 | +
| 06_pi_zero2w_display | +Pi Zero 2 W | +— | +ST7789V 미니 디스플레이 (읽기전용 상태 표시) | +
구성 요약: 누수 노드(Pi-A id1, Pi-C id3)는 누수·카메라·온습도·미세먼지 4센서 풀스택. Pi-B(id2)는 온습도 전용. Zero 2 W는 센서가 아닌 상태 표시 장치. 서버가 단일 지점에서 전 노드 수신·판정·SMS·대시보드를 담당한다.
++
5. 요약
+-
+
- 물리 센서 3종: 누수(e-con 5C-08 / GPIO), 온습도(SHT30 / I2C), 미세먼지(PMS7003 / UART). +
- 부가 장치 2종: 누수 노드 동승 카메라(CSI), 상태 표시 디스플레이(ST7789V / SPI). +
- 판정 일원화: 임계·SMS 전부 서버 측 → 임계 변경 시 노드 재배포 불필요. +
- 동승 구조: 온습도·미세먼지는 누수 노드의 sensor_id를 공유하고
metric_type으로 구분.
+ - 보안: 전 노드 HMAC-SHA256 raw-body 서명, 비밀값은 노드의
config_local.py(미커밋)에만 저장.
+