POSA_LEAKSMS/docs/wiring_diagram.md
cw2007 73e49fd528 feat: RPi4 누수+온습도 2-모듈 단일 서버 통합 + 보안 하드닝
2번 모듈 신규(raspberry_pi4_sht30/): SHT30 온습도 → cafe24, raw-body X-Signature HMAC, 폐쇄망 오프라인 설치(vendor/install), systemd, CRC/포맷 자가점검. firmware sht30_fw wire 포맷과 byte-parity 검증.

1번 모듈 통합(raspberry_pi4/): 누수+카메라를 동일 서버로. 레거시 sha256(key+json) body-sig → X-Signature HMAC 전환, 사진 canonical=device_id|sensor_id|log_id|timestamp.

서버 통합(php/): api/sensor_data.php 누수 이벤트 수신, api/photo_upload.php 신규(HMAC·finfo·서버생성 파일명·nonce 멱등·sensor 결속), photo.php 인증 사진서빙, dashboard.php 누수 패널+사진, sms_send.php 누수 SMS, config.php 태그/요약.

DB: sql/migration_add_leak.sql(가산·멱등), schema_sht30.sql 통합 스키마.

보안 하드닝(외부 펜테스트 대비, 확정 CRITICAL/HIGH 0): cron_heartbeat api_key fail-closed, setup_mfa 부트스트랩 토큰 post-enrollment 잠금, var/ PHP 실행차단, HSTS.

문서/테스트: SYSTEM_OVERVIEW.md, security_hardening_test.php 갱신. 참고: 사용자 요청으로 세션 외 기존 미커밋 변경도 함께 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:21:11 +09:00

3.9 KiB
Raw Blame History

SHT30 온습도 센서 ↔ STM32F407VGT6 I2C 배선도

Sensirion SHT30(한진데이터 P4422-3 모듈)을 STM32F407VGT6의 I2C1 버스에 연결합니다. 단일 보드 sht30_fw(sensor_id=2, device_id=stm32-sht30-01)가 5분 주기로 온습도를 측정해 유선 Ethernet/TLS로 서버에 보고합니다.

상세 핀맵·전원·클럭원은 firmware/docs/HARDWARE.md §3을 따릅니다. 본 문서는 SHT30 I2C 결선 요약입니다.

센서 동작 개요

SHT30 (I2C, 7-bit 주소 0x44)
  명령 0x2C06 (high-repeatability, clock-stretch off)
  → 약 20ms 대기 → 6바이트 read (T 2B + CRC, RH 2B + CRC)
  → 펌웨어가 온도(℃)/상대습도(%)로 변환

SHT30 모듈은 3.3V 단일 전원으로 동작합니다. SCL/SDA는 오픈드레인이므로 외부 풀업이 필요합니다(모듈에 내장 풀업이 있으면 생략).


필요 부품 (최소 구성)

부품 규격 용도
STM32F407VGT6 보드 LQFP-100, Cortex-M4F 메인 컨트롤러 (sht30_fw)
SHT30 온습도 모듈 한진데이터 P4422-3 (I2C) 온도/습도 측정
풀업 저항 4.7kΩ × 2 SCL/SDA 풀업 (모듈 내장 풀업 시 생략)
LAN8720 PHY 모듈 RMII 유선 Ethernet
3.3V 전원 - MCU/PHY/SHT30 공통 레일
점퍼 와이어 - 연결

I2C 배선 (STM32 I2C1)

STM32 핀 신호 AF SHT30 핀 비고
PB6 I2C1_SCL AF4 SCL 오픈드레인, 4.7kΩ 풀업 → 3.3V
PB7 I2C1_SDA AF4 SDA 오픈드레인, 4.7kΩ 풀업 → 3.3V
3.3V 전원 - VDD 공통 3.3V 레일
GND 접지 - GND 공통 GND
  • 7-bit 주소: 0x44 (APP_SHT30_I2C_ADDR). ADDR 핀을 GND에 연결한 기본값. ADDR을 VDD에 연결하면 0x45.
  • I2C 속도: 100kHz(Standard) 권장.

회로도

  SHT30 모듈                STM32F407
  ┌────────┐
  │  VDD ──┼──────────────  3.3V ──┬──[4.7kΩ]──┐   ┌──[4.7kΩ]── 3.3V
  │  SCL ──┼──────────────  PB6 ───┘            │   │
  │  SDA ──┼──────────────  PB7 ────────────────┼───┘
  │  GND ──┼──────────────  GND                 │
  │  ADDR ─┼── GND  (주소 0x44; VDD 면 0x45)     │
  └────────┘

ADDR 핀 결선으로 0x44(ADDR→GND) / 0x45(ADDR→VDD)가 결정됩니다. 본 설계는 0x44 고정입니다.


동작 확인

펌웨어는 USART3(PD8 TX / PD9 RX, AF7, 115200 8N1) 콘솔에 측정/보고 로그를 출력합니다. 첫 부팅 후 다음을 확인합니다.

  • I2C1 초기화 및 SHT30 주소 0x44 응답
  • 첫 측정값(온도/습도) 및 startup 보고
  • 네트워크/SNTP/TLS 핸드셰이크 → 서버 200 응답

정상 측정 범위(벗어나면 펌웨어가 metric_status="out_of_range" 로 표시): 온도 [-40, 125]°C, 상대습도 [0, 100]%.

참고: out_of_range 는 펌웨어 전용 타당성(plausibility) 분류입니다. 서버는 이 값을 무시하고 운영 임계(METRIC_*)로 재판정하므로, DB sensor_metric.metric_status 에는 normal/high_temp/low_temp/high_humidity/low_humidity 만 저장되며 out_of_range 는 저장되지 않습니다.


주의사항

  • SCL/SDA는 오픈드레인이므로 외부 풀업(4.7kΩ) 없이 동작하지 않습니다(모듈 내장 풀업이 있는 경우만 예외).
  • I2C1(PB6/PB7)과 RMII(PB11/PB12/PB13)는 같은 PB 포트지만 핀이 분리되어 충돌이 없습니다.
  • 케이블이 길면(1m 이상) I2C 풀업을 더 낮은 값(예 2.2kΩ)으로 조정하거나 속도를 낮춥니다.
  • 측정 주기는 펌웨어 APP_SHT30_REPORT_INTERVAL_SEC(기본 300초)로 설정합니다.