Pi Zero 2 W + ST7789 패널에 노드 상태(누수/온습도/미세먼지·오프라인·정체)를 상시 표시하는 디스플레이 노드 신설. 배포 전 렌더 검증 원칙에 따라 합성 최악 프레임 11종을 패널 실해상도로 render_preview/ 에 PNG 로 선렌더. - st7789_driver.py · display_dashboard.py · render_preview.py(합성 프레임 생성) - install.sh · vendor.sh · systemd/display-dashboard.service · 배선(WIRING)·연결테스트 - render_preview/01~11: 요약/통합/메트릭/오프라인/stale/legacy-무PM 최악 케이스
48 lines
2.1 KiB
Markdown
48 lines
2.1 KiB
Markdown
# 미니 상태 표시기 — Pi Zero 2 W + ST7789V (GMT020-02 2.0" 240×320)
|
||
|
||
관제 서버의 요약 상태를 2인치 IPS 화면에 상시 표시하는 글랜스 장치.
|
||
서버 `api/status_summary.php` 를 30초 폴링(읽기 전용, X-Status-Key HMAC 인증),
|
||
페이지 자동 순환: 시스템 요약 → 센서별(누수/온습도) 상세.
|
||
배경색 = 시스템 상태(정상 녹색 / 온습도 경보 주황 / 누수 청색 / 오프라인 회색 /
|
||
서버 무응답 적색 STALE).
|
||
|
||
## 배선 (GMT020-02 7핀 ↔ Zero 2 W 40핀, BCM)
|
||
|
||
| LCD 핀 | 기능 | Pi 핀(BCM) | 물리 핀 |
|
||
|---|---|---|---|
|
||
| VCC | 3.3V | 3V3 | 17 |
|
||
| GND | GND | GND | 20 |
|
||
| SCL | SPI SCLK | GPIO11 | 23 |
|
||
| SDA | SPI MOSI | GPIO10 | 19 |
|
||
| RES | Reset | GPIO24 | 18 |
|
||
| DC | Data/Cmd | GPIO25 | 22 |
|
||
| CS | Chip Select | GPIO8 (CE0) | 24 |
|
||
|
||
핀 변경 시 `config.py` 의 PIN_* 수정. 상세 그림: `WIRING.html`.
|
||
|
||
## 설치
|
||
|
||
```bash
|
||
cp config_local.example.py config_local.py # STATUS_URL / STATUS_KEY 입력(파생키 — API_KEY 아님)
|
||
./install.sh # SPI 활성 + apt + venv (번들 있으면 오프라인)
|
||
python3 test_connection.py # 서버 연결 검증
|
||
sudo cp systemd/display-dashboard.service /etc/systemd/system/
|
||
sudo systemctl daemon-reload && sudo systemctl enable --now display-dashboard
|
||
```
|
||
|
||
폐쇄망: 빌드 PC에서 `bash vendor.sh` → `debs/`+`wheelhouse/` 동봉 후 USB 이송.
|
||
하드닝: 센서 노드와 동일 `harden_pi.sh` 사용 가능(아웃바운드 전용 장치).
|
||
|
||
## 화면 텍스트
|
||
|
||
기본 폰트 DejaVu → 라벨은 영문 축약(ALL OK / LEAK! / TEMP C …).
|
||
한글 표시를 원하면 한글 TTF 를 복사하고 `config.py` FONT_PATH 를 바꾼다
|
||
(폐쇄망이므로 폰트 파일도 USB 로 반입).
|
||
|
||
## 문제 해결
|
||
|
||
- 화면 백지: SPI 활성 여부(`ls /dev/spidev0.0`), 배선(DC/RES 스왑 흔함)
|
||
- 색 이상: `config.py` INVERT 토글
|
||
- 403: STATUS_KEY 불일치 — `php -r 'echo hash_hmac("sha256","status","<서버 API_KEY>");'` 로 재계산
|
||
- 서비스 로그: `journalctl -u display-dashboard -e`
|
||
- 하드웨어 없이 렌더 확인: `FORCE_SIMULATION = True` → `/tmp/display_preview.png`
|