diff --git a/raspberry_pi4/WIRING.html b/raspberry_pi4/WIRING.html new file mode 100644 index 0000000..fb1eef7 --- /dev/null +++ b/raspberry_pi4/WIRING.html @@ -0,0 +1,414 @@ + + + + + +누수 감지 노드 · 배선 & 핀맵 (Raspberry Pi 4) + + + +
+ + +
+

Field Wiring & Pinmap · 누수 감지 노드

+

누수 감지 노드 · 배선 & 핀맵

+

e-con 5C-08 저항형 누수감지센서를 GPIO17(물리 핀 11)에 연결하는 표준 배선도입니다. + Pi-A(sensor_id=1 · 1번 지점 · 서버실)와 Pi-C(sensor_id=3 · 3번 지점 · 신규)는 배선이 동일한 공통 노드입니다.

+
+ Raspberry Pi 4 Model B + BCM2711 + Raspberry Pi OS Bookworm 64-bit + e-con 5C-08 · 저항형 ~1.5MΩ + GPIO17 / 핀11 + 외부 4.7MΩ 풀다운 필수 +
+
+ + +
+

240핀 헤더 핀맵 도해

+
+
+ + + + + + + + + + + + + +홀수 핀 +짝수 핀 +3V3 +5V +1 +2 +GPIO2 (SDA1) +5V +3 +4 +GPIO3 (SCL1) +GND +5 +6 +GPIO4 +GPIO14 (TXD) +7 +8 +GND +GPIO15 (RXD) +9 +10 +GPIO17 +GPIO18 +11 +12 +GPIO27 +GND +13 +14 +GPIO22 +GPIO23 +15 +16 +3V3 +GPIO24 +17 +18 +GPIO10 (MOSI) +GND +19 +20 +GPIO9 (MISO) +GPIO25 +21 +22 +GPIO11 (SCLK) +GPIO8 (CE0) +23 +24 +GND +GPIO7 (CE1) +25 +26 +GPIO0 (ID_SD) +GPIO1 (ID_SC) +27 +28 +GPIO5 +GND +29 +30 +GPIO6 +GPIO12 +31 +32 +GPIO13 +GND +33 +34 +GPIO19 +GPIO16 +35 +36 +GPIO26 +GPIO20 +37 +38 +GND +GPIO21 +39 +40 + +
+
+
신호 (GPIO17 · 핀 11)센서 신호선 입력
+
전원 3V3 (핀 1)센서 전원 공급
+
접지 GND (핀 6 · 사용)센서 GND 기본 연결
+
접지 대체 가능핀 9 / 14 / 20 / 25 / 30 / 34 / 39
+
확장 예시 (선택)GPIO27·핀 13, GPIO22·핀 15
+
미사용 핀이 노드에서 연결하지 않음
+
붉은 점선 사각형이 핀 1 위치입니다. 헤더 방향(핀 1 기준)을 반드시 확인하고 배선하세요. 실제 사용 핀은 1 · 6 · 11 세 개뿐입니다.
+
+
+
+ + +
+

3핀맵 표

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
신호BCM물리 핀비고
신호 센서 신호선GPIO17핀 11센서 신호 입력. 외부 4.7MΩ 풀다운을 핀 11 ↔ GND 사이에 연결.
전원 센서 전원 3.3V3V3핀 1센서 VCC 공급. (예비 3V3 = 핀 17)
접지 센서 GNDGND핀 6대체 가능: 핀 9 / 14 / 20 / 25 / 30 / 34 / 39 중 아무 GND.
확장 추가 센서 예시GPIO27핀 13선택. config.py의 SENSORS에 BCM 번호로 추가.
확장 추가 센서 예시GPIO22핀 15선택. 위와 동일한 방법으로 추가(각 채널마다 외부 풀다운 필요).
사용 핀은 3개(핀 1 · 6 · 11). 확장 행은 다중 센서 구성 시 참고용 예시입니다. 기기별 sensor_id / location은 config_local.py에서 설정.
+
+ + +
+

4배선 스키매틱

+
+ + + + Raspberry Pi 4 · 40핀 헤더 + + + 핀1 · 3V3 + + + 핀11 · GPIO17 + + + 핀6 · GND + + + + e-con 5C-08 누수센서 + + VCC 3.3V + + SIG 신호 + + GND + + + + + 3.3V 전원 · 핀1 + 신호 · GPIO17 · 핀11 + GND · 핀6 + + + + + 4.7MΩ + 외부 풀다운(필수) + + + 내부 풀 OFF · USE_INTERNAL_PULL=False (PUD_OFF) + + + 건조 → GPIO=LOW(0) · 누수 → GPIO=HIGH(1) · ACTIVE_LOW=False + +
+
동작 원리: 건조 시 센서는 초고임피던스(거의 개방) 상태라 외부 4.7MΩ 풀다운이 GPIO17을 LOW로 유지합니다. 누수로 물이 전극을 연결하면 3.3V가 ~1.5MΩ을 통해 신호선을 끌어올려 GPIO17이 HIGH로 전환됩니다.
+
+ + +
+

5전기 설계 · 주의

+ +
+ ★ 절대 주의 · CRITICAL +

내부 풀다운을 켜지 마세요

+

내부 50kΩ 풀다운을 활성화하면, ~1.5MΩ 고임피던스 센서가 GPIO를 HIGH로 끌어올리지 못해 + 누수를 감지하지 못합니다(감지 실패). 반드시 내부 풀은 PUD_OFF로 끄고, + 외부 4.7MΩ 풀다운만 사용하세요. (USE_INTERNAL_PULL = False)

+
+ +
+
+

극성 · 로직 레벨

+

ACTIVE_LOW = False → 건조 시 GPIO=LOW(0), 누수 시 GPIO=HIGH(1).

+
+
+

외부 풀다운 (필수)

+

4.7MΩ 저항을 GPIO17(핀 11) ↔ GND 사이에 연결. 고임피던스 센서용으로 반드시 필요.

+
+
+

내부 풀 설정

+

USE_INTERNAL_PULL = False — 내부 풀은 PUD_OFF 유지.

+
+
+

디바운스

+

DEBOUNCE_MS = 500 — 고임피던스 특성상 넉넉하게 설정.

+
+
+

설정 파일

+

전기 파라미터는 raspberry_pi4/config.py (SENSORS · ACTIVE_LOW · USE_INTERNAL_PULL · DEBOUNCE_MS). + 기기별 sensor_id / location은 config_local.py + (Pi-A = id 1 · 1번 지점 · 서버실 / Pi-C = id 3 · 3번 지점 · 신규).

+
+
+ +
+

카메라 (선택 · CAMERA_ENABLED=True)

+

Raspberry Pi 4는 15핀(1.0mm 피치) 표준 CSI 커넥터입니다. Zero 2 W는 22핀(0.5mm)이라 + 리본·카메라보드가 비호환 → Pi 4용 15핀 리본 또는 15↔22 변환 어댑터가 필요합니다. + 촬영은 rpicam-still(Bookworm) / libcamera-still(Bullseye), 640×480 JPEG.

+
+
+ + +
+

6설치 체크리스트

+
    +
  1. Raspberry Pi 전원을 완전히 차단한 상태에서 배선을 시작한다.
  2. +
  3. 헤더 방향(핀 1 위치)을 확인한다. 붉은 점선 표시 = 핀 1.
  4. +
  5. 센서 신호선을 핀 11(GPIO17)에 연결한다.
  6. +
  7. 센서 전원(3.3V)을 핀 1(3V3), 센서 GND를 핀 6(GND)에 연결한다.
  8. +
  9. 외부 4.7MΩ 풀다운을 핀 11 ↔ GND 사이에 연결한다. (필수 · 생략 시 감지 실패)
  10. +
  11. 내부 풀이 꺼져 있는지 확인한다 — USE_INTERNAL_PULL=False (PUD_OFF). 내부 풀다운 절대 금지.
  12. +
  13. config.py 확인: ACTIVE_LOW=False, DEBOUNCE_MS=500, SENSORS에 GPIO17 등록.
  14. +
  15. config_local.py에서 기기별 sensor_id / location 설정 (Pi-A=1/서버실, Pi-C=3/신규).
  16. +
  17. 전원 인가 후, 건조 상태에서 GPIO17 = LOW(0)인지 로그로 확인한다.
  18. +
  19. 물(또는 젖은 천)로 센서를 적셔 GPIO17이 HIGH(1)로 전환되고 누수 이벤트가 기록되는지 확인한다.
  20. +
  21. (선택) 카메라 사용 시 리본 방향·커넥터 규격(15핀 / 어댑터)을 확인하고 640×480 촬영 테스트를 수행한다.
  22. +
+
+ +
+ + diff --git a/raspberry_pi4_sht30/WIRING.html b/raspberry_pi4_sht30/WIRING.html new file mode 100644 index 0000000..528acfa --- /dev/null +++ b/raspberry_pi4_sht30/WIRING.html @@ -0,0 +1,557 @@ + + + + + +온습도 노드 배선·핀맵 — Pi-B / SHT30 (sensor_id=2) + + + +
+ + +
+

현장 설치 문서 · 배선 & 핀맵

+

온습도 노드 — 1번 지점 / 서버실

+

+ SHT30 온습도 센서를 라즈베리파이(Pi-B)의 I2C(버스 1, 주소 0x44)에 연결하는 측정 노드입니다. + 이 노드는 측정값만 5분 주기로 서버에 보고하며, 고온·저온·고습·저습 임계 판정과 SMS 발송은 서버가 담당합니다. +

+
+ Raspberry Pi 4 Model B + BCM2711 + Raspberry Pi OS Bookworm 64-bit + Sensirion SHT30 (한진데이터 P4422-3) + I2C bus 1 + addr 0x44 + sensor_id=2 + 보고 주기 5분 +
+
+ + +
+

240핀 헤더 핀맵 도해 사용 핀만 강조 · 나머지는 회색

+ + + + 40핀 GPIO 헤더 (J8) · 물리 핀 번호 + + + + + + + 1 + 3V3 + + 2 + 5V + + + + 3 + GPIO2 (SDA1) + + 4 + 5V + + + + 5 + GPIO3 (SCL1) + + 6 + GND + + + + 7 + GPIO4 + + 8 + GPIO14 (TXD) + + + + 9 + GND + + 10 + GPIO15 (RXD) + + + + 11 + GPIO17 + + 12 + GPIO18 + + + + 13 + GPIO27 + + 14 + GND + + + + 15 + GPIO22 + + 16 + GPIO23 + + + + 17 + 3V3 + + 18 + GPIO24 + + + + 19 + GPIO10 (MOSI) + + 20 + GND + + + + 21 + GPIO9 (MISO) + + 22 + GPIO25 + + + + 23 + GPIO11 (SCLK) + + 24 + GPIO8 (CE0) + + + + 25 + GND + + 26 + GPIO7 (CE1) + + + + 27 + GPIO0 (ID_SD) + + 28 + GPIO1 (ID_SC) + + + + 29 + GPIO5 + + 30 + GND + + + + 31 + GPIO6 + + 32 + GPIO12 + + + + 33 + GPIO13 + + 34 + GND + + + + 35 + GPIO19 + + 36 + GPIO16 + + + + 37 + GPIO26 + + 38 + GPIO20 + + + + 39 + GND + + 40 + GPIO21 + + + ■ 사각 표시 = 1번 핀 (기판 방향 기준) + + +
+ 3.3V 전원 — 핀 1 + I2C SDA/SCL — 핀 3·5 + GND (사용) — 핀 6 + 대체 GND (선택) — 9·14·20·25·30·34·39 + 미사용 핀 +
+

본 도해의 핀 번호·신호는 Raspberry Pi 4 Model B (BCM2711) 40핀 헤더 표준 배열과 일치합니다.

+
+ + +
+

3핀맵 표 SHT30 → 40핀 헤더

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
신호BCM물리핀비고
3.3V 전원 (VCC)—1★ 반드시 3.3V — 5V(핀 2·4) 연결 금지
I2C 데이터 (SDA)GPIO2 / SDA134.7kΩ 풀업 → 3.3V (모듈 내장 시 생략)
I2C 클럭 (SCL)GPIO3 / SCL154.7kΩ 풀업 → 3.3V (모듈 내장 시 생략)
접지 (GND)—6대체 GND 사용 가능: 9 · 14 · 20 · 25 · 30 · 34 · 39
주소 선택 (ADDR)—GNDADDR → GND ⇒ 0x44 (선택) · ADDR → VDD ⇒ 0x45
+
+ + +
+

4배선 스키매틱 센서 ↔ 헤더 ↔ 풀업 저항

+ + + + + + SHT30 센서 모듈 + Pi 40핀 헤더 + + + VCC + SDA + SCL + GND + ADDR + + + 3V3 (핀 1) + SDA1 (핀 3) + SCL1 (핀 5) + GND (핀 6) + + + + 전원 3.3V + + + + 접지 GND + + + + SDA → GPIO2 + + + + SCL → GPIO3 + + + + ADDR → GND = 0x44 + + + + + + + + + R1 4.7kΩ + + + + + + + + R2 4.7kΩ + + +

+ 풀업 저항 R1·R2 (4.7kΩ ×2) 는 3.3V 레일로 연결됩니다. SHT30 모듈에 내장되어 있으면 생략하십시오. + SDA 선의 반원(hop)은 배선 교차 표시일 뿐 전기적 연결이 아닙니다. +

+
+ + +
+

5전기 설계 · 주의

+ +
+ +
+

치명적 경고 — 전원은 반드시 3.3V

+

SHT30 의 VCC 는 물리 핀 1 (3.3V) 에만 연결하십시오. + 5V (핀 2·4) 연결 절대 금지 — 소자가 즉시 손상될 수 있습니다. + 결선 전 핀 번호를 다시 확인하십시오.

+
+
+ + + +
+# I2C 연결 확인 (0x44 가 표에 보이면 정상) +$ i2cdetect -y 1 + 0 1 2 3 4 5 6 7 8 9 a b c d e f +40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- -- +
+
+ + +
+

6설치 체크리스트

+
    +
  1. 전원 차단 상태에서 배선 작업 (핫플러그 금지)
  2. +
  3. VCC → 물리 핀 1 (3.3V) 연결 — 5V 핀(2·4) 아님을 재확인
  4. +
  5. GND → 물리 핀 6 연결 (대체 GND 사용 시 9·14·20·25·30·34·39)
  6. +
  7. SDA → 핀 3 (GPIO2), SCL → 핀 5 (GPIO3) 연결
  8. +
  9. 풀업 저항 4.7kΩ ×2 를 SDA·SCL → 3.3V 로 연결 (모듈 내장 시 생략)
  10. +
  11. ADDR → GND 확인 (주소 0x44 선택)
  12. +
  13. 결선 전체 재확인 후 Pi 전원 인가
  14. +
  15. I2C 활성화 확인 (raspi-config / dtparam=i2c_arm=on)
  16. +
  17. i2cdetect -y 1 실행 → 0x44 표시 확인
  18. +
  19. config.py / config_local.py 의 I2C_BUS=1, I2C_ADDR=0x44 확인
  20. +
  21. 측정 로그 및 서버 수신 확인 (5분 주기 보고 정상)
  22. +
+
+ + + +
+ + diff --git a/tools/make_deploy_bundles.py b/tools/make_deploy_bundles.py index dde65df..9877395 100644 --- a/tools/make_deploy_bundles.py +++ b/tools/make_deploy_bundles.py @@ -33,7 +33,7 @@ SECRETS_DIR = DEPLOY / ".secrets" # deploy/.secrets/web_dir.txt 에서 로드한다(없으면 랜덤 생성). 아래 DOMAIN 만 수정. DOMAIN = "https://pores.kr" -TEXT_EXTS = {".sh", ".py", ".php", ".service", ".sql", ".md", ".txt", ".example"} +TEXT_EXTS = {".sh", ".py", ".php", ".service", ".sql", ".md", ".txt", ".example", ".html"} EXCLUDE_NAMES = {"__pycache__", ".gitignore", "config_local.py"} BUNDLES = [ @@ -97,9 +97,12 @@ def bcrypt_hash(password: str) -> str: def normalize_lf(path: Path) -> None: - """번들 내 텍스트 파일 CRLF → LF (Pi bash/systemd 오류 방지).""" + """번들 내 텍스트 파일 CRLF → LF (Pi bash/systemd/Apache 오류 방지). + 확장자 없는 설정 dotfile(.htaccess/.gitignore 등)도 확장자와 무관하게 포함한다 + (.htaccess CRLF 는 Apache Header 값에 CR 를 섞을 수 있음).""" + dotfiles = {".htaccess", ".gitignore", ".env.example"} for p in path.rglob("*"): - if p.is_file() and p.suffix in TEXT_EXTS: + if p.is_file() and (p.suffix in TEXT_EXTS or p.name in dotfiles): data = p.read_bytes() if b"\r\n" in data: p.write_bytes(data.replace(b"\r\n", b"\n")) @@ -211,6 +214,8 @@ echo "설치·검증·하드닝 완료. 마무리 리부팅 권장: sudo reboot 사전: Raspberry Pi OS **Bookworm 64-bit**, 사용자 **pi**, SSH 활성(Imager 설정). `config_local.py` 는 이미 채워져 있음(API_KEY/URL/기기 ID). 설치 장소가 바뀌면 DEVICE_LOCATION 만 수정. +📐 **배선·핀맵:** 같은 폴더의 `WIRING.html` 을 브라우저로 열어 확인(자체 완결형 — 오프라인 열람 가능). + ## 원샷 설치 (권장) ```bash