แปลงข้อมูลเซนเซอร์แรงดัน → เส้น "ปริมาณน้ำมัน" ที่การเติมเป็นขั้นตั้งฉาก การใช้เป็นเส้นลาดเรียบ พร้อมตรวจจับการเติม/น้ำมันหายผิดปกติ · อธิบายทุกขั้นตอน ที่มาพารามิเตอร์ และโค้ด 3 แพลตฟอร์มไว้ในที่เดียว
log server VID 109338 · 615 records| # | หลักการ | ทำไมต้องทำ |
|---|---|---|
| 1 | กรองเฉพาะติดเครื่อง — IO_STATUS หลักแรก = 1 | ตอนดับเครื่องเซนเซอร์ค่าเพี้ยน อย่าเอามาคิด |
| 2 | กลับหัว — fuel = BPIV − v, BPIV = min+max | ให้ "เส้นสูง = น้ำมันเยอะ" · คิดจากข้อมูล → ทุกสเกล |
| 3 | ตัดค่าอุปกรณ์ปิด — ต่ำกว่า LOW | ค่าตกวูบใกล้ 0 = เซนเซอร์หลุด ไม่ใช่น้ำมันจริง |
| 4 | ตัด spike — Hampel (median + MAD) | ใช้ robust stats spike จึงไม่ทำลายเกณฑ์ตัวเอง |
| 5 | สมูทแบบแบ่งช่วง — ไม่เฉลี่ยข้ามจุดเปลี่ยน | รักษาขอบขั้นให้คม ไม่กลายเป็นเนินลาด |
| 6-7 | วาดขั้นตั้งฉาก — 2 จุดที่เวลาเดียวกัน | ต้องใช้แกนเวลาแบบตัวเลข ไม่งั้นเส้นเฉียง |
| 8 | แยกเหตุการณ์ตามทิศทาง — เติม(+)/หาย(−) | สวนทางกัน ใช้เกณฑ์เดียว การใช้ปกติไม่ถูกนับ |
ใช้ 4 คอลัมน์: VLCTL_GPS_TIME (เวลา HHMMSS), VLCTL_IO_STATUS (สถานะ), VLCTL_FUEL (AK), VLCTL_ANALOGUE_PORT1 (BD แรงดัน) · AK ค่า 999 = เสีย ตัดทิ้ง
IO_STATUS เขียนเป็นเลขฐานสอง 16 หลัก ถ้าหลักแรก = 1 คือเครื่องติด ตอนดับเครื่องไม่คิดค่าน้ำมัน
// "1000000000000000" → หลักแรก = 1 = ติดเครื่อง
eng = padStart(status, 16, "0")[0] === "1"เซนเซอร์ให้ แรงดันสูง = น้ำมันน้อย เราพลิกด้วยจุดพลิก BPIV ที่คิดจากข้อมูลเอง จึงไม่ผูกสเกล
BPIV = min(ค่าใช้งานได้) + max(ค่าใช้งานได้) fuel = BPIV − voltage // 1.64→ต่ำ(น้ำมันน้อย), 0.90→สูง(น้ำมันเยอะ)
ช่วงเซนเซอร์หลุด แรงดันตกเหลือ ~0.06–0.09 (น้ำมันยังอยู่) ตัดค่าที่ต่ำกว่า LOW ทิ้ง
ดูเพื่อนบ้าน 7 จุด หา median ถ้าจุดไหนห่างจาก median เกิน Sig × (1.4826 × MAD) = spike ตัดทิ้ง
เฉลี่ยเคลื่อนที่ 15 จุด แต่ไม่ข้ามจุดเปลี่ยน — แบ่ง segment ตรงจุดที่ค่าเปลี่ยนเกิน EDGE ก่อน แล้วเฉลี่ยเฉพาะในช่วงเดียวกัน
ค้างค่าเดิมไว้จนถึงเวลาที่เปลี่ยน แล้วแทรก "มุมหัก" 2 จุดที่ เวลาเดียวกัน (ค่าเก่า→ค่าใหม่) เกิดเส้นตั้งฉาก
// คิดเป็นปริมาณน้ำมัน · Δ = ค่าใหม่ − ค่าเก่า ที่จุดเปลี่ยน Δ > +EDGE → ⛽ เติมน้ำมัน ขึ้นฮวบ Δ < −EDGE → ⚠️ น้ำมันหายผิดปกติ ลงฮวบ · รั่ว/ถูกดูด
คั่นจากการใช้ปกติอย่างไร: การใช้น้ำมันปกติลดช้าๆ (~14% ของช่วงต่อจุด, ต่ำกว่า EDGE) จึงไม่ถูกนับ · เฉพาะ ลงเร็วผิดธรรมชาติ เท่านั้นที่เป็น "น้ำมันหาย" · บนกราฟปัก ▲ เขียว = เติม / ▼ แดง = หาย
ค่าที่ hardcode ไม่ได้สุ่มมา — แบ่งเป็น 3 ประเภท: คงที่ทางสถิติ, จากโครงสร้างข้อมูล, และ derive จากช่วงข้อมูลจริง
| ค่า | ประเภท | ที่มา / เหตุผล (อิงข้อมูลจริง) |
|---|---|---|
| 1.4826 | คงที่สถิติ | แปลง MAD → σ สำหรับข้อมูลปกติ (=1/Φ⁻¹(0.75)) ทำให้เกณฑ์เทียบเป็น "กี่ σ" — ห้ามเปลี่ยน |
| Sig = 3 | คงที่สถิติ | กฎ 3 ซิกมา: ห่าง median เกิน 3σ = outlier (~99.7%) · มาตรฐาน Hampel |
| HampelWin = 7 | อิงอัตรา log | ±3 ≈ 3–7 นาที (log ~1จุด/นาที) สั้นพอที่ระดับน้ำมันคงที่ → ค่าที่เบี่ยง = spike |
| SmoothWin = 15 | อิงอัตรา log | ±7 ≈ 15 นาที กลบ jitter รายนาที (~±0.05V) แต่คงเทรนด์การใช้ทั้งวัน |
| LOW = 0.4×median | derive จากข้อมูล | อุปกรณ์ปิดกองใกล้ 0 (0.06–0.09) · ใช้งานจริงกอง ~1.0–1.5 · 40% ตกกลาง gap → LOW=0.596 แยกสะอาด |
| EDGE = 0.2×span | derive จากข้อมูล ⭐ | ใช้ปกติเปลี่ยน ≤14% ของ span · เติมจริง 28–86% · ตั้ง 20% = กึ่งกลาง gap → คั่นได้มีระยะเผื่อ |
| floor = 0.02×span | derive จากข้อมูล | กัน Hampel ตัดแรงตอนข้อมูลนิ่ง (MAD≈0 → เกณฑ์≈0) |
| BPIV = min+max | derive จากข้อมูล | จุดพลิกกลับหัว คิดจากข้อมูลเอง → รองรับทุกสเกล |
| 999 / bit-16 | โครงสร้างข้อมูล | 999 = sentinel AK เสีย · IO_STATUS เป็น bit-field 16 บิต บิตแรก = สตาร์ท/ดับ |
รายละเอียดเต็มพร้อมแท็ก [P1]..[P14] กำกับในโค้ด อยู่ในไฟล์ fuel_graph.sql
เพราะเกณฑ์ทั้งหมดคำนวณจากช่วงข้อมูลจริง ทดสอบกับข้อมูลจริงคูณสเกลต่างๆ ได้ผลเหมือนกันเป๊ะทุกสเกล:
| สเกล | ช่วงค่า BD | LOW | EDGE | ตัดปิด | spike | จับจุดเติม |
|---|---|---|---|---|---|---|
| ×1 (เดิม) | 0.83–1.69 | 0.60 | 0.17 | 69 | 34 | 2 ✓ |
| ×6 (0–10) | 4.98–10.14 | 3.58 | 1.03 | 69 | 34 | 2 ✓ |
| ×0.5 | 0.41–0.84 | 0.30 | 0.09 | 69 | 34 | 2 ✓ |
| แพลตฟอร์ม | ไฟล์ | จุดเด่น / วิธีใช้ |
|---|---|---|
| HTML + Chart.js | fuel_graph.html | เปิดในเบราว์เซอร์ ปรับเกณฑ์ได้สด เห็นผลทันที |
| Google Sheets | Code.gs | วางใน Apps Script → เมนู ⛽ กราฟน้ำมัน → สร้างชีต + กราฟ + ชีต FuelEvents |
| SQL Server | fuel_graph.sql | stored procedure usp_ProcessFuelGraph · set-based · คืนเส้นกราฟ + เหตุการณ์ |
| JS | เทคนิค T-SQL |
|---|---|
| loop + index | ROW_NUMBER() |
median() | PERCENTILE_CONT(0.5) OVER (PARTITION BY..) |
| window ±k | self-join Seq BETWEEN t.Seq−k AND t.Seq+k |
arr[i]−arr[i−1] | LAG() |
| running counter | SUM(..) OVER (ORDER BY.. ROWS UNBOUNDED PRECEDING) |
ไฟล์ทั้งหมด: fuel_graph.html (กราฟ) · data.html (ตาราง) · Code.gs (Google Sheets) · fuel_graph.sql (SQL Server) · Excel ต้นฉบับ
log server VID 109338 · ประมวลผล 615 records