- raspberry_pi4/WIRING.html, raspberry_pi4_sht30/WIRING.html 추가: 자체 완결형(인라인 CSS/SVG, 외부참조 0 → 폐쇄망 오프라인 열람) 40핀 핀맵 도해 + 핀맵 표 + 배선 스키매틱 + 전기설계 경고 + 설치 체크리스트. 인쇄 대응. 누수 노드(Pi-A/Pi-C 공통, GPIO17)·SHT30 노드(I2C1, 0x44) 각 1장. - make_deploy_bundles.py: TEXT_EXTS 에 .html 추가(번들 복사 시 CRLF→LF 정규화), Pi SETUP.md 에 WIRING.html 안내 줄 추가. copy_tree 가 각 Pi 번들에 자동 포함. (동반: 기존 dotfile .htaccess/.gitignore LF 정규화 반영.)
414 lines
34 KiB
HTML
414 lines
34 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ko">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>누수 감지 노드 · 배선 & 핀맵 (Raspberry Pi 4)</title>
|
||
<style>
|
||
:root{
|
||
--bg:#eef1f5; --card:#ffffff; --ink:#212529; --muted:#6b7280; --line:#e5e8ec;
|
||
--sig:#2f9e44; --sig-d:#2b8a3e; --pwr:#e03131; --pwr-d:#c92a2a;
|
||
--gnd:#1971c2; --gnd-d:#1864ab; --exp:#e8590c; --exp-b:#ffa94d;
|
||
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Malgun Gothic","Apple SD Gothic Neo","Noto Sans KR",sans-serif;
|
||
--mono:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;
|
||
}
|
||
*{box-sizing:border-box}
|
||
html,body{margin:0}
|
||
body{font-family:var(--sans);background:var(--bg);color:var(--ink);line-height:1.6;
|
||
-webkit-font-smoothing:antialiased;padding:24px 16px 60px}
|
||
.wrap{max-width:1000px;margin:0 auto}
|
||
svg text{font-family:var(--sans)}
|
||
|
||
/* Header */
|
||
.hero{background:linear-gradient(135deg,#0b2545 0%,#134074 55%,#1971c2 100%);
|
||
color:#fff;border-radius:16px;padding:26px 28px;box-shadow:0 8px 24px rgba(11,37,69,.18)}
|
||
.hero .eyebrow{font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:#a5c4e6;font-weight:700;margin:0 0 6px}
|
||
.hero h1{margin:0 0 10px;font-size:26px;line-height:1.25;font-weight:800}
|
||
.hero p{margin:0 0 16px;font-size:15px;color:#dbe7f5;max-width:70ch}
|
||
.chips{display:flex;flex-wrap:wrap;gap:8px}
|
||
.chip{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);color:#fff;
|
||
border-radius:999px;padding:5px 12px;font-size:12.5px;font-weight:600;white-space:nowrap}
|
||
.chip.mono{font-family:var(--mono);letter-spacing:.02em}
|
||
|
||
/* Section cards */
|
||
section{background:var(--card);border:1px solid var(--line);border-radius:14px;
|
||
padding:22px 24px;margin-top:20px;box-shadow:0 2px 8px rgba(16,24,40,.05)}
|
||
h2{display:flex;align-items:center;gap:12px;margin:0 0 18px;font-size:19px;font-weight:800}
|
||
h2 .num{flex:none;width:30px;height:30px;border-radius:9px;background:#134074;color:#fff;
|
||
font-size:15px;display:flex;align-items:center;justify-content:center;font-weight:800}
|
||
h3{margin:22px 0 10px;font-size:15px;font-weight:700;color:#134074}
|
||
|
||
/* Pinmap block */
|
||
.pinwrap{display:grid;grid-template-columns:minmax(260px,1.15fr) 1fr;gap:24px;align-items:start}
|
||
.diagram{background:#fbfcfd;border:1px solid var(--line);border-radius:12px;padding:14px}
|
||
.legend{display:flex;flex-direction:column;gap:11px}
|
||
.legend .lg{display:flex;align-items:flex-start;gap:11px;font-size:13.5px}
|
||
.sw{flex:none;width:22px;height:22px;border-radius:6px;margin-top:1px}
|
||
.sw.sig{background:var(--sig);border:2px solid var(--sig-d)}
|
||
.sw.pwr{background:var(--pwr);border:2px solid var(--pwr-d)}
|
||
.sw.gnd{background:var(--gnd);border:2px solid var(--gnd-d)}
|
||
.sw.alt{background:#e7f5ff;border:2px dashed #4dabf7}
|
||
.sw.exp{background:#fff4e6;border:2px dashed var(--exp-b)}
|
||
.sw.off{background:#e9ecef;border:2px solid #ced4da}
|
||
.lg b{display:block;font-weight:700}
|
||
.lg span{color:var(--muted);font-size:12.5px}
|
||
.hint{margin-top:6px;font-size:12.5px;color:var(--muted);background:#f8f9fb;border:1px dashed #d5dbe3;
|
||
border-radius:8px;padding:9px 11px}
|
||
|
||
/* Table */
|
||
table{width:100%;border-collapse:collapse;font-size:14px}
|
||
caption{caption-side:bottom;text-align:left;color:var(--muted);font-size:12.5px;padding-top:10px}
|
||
th,td{padding:11px 12px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top}
|
||
thead th{background:#f3f6fa;color:#134074;font-weight:700;font-size:13px;border-bottom:2px solid #d6e0ec}
|
||
td.mono,th.mono{font-family:var(--mono);white-space:nowrap}
|
||
.tag{display:inline-block;font-size:11px;font-weight:700;padding:2px 8px;border-radius:999px;line-height:1.7}
|
||
.tag.sig{background:#e7f6ec;color:var(--sig-d)}
|
||
.tag.pwr{background:#fdecec;color:var(--pwr-d)}
|
||
.tag.gnd{background:#e7f1fb;color:var(--gnd-d)}
|
||
.tag.exp{background:#fff1e3;color:var(--exp)}
|
||
tr.exprow td{background:#fffaf3}
|
||
|
||
/* Electrical notes */
|
||
.notes{display:grid;grid-template-columns:1fr 1fr;gap:14px}
|
||
.note{border:1px solid var(--line);border-left:4px solid #1971c2;border-radius:10px;padding:13px 15px;background:#fbfcfd}
|
||
.note h4{margin:0 0 4px;font-size:14px}
|
||
.note p{margin:0;font-size:13.5px;color:#374151}
|
||
.note code,.inline-code{font-family:var(--mono);background:#eef2f7;padding:1px 6px;border-radius:5px;font-size:12.5px}
|
||
.crit{grid-column:1 / -1;border:2px solid var(--pwr);border-left-width:6px;background:#fff5f5;border-radius:10px;padding:15px 18px}
|
||
.crit .badge{display:inline-block;background:var(--pwr);color:#fff;font-weight:800;font-size:12px;
|
||
padding:3px 11px;border-radius:6px;letter-spacing:.04em;margin-bottom:8px}
|
||
.crit h4{margin:0 0 6px;font-size:16px;color:var(--pwr-d)}
|
||
.crit p{margin:0;font-size:14px;color:#5c1a1a}
|
||
.cam{margin-top:16px;border:1px solid var(--line);border-left:4px solid #7048e8;border-radius:10px;
|
||
padding:13px 16px;background:#fbfaff}
|
||
.cam h4{margin:0 0 6px;font-size:14px;color:#5f3dc4}
|
||
.cam p{margin:0;font-size:13.5px;color:#374151}
|
||
|
||
/* Checklist */
|
||
ol.check{counter-reset:c;list-style:none;margin:0;padding:0}
|
||
ol.check li{position:relative;padding:12px 14px 12px 80px;border-bottom:1px solid #f1f3f5;
|
||
line-height:1.5;font-size:14px}
|
||
ol.check li:last-child{border-bottom:none}
|
||
ol.check li::before{counter-increment:c;content:counter(c);position:absolute;left:12px;top:11px;
|
||
width:26px;height:26px;border-radius:50%;background:#e7f1fb;color:#1971c2;font-weight:800;
|
||
font-size:13px;display:flex;align-items:center;justify-content:center}
|
||
ol.check li::after{content:"";position:absolute;left:50px;top:13px;width:18px;height:18px;
|
||
border:2px solid #adb5bd;border-radius:4px}
|
||
ol.check li.key{background:#fff8f8}
|
||
ol.check li b{color:var(--pwr-d)}
|
||
|
||
@media (max-width:720px){
|
||
.pinwrap{grid-template-columns:1fr}
|
||
.notes{grid-template-columns:1fr}
|
||
.hero h1{font-size:22px}
|
||
}
|
||
|
||
@media print{
|
||
:root{--bg:#fff}
|
||
body{background:#fff;color:#000;padding:0;font-size:12px}
|
||
.wrap{max-width:100%}
|
||
.hero{background:#fff!important;color:#000;border:2px solid #134074;box-shadow:none}
|
||
.hero .eyebrow{color:#134074}.hero p{color:#333}
|
||
.chip{background:#fff;border:1px solid #999;color:#000}
|
||
section{box-shadow:none;border:1px solid #999;page-break-inside:avoid;break-inside:avoid}
|
||
h2 .num{background:#134074!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
|
||
svg{max-width:100%!important;height:auto}
|
||
table,tr,td,th,.note,.crit,.cam,ol.check li{page-break-inside:avoid;break-inside:avoid}
|
||
*{-webkit-print-color-adjust:exact;print-color-adjust:exact}
|
||
.diagram,.note,.crit,.cam{background:#fff}
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="wrap">
|
||
|
||
<!-- 1) HEADER -->
|
||
<header class="hero">
|
||
<p class="eyebrow">Field Wiring & Pinmap · 누수 감지 노드</p>
|
||
<h1>누수 감지 노드 · 배선 & 핀맵</h1>
|
||
<p>e-con 5C-08 저항형 누수감지센서를 <b>GPIO17(물리 핀 11)</b>에 연결하는 표준 배선도입니다.
|
||
Pi-A(sensor_id=1 · 1번 지점 · 서버실)와 Pi-C(sensor_id=3 · 3번 지점 · 신규)는 배선이 동일한 <b>공통 노드</b>입니다.</p>
|
||
<div class="chips">
|
||
<span class="chip">Raspberry Pi 4 Model B</span>
|
||
<span class="chip mono">BCM2711</span>
|
||
<span class="chip">Raspberry Pi OS Bookworm 64-bit</span>
|
||
<span class="chip">e-con 5C-08 · 저항형 ~1.5MΩ</span>
|
||
<span class="chip mono">GPIO17 / 핀11</span>
|
||
<span class="chip">외부 4.7MΩ 풀다운 필수</span>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- 2) 40핀 헤더 핀맵 도해 -->
|
||
<section>
|
||
<h2><span class="num">2</span>40핀 헤더 핀맵 도해</h2>
|
||
<div class="pinwrap">
|
||
<div class="diagram">
|
||
<svg viewBox="0 0 600 681" role="img" aria-label="Raspberry Pi 4 40핀 GPIO 헤더 핀맵" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;max-width:600px;">
|
||
<rect x="70" y="69" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="131" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="193" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="255" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="317" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="379" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="441" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="503" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="565" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="70" y="627" width="460" height="31" fill="#f6f8fa"/>
|
||
<rect x="234" y="30" width="112" height="633" rx="10" fill="#f1f3f5" stroke="#adb5bd" stroke-width="1.5"/>
|
||
<rect x="236" y="36" width="32" height="32" rx="6" fill="none" stroke="#e03131" stroke-width="1.5" stroke-dasharray="3 2"/>
|
||
<text x="252" y="22" text-anchor="middle" font-size="10" fill="#868e96">홀수 핀</text>
|
||
<text x="330" y="22" text-anchor="middle" font-size="10" fill="#868e96">짝수 핀</text>
|
||
<text x="220" y="56" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="700" fill="#7d1616">3V3</text>
|
||
<text x="360" y="56" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">5V</text>
|
||
<circle cx="252" cy="52" r="12" fill="#e03131" stroke="#c92a2a" stroke-width="1.5"/><text x="252" y="55.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#ffffff">1</text>
|
||
<circle cx="330" cy="52" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="55.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">2</text>
|
||
<text x="220" y="87" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO2 (SDA1)</text>
|
||
<text x="360" y="87" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">5V</text>
|
||
<circle cx="252" cy="83" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="86.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">3</text>
|
||
<circle cx="330" cy="83" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="86.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">4</text>
|
||
<text x="220" y="118" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO3 (SCL1)</text>
|
||
<text x="360" y="118" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="700" fill="#123a63">GND</text>
|
||
<circle cx="252" cy="114" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="117.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">5</text>
|
||
<circle cx="330" cy="114" r="12" fill="#1971c2" stroke="#1864ab" stroke-width="1.5"/><text x="330" y="117.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#ffffff">6</text>
|
||
<text x="220" y="149" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO4</text>
|
||
<text x="360" y="149" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO14 (TXD)</text>
|
||
<circle cx="252" cy="145" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="148.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">7</text>
|
||
<circle cx="330" cy="145" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="148.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">8</text>
|
||
<text x="220" y="180" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<text x="360" y="180" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO15 (RXD)</text>
|
||
<circle cx="252" cy="176" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="252" y="179.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">9</text>
|
||
<circle cx="330" cy="176" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="179.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">10</text>
|
||
<text x="220" y="211" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="700" fill="#1b4332">GPIO17</text>
|
||
<text x="360" y="211" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO18</text>
|
||
<circle cx="252" cy="207" r="12" fill="#2f9e44" stroke="#2b8a3e" stroke-width="1.5"/><text x="252" y="210.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#ffffff">11</text>
|
||
<circle cx="330" cy="207" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="210.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">12</text>
|
||
<text x="220" y="242" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#e8590c">GPIO27</text>
|
||
<text x="360" y="242" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<circle cx="252" cy="238" r="12" fill="#fff4e6" stroke="#ffa94d" stroke-width="1.5" stroke-dasharray="3 2"/><text x="252" y="241.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#e8590c">13</text>
|
||
<circle cx="330" cy="238" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="330" y="241.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">14</text>
|
||
<text x="220" y="273" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#e8590c">GPIO22</text>
|
||
<text x="360" y="273" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO23</text>
|
||
<circle cx="252" cy="269" r="12" fill="#fff4e6" stroke="#ffa94d" stroke-width="1.5" stroke-dasharray="3 2"/><text x="252" y="272.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#e8590c">15</text>
|
||
<circle cx="330" cy="269" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="272.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">16</text>
|
||
<text x="220" y="304" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">3V3</text>
|
||
<text x="360" y="304" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO24</text>
|
||
<circle cx="252" cy="300" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="303.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">17</text>
|
||
<circle cx="330" cy="300" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="303.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">18</text>
|
||
<text x="220" y="335" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO10 (MOSI)</text>
|
||
<text x="360" y="335" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<circle cx="252" cy="331" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="334.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">19</text>
|
||
<circle cx="330" cy="331" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="330" y="334.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">20</text>
|
||
<text x="220" y="366" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO9 (MISO)</text>
|
||
<text x="360" y="366" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO25</text>
|
||
<circle cx="252" cy="362" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="365.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">21</text>
|
||
<circle cx="330" cy="362" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="365.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">22</text>
|
||
<text x="220" y="397" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO11 (SCLK)</text>
|
||
<text x="360" y="397" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO8 (CE0)</text>
|
||
<circle cx="252" cy="393" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="396.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">23</text>
|
||
<circle cx="330" cy="393" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="396.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">24</text>
|
||
<text x="220" y="428" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<text x="360" y="428" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO7 (CE1)</text>
|
||
<circle cx="252" cy="424" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="252" y="427.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">25</text>
|
||
<circle cx="330" cy="424" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="427.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">26</text>
|
||
<text x="220" y="459" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO0 (ID_SD)</text>
|
||
<text x="360" y="459" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO1 (ID_SC)</text>
|
||
<circle cx="252" cy="455" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="458.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">27</text>
|
||
<circle cx="330" cy="455" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="458.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">28</text>
|
||
<text x="220" y="490" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO5</text>
|
||
<text x="360" y="490" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<circle cx="252" cy="486" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="489.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">29</text>
|
||
<circle cx="330" cy="486" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="330" y="489.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">30</text>
|
||
<text x="220" y="521" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO6</text>
|
||
<text x="360" y="521" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO12</text>
|
||
<circle cx="252" cy="517" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="520.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">31</text>
|
||
<circle cx="330" cy="517" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="520.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">32</text>
|
||
<text x="220" y="552" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO13</text>
|
||
<text x="360" y="552" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<circle cx="252" cy="548" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="551.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">33</text>
|
||
<circle cx="330" cy="548" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="330" y="551.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">34</text>
|
||
<text x="220" y="583" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO19</text>
|
||
<text x="360" y="583" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO16</text>
|
||
<circle cx="252" cy="579" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="582.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">35</text>
|
||
<circle cx="330" cy="579" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="582.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">36</text>
|
||
<text x="220" y="614" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO26</text>
|
||
<text x="360" y="614" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO20</text>
|
||
<circle cx="252" cy="610" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="252" y="613.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">37</text>
|
||
<circle cx="330" cy="610" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="613.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">38</text>
|
||
<text x="220" y="645" text-anchor="end" font-family="Consolas,monospace" font-size="12" font-weight="600" fill="#1971c2">GND</text>
|
||
<text x="360" y="645" text-anchor="start" font-family="Consolas,monospace" font-size="12" font-weight="400" fill="#adb5bd">GPIO21</text>
|
||
<circle cx="252" cy="641" r="12" fill="#e7f5ff" stroke="#4dabf7" stroke-width="1.5" stroke-dasharray="3 2"/><text x="252" y="644.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#1971c2">39</text>
|
||
<circle cx="330" cy="641" r="12" fill="#e9ecef" stroke="#ced4da" stroke-width="1.5"/><text x="330" y="644.5" text-anchor="middle" font-family="Consolas,monospace" font-size="10" font-weight="700" fill="#868e96">40</text>
|
||
</svg>
|
||
</div>
|
||
<div class="legend">
|
||
<div class="lg"><span class="sw sig"></span><b>신호 (GPIO17 · 핀 11)<span>센서 신호선 입력</span></b></div>
|
||
<div class="lg"><span class="sw pwr"></span><b>전원 3V3 (핀 1)<span>센서 전원 공급</span></b></div>
|
||
<div class="lg"><span class="sw gnd"></span><b>접지 GND (핀 6 · 사용)<span>센서 GND 기본 연결</span></b></div>
|
||
<div class="lg"><span class="sw alt"></span><b>접지 대체 가능<span>핀 9 / 14 / 20 / 25 / 30 / 34 / 39</span></b></div>
|
||
<div class="lg"><span class="sw exp"></span><b>확장 예시 (선택)<span>GPIO27·핀 13, GPIO22·핀 15</span></b></div>
|
||
<div class="lg"><span class="sw off"></span><b>미사용 핀<span>이 노드에서 연결하지 않음</span></b></div>
|
||
<div class="hint">붉은 점선 사각형이 <b>핀 1</b> 위치입니다. 헤더 방향(핀 1 기준)을 반드시 확인하고 배선하세요. 실제 사용 핀은 <b>1 · 6 · 11</b> 세 개뿐입니다.</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 3) 핀맵 표 -->
|
||
<section>
|
||
<h2><span class="num">3</span>핀맵 표</h2>
|
||
<table>
|
||
<thead>
|
||
<tr><th>신호</th><th class="mono">BCM</th><th class="mono">물리 핀</th><th>비고</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><span class="tag sig">신호</span> 센서 신호선</td>
|
||
<td class="mono">GPIO17</td>
|
||
<td class="mono">핀 11</td>
|
||
<td>센서 신호 입력. 외부 4.7MΩ 풀다운을 <b>핀 11 ↔ GND</b> 사이에 연결.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="tag pwr">전원</span> 센서 전원 3.3V</td>
|
||
<td class="mono">3V3</td>
|
||
<td class="mono">핀 1</td>
|
||
<td>센서 VCC 공급. (예비 3V3 = 핀 17)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="tag gnd">접지</span> 센서 GND</td>
|
||
<td class="mono">GND</td>
|
||
<td class="mono">핀 6</td>
|
||
<td>대체 가능: 핀 9 / 14 / 20 / 25 / 30 / 34 / 39 중 아무 GND.</td>
|
||
</tr>
|
||
<tr class="exprow">
|
||
<td><span class="tag exp">확장</span> 추가 센서 예시</td>
|
||
<td class="mono">GPIO27</td>
|
||
<td class="mono">핀 13</td>
|
||
<td>선택. <span class="inline-code">config.py</span>의 SENSORS에 BCM 번호로 추가.</td>
|
||
</tr>
|
||
<tr class="exprow">
|
||
<td><span class="tag exp">확장</span> 추가 센서 예시</td>
|
||
<td class="mono">GPIO22</td>
|
||
<td class="mono">핀 15</td>
|
||
<td>선택. 위와 동일한 방법으로 추가(각 채널마다 외부 풀다운 필요).</td>
|
||
</tr>
|
||
</tbody>
|
||
<caption>사용 핀은 3개(핀 1 · 6 · 11). 확장 행은 다중 센서 구성 시 참고용 예시입니다. 기기별 sensor_id / location은 <span class="inline-code">config_local.py</span>에서 설정.</caption>
|
||
</table>
|
||
</section>
|
||
|
||
<!-- 4) 배선 스키매틱 -->
|
||
<section>
|
||
<h2><span class="num">4</span>배선 스키매틱</h2>
|
||
<div class="diagram">
|
||
<svg viewBox="0 0 640 400" role="img" aria-label="누수센서 배선 스키매틱 — 3V3·GPIO17·GND 및 외부 4.7MΩ 풀다운" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto">
|
||
<!-- Pi header block -->
|
||
<rect x="36" y="70" width="150" height="250" rx="10" fill="#f1f3f5" stroke="#adb5bd" stroke-width="1.5"/>
|
||
<text x="111" y="60" text-anchor="middle" font-size="13" font-weight="700" fill="#212529">Raspberry Pi 4 · 40핀 헤더</text>
|
||
<!-- header pin rows -->
|
||
<circle cx="60" cy="120" r="5" fill="#e03131"/>
|
||
<text x="74" y="124" text-anchor="start" font-family="Consolas,monospace" font-size="12" fill="#212529">핀1 · 3V3</text>
|
||
<rect x="182" y="114" width="10" height="12" rx="2" fill="#e03131"/>
|
||
<circle cx="60" cy="195" r="5" fill="#2f9e44"/>
|
||
<text x="74" y="199" text-anchor="start" font-family="Consolas,monospace" font-size="12" fill="#212529">핀11 · GPIO17</text>
|
||
<rect x="182" y="189" width="10" height="12" rx="2" fill="#2f9e44"/>
|
||
<circle cx="60" cy="270" r="5" fill="#1971c2"/>
|
||
<text x="74" y="274" text-anchor="start" font-family="Consolas,monospace" font-size="12" fill="#212529">핀6 · GND</text>
|
||
<rect x="182" y="264" width="10" height="12" rx="2" fill="#1971c2"/>
|
||
<!-- sensor block -->
|
||
<rect x="470" y="95" width="150" height="190" rx="10" fill="#ffffff" stroke="#495057" stroke-width="1.5"/>
|
||
<text x="545" y="84" text-anchor="middle" font-size="13" font-weight="700" fill="#212529">e-con 5C-08 누수센서</text>
|
||
<rect x="462" y="114" width="10" height="12" rx="2" fill="#e03131"/>
|
||
<text x="484" y="124" text-anchor="start" font-family="Consolas,monospace" font-size="12" fill="#212529">VCC 3.3V</text>
|
||
<rect x="462" y="189" width="10" height="12" rx="2" fill="#2f9e44"/>
|
||
<text x="484" y="199" text-anchor="start" font-family="Consolas,monospace" font-size="12" fill="#212529">SIG 신호</text>
|
||
<rect x="462" y="264" width="10" height="12" rx="2" fill="#1971c2"/>
|
||
<text x="484" y="274" text-anchor="start" font-family="Consolas,monospace" font-size="12" fill="#212529">GND</text>
|
||
<!-- wires -->
|
||
<path d="M192,120 H462" stroke="#e03131" stroke-width="2.5" fill="none"/>
|
||
<path d="M192,195 H462" stroke="#2f9e44" stroke-width="2.5" fill="none"/>
|
||
<path d="M192,270 H462" stroke="#1971c2" stroke-width="2.5" fill="none"/>
|
||
<text x="327" y="111" text-anchor="middle" font-size="11" fill="#c92a2a">3.3V 전원 · 핀1</text>
|
||
<text x="250" y="186" text-anchor="middle" font-size="11" fill="#2b8a3e">신호 · GPIO17 · 핀11</text>
|
||
<text x="250" y="261" text-anchor="middle" font-size="11" fill="#1864ab">GND · 핀6</text>
|
||
<!-- external pulldown between SIG wire and GND wire -->
|
||
<circle cx="340" cy="195" r="4" fill="#2f9e44"/>
|
||
<circle cx="340" cy="270" r="4" fill="#1971c2"/>
|
||
<polyline points="340,199 340,206 330,210 350,218 330,226 350,234 330,242 340,246 340,266" fill="none" stroke="#343a40" stroke-width="2"/>
|
||
<text x="360" y="226" text-anchor="start" font-size="13" font-weight="700" fill="#343a40">4.7MΩ</text>
|
||
<text x="360" y="242" text-anchor="start" font-size="11" fill="#495057">외부 풀다운(필수)</text>
|
||
<!-- internal pull off note -->
|
||
<rect x="60" y="300" width="330" height="26" rx="6" fill="#fff5f5" stroke="#ffa8a8" stroke-width="1.5" stroke-dasharray="4 3"/>
|
||
<text x="72" y="317" text-anchor="start" font-size="11" font-weight="700" fill="#c92a2a">내부 풀 OFF · USE_INTERNAL_PULL=False (PUD_OFF)</text>
|
||
<!-- logic box -->
|
||
<rect x="60" y="350" width="520" height="30" rx="6" fill="#f1f3f5" stroke="#ced4da"/>
|
||
<text x="320" y="369" text-anchor="middle" font-size="11.5" fill="#343a40">건조 → GPIO=LOW(0) · 누수 → GPIO=HIGH(1) · ACTIVE_LOW=False</text>
|
||
</svg>
|
||
</div>
|
||
<div class="hint">동작 원리: 건조 시 센서는 초고임피던스(거의 개방) 상태라 외부 4.7MΩ 풀다운이 GPIO17을 <b>LOW</b>로 유지합니다. 누수로 물이 전극을 연결하면 3.3V가 ~1.5MΩ을 통해 신호선을 끌어올려 GPIO17이 <b>HIGH</b>로 전환됩니다.</div>
|
||
</section>
|
||
|
||
<!-- 5) 전기 설계 · 주의 -->
|
||
<section>
|
||
<h2><span class="num">5</span>전기 설계 · 주의</h2>
|
||
|
||
<div class="crit">
|
||
<span class="badge">★ 절대 주의 · CRITICAL</span>
|
||
<h4>내부 풀다운을 켜지 마세요</h4>
|
||
<p>내부 <b>50kΩ</b> 풀다운을 활성화하면, ~1.5MΩ 고임피던스 센서가 GPIO를 HIGH로 끌어올리지 못해
|
||
<b>누수를 감지하지 못합니다(감지 실패)</b>. 반드시 내부 풀은 <span class="inline-code">PUD_OFF</span>로 끄고,
|
||
<b>외부 4.7MΩ 풀다운만</b> 사용하세요. (<span class="inline-code">USE_INTERNAL_PULL = False</span>)</p>
|
||
</div>
|
||
|
||
<div class="notes" style="margin-top:14px">
|
||
<div class="note">
|
||
<h4>극성 · 로직 레벨</h4>
|
||
<p><span class="inline-code">ACTIVE_LOW = False</span> → 건조 시 <b>GPIO=LOW(0)</b>, 누수 시 <b>GPIO=HIGH(1)</b>.</p>
|
||
</div>
|
||
<div class="note">
|
||
<h4>외부 풀다운 (필수)</h4>
|
||
<p>4.7MΩ 저항을 <b>GPIO17(핀 11) ↔ GND</b> 사이에 연결. 고임피던스 센서용으로 반드시 필요.</p>
|
||
</div>
|
||
<div class="note">
|
||
<h4>내부 풀 설정</h4>
|
||
<p><span class="inline-code">USE_INTERNAL_PULL = False</span> — 내부 풀은 <span class="inline-code">PUD_OFF</span> 유지.</p>
|
||
</div>
|
||
<div class="note">
|
||
<h4>디바운스</h4>
|
||
<p><span class="inline-code">DEBOUNCE_MS = 500</span> — 고임피던스 특성상 넉넉하게 설정.</p>
|
||
</div>
|
||
<div class="note" style="grid-column:1 / -1">
|
||
<h4>설정 파일</h4>
|
||
<p>전기 파라미터는 <span class="inline-code">raspberry_pi4/config.py</span> (SENSORS · ACTIVE_LOW · USE_INTERNAL_PULL · DEBOUNCE_MS).
|
||
기기별 <b>sensor_id / location</b>은 <span class="inline-code">config_local.py</span>
|
||
(Pi-A = id 1 · 1번 지점 · 서버실 / Pi-C = id 3 · 3번 지점 · 신규).</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="cam">
|
||
<h4>카메라 (선택 · CAMERA_ENABLED=True)</h4>
|
||
<p>Raspberry Pi 4는 <b>15핀(1.0mm 피치) 표준 CSI 커넥터</b>입니다. Zero 2 W는 22핀(0.5mm)이라
|
||
리본·카메라보드가 <b>비호환</b> → Pi 4용 <b>15핀 리본</b> 또는 <b>15↔22 변환 어댑터</b>가 필요합니다.
|
||
촬영은 <span class="inline-code">rpicam-still</span>(Bookworm) / <span class="inline-code">libcamera-still</span>(Bullseye), <b>640×480 JPEG</b>.</p>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 6) 설치 체크리스트 -->
|
||
<section>
|
||
<h2><span class="num">6</span>설치 체크리스트</h2>
|
||
<ol class="check">
|
||
<li>Raspberry Pi 전원을 <b>완전히 차단</b>한 상태에서 배선을 시작한다.</li>
|
||
<li>헤더 방향(핀 1 위치)을 확인한다. 붉은 점선 표시 = 핀 1.</li>
|
||
<li>센서 신호선을 <b>핀 11(GPIO17)</b>에 연결한다.</li>
|
||
<li>센서 전원(3.3V)을 <b>핀 1(3V3)</b>, 센서 GND를 <b>핀 6(GND)</b>에 연결한다.</li>
|
||
<li class="key">외부 <b>4.7MΩ 풀다운</b>을 <b>핀 11 ↔ GND</b> 사이에 연결한다. <b>(필수 · 생략 시 감지 실패)</b></li>
|
||
<li class="key">내부 풀이 꺼져 있는지 확인한다 — <span class="inline-code">USE_INTERNAL_PULL=False</span> (PUD_OFF). <b>내부 풀다운 절대 금지.</b></li>
|
||
<li><span class="inline-code">config.py</span> 확인: <span class="inline-code">ACTIVE_LOW=False</span>, <span class="inline-code">DEBOUNCE_MS=500</span>, SENSORS에 GPIO17 등록.</li>
|
||
<li><span class="inline-code">config_local.py</span>에서 기기별 <b>sensor_id / location</b> 설정 (Pi-A=1/서버실, Pi-C=3/신규).</li>
|
||
<li>전원 인가 후, <b>건조 상태</b>에서 GPIO17 = <b>LOW(0)</b>인지 로그로 확인한다.</li>
|
||
<li>물(또는 젖은 천)로 센서를 적셔 GPIO17이 <b>HIGH(1)</b>로 전환되고 누수 이벤트가 기록되는지 확인한다.</li>
|
||
<li>(선택) 카메라 사용 시 리본 방향·커넥터 규격(15핀 / 어댑터)을 확인하고 640×480 촬영 테스트를 수행한다.</li>
|
||
</ol>
|
||
</section>
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|