시스템: 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(미커밋)에만 저장.