# SHT30 온습도 센서 설치 가이드 서버실 온습도 모니터링을 위해 Sensirion SHT30(한진데이터 P4422-3, I2C) 센서를 설치하고 서버에 연동하는 가이드입니다. 기본 구성은 STM32F407VGT6 펌웨어(`sht30_fw`, `sensor_id=2`, `device_id=stm32-sht30-01`)이며, 폐쇄망의 다른 환경을 위한 Raspberry Pi I2C 대안도 함께 설명합니다. ## 1. 서버 준비 1. 웹 서버 DB에 통합 스키마를 적용합니다(신규 설치). ```sql SOURCE sql/schema_sht30.sql; ``` 기존 누수 설치를 온습도 전용으로 전환하는 경우에는 전환 마이그레이션을 적용합니다. ```sql SOURCE sql/migration_drop_leak.sql; ``` 2. 서버 파일을 배포합니다. ```text php/api/sensor_data.php php/dashboard.php php/ops_checks.php php/config.php sql/schema_sht30.sql ``` API는 `sht30` 측정을 수신하면 `sensor_status`를 갱신하고 측정값을 `sensor_metric`에 저장합니다. 서버가 `METRIC_*` 임계로 고온/저온/고습/저습을 판정하고, 초과 시 종류별 30분 쿨다운으로 SMS를 발송합니다. ## 2. 기본 구성 — STM32F407VGT6 (`sht30_fw`) ### 2.1 I2C 배선 SHT30을 STM32 I2C1 버스에 연결합니다(상세는 [wiring_diagram.md](./wiring_diagram.md), [firmware/docs/HARDWARE.md](../firmware/docs/HARDWARE.md) §3). ```text SHT30 VDD -> STM32 3.3V SHT30 GND -> STM32 GND SHT30 SCL -> STM32 PB6 (I2C1_SCL, AF4) + 4.7kΩ 풀업 -> 3.3V SHT30 SDA -> STM32 PB7 (I2C1_SDA, AF4) + 4.7kΩ 풀업 -> 3.3V SHT30 ADDR -> GND (주소 0x44; VDD 면 0x45) ``` - 7-bit 주소 `0x44`(`APP_SHT30_I2C_ADDR`), I2C 100kHz 권장. - 명령 `0x2C06`(high-repeatability) → 약 20ms 대기 → 6바이트 read. ### 2.2 펌웨어 설정·빌드 (폐쇄망) ```bash cp firmware/common/secrets.h.example firmware/common/secrets.h # secrets.h 의 APP_API_KEY 를 서버 config.local.php 의 API_KEY 와 동일하게 채운다. ``` | 위치 | 설정 | |---|---| | `firmware/common/secrets.h` | `APP_API_KEY` = 서버 `API_KEY` | | `firmware/common/app_config.h` | `APP_API_HOST`, `APP_API_PATH`(`/raspi_leck_detecter/api/sensor_data.php`), 네트워크 | | `firmware/common/app_config.h` | `APP_SHT30_REPORT_INTERVAL_SEC`(기본 300초), `APP_SHT30_I2C_ADDR`(0x44) | | `firmware/certs/server_ca.c` | 자리표시자 CA → 실제 Cafe24 루트 CA | 벤더링·빌드·플래시 절차는 [firmware/docs/BUILD_OFFLINE.md](../firmware/docs/BUILD_OFFLINE.md)를 따릅니다. `sht30_fw` 타깃을 빌드해 보드에 플래시합니다. ### 2.3 동작 확인 USART3(PD8/PD9, 115200) 콘솔 로그에서 확인합니다. - I2C1 초기화 및 SHT30 0x44 응답, 첫 측정값 - 네트워크/SNTP/TLS 핸드셰이크 → 서버 200 응답 → `startup` 보고 - 이후 5분 주기 `periodic` 측정 보고 ## 3. 대안 구성 — Raspberry Pi I2C (STM32 외 대안) STM32 보드를 쓸 수 없는 환경에서는 Raspberry Pi 40핀 헤더 I2C 버스 1을 사용할 수 있습니다. ```text SHT30 VCC -> Raspberry Pi 3.3V (pin 1) SHT30 GND -> Raspberry Pi GND SHT30 SDA -> Raspberry Pi GPIO2 / SDA1 / pin 3 SHT30 SCL -> Raspberry Pi GPIO3 / SCL1 / pin 5 SHT30 ADDR -> GND (주소 0x44; 점퍼 변경 시 0x45) ``` I2C를 먼저 활성화합니다. ```bash sudo raspi-config # Interface Options -> I2C -> enable sudo apt-get update sudo apt-get install -y python3-venv python3-smbus i2c-tools ``` 센서가 보이는지 확인합니다. ```bash i2cdetect -y 1 # 44 또는 45 가 보여야 함 ``` 환경 파일 `/etc/sht30-sensor.env`를 생성하고 다음 값을 채웁니다. ```text API_URL=https://your-domain.example/raspi_leck_detecter/api/sensor_data.php API_KEY=서버와 동일한 API_KEY DEVICE_ID=rpi-sht30-01 DEVICE_LOCATION=온습도 측정 위치 SHT30_SENSOR_ID=2 SHT30_I2C_ADDR=0x44 ``` > 대안 구성에서도 `sensor_id=2`, raw-body 서명(`X-Signature = sha256(API_KEY + body)`), 5분 측정 주기는 동일합니다. 임계 판정과 SMS는 모두 서버에서 수행하므로 측정 송신부만 환경에 맞게 구성하면 됩니다. ## 4. 대시보드 결과 첫 정상 보고 후: - `sensor_status`에 `sensor_id=2` 항목이 생성됩니다. - `sensor_metric`에 온도/습도 이력이 누적됩니다. - `dashboard.php`가 센서 카드에 최신 온도/습도와 임계 상태를 표시합니다. 장비가 `HEARTBEAT_TIMEOUT_SEC`(기본 1200초=20분)을 초과해 보고를 멈추면 서버가 오프라인으로 판정하고 SMS를 발송합니다.