LIVE ⚠ ข้อมูลค้าง (3638m) v3.1.0 · logic audited

แผนบูรณาการองค์ความรู้สู่รายวิชา
เทศบาลเมืองตาก — ระบบ IoT & AI คุณภาพอากาศ

ข้อมูลจริงตาม cadence ที่ตรวจพบของแต่ละสถานี · แยกค่าทันทีออกจากค่าเฉลี่ย 24 ชั่วโมง · UNESCO GNLC 2025 · SDG 3 · 4 · 11 · 13

อัปเดตล่าสุด: 11:20:29 · 23 September 2026
4
สถานี
ตรวจวัด
12
รายวิชา
บูรณาการ
ข้อมูล 24h
coverage 0%
10+
พารามิเตอร์
24/7
For teachers

เริ่มจากคำถามเดียว

วันนี้อากาศเหมาะกับกิจกรรมกลางแจ้งไหม แล้วให้แต่ละวิชาช่วยตอบด้วยข้อมูลคนละมุม

For students

อ่านข้อมูลจริงก่อนสูตร

แยกค่าทันทีออกจากค่าเฉลี่ย 24 ชม. ตรวจ coverage แล้วจึงใช้ SD, AQI และ Heat Index ในบทเรียน

Data quality

ตรวจความสดของข้อมูลก่อนสอน

ข้อมูลค้างเกิน 15 นาที ควรใช้กราฟย้อนหลังหรือสลับเป็นกิจกรรมวิเคราะห์ข้อมูลเดิม

Outcome

จาก STEM สู่พลเมืองเรียนรู้

ปลายทางไม่ใช่แค่ทำกราฟ แต่ให้นักเรียนเสนอ protocol, policy และการสื่อสารต่อชุมชนได้

ภาพรวมระบบ — System Architecture

เครือข่ายตรวจวัดคุณภาพอากาศ เทศบาลเมืองตาก

ระบบ IoT 4 สถานีที่เปิดใช้งาน ประเมินรอบส่งจาก median gap ล่าสุดของแต่ละสถานี (สถานีตัวอย่าง: 10 นาที/ครั้ง) ผ่าน WiFi → Cloud Server → Dashboard สาธารณะ

📡
ESP32 + Sensors
PMS7003 · BME688 · SCD30
📶
WiFi / JSON
HTTPS POST · cadence แยกตามสถานี
🗄️
PHP + MariaDB
tb1.ac.th Server
📊
Web Dashboard
Real-time + Historical
🤖
AI Tutor
Ollama + Qwen 2.5
สถานีตรวจวัด
โรงเรียน เทศบาล 1 กิตติขจร
TH-TAK-TB1-001 · อัปเดต 2026-09-20 22:42
PM2.5 ทันที: 2.0 µg/m³
เฉลี่ย 24 ชม.: — µg/m³ · AQI US: (coverage ไม่พอ)
Temp: 25.3°C · Humidity: 44% · Heat Index: 25.2°C 🟢 ต่ำกว่า Caution
CO₂: — ppm · PM10: 0.0 µg/m³
สถานะ: 🟠 Stale · อายุข้อมูล 3638 นาที
Coverage 24h: 0% · WHO ratio:
โรงเรียนเทศบาล 2 วัดดอนมูลชัย
TH-TAK-TB2-001 · อัปเดต 2026-09-23 11:16
PM2.5 ทันที: 2.7 µg/m³
เฉลี่ย 24 ชม.: 1.7 µg/m³ · AQI US: 9 (ดี)
Temp: 32.5°C · Humidity: 66% · Heat Index: 40.5°C 🟠 Extreme caution
CO₂: 409 ppm · PM10: 8.0 µg/m³
สถานะ: 🟢 Online · อายุข้อมูล 4 นาที
Coverage 24h: 99% · WHO ratio: 0.1×
โรงเรียนเทศบาล 3 วัดชัยชนะสงคราม
TH-TAK-TB3-001 · อัปเดต 2026-09-23 11:15
PM2.5 ทันที: 8.1 µg/m³
เฉลี่ย 24 ชม.: 4.4 µg/m³ · AQI US: 24 (ดี)
Temp: 31.4°C · Humidity: 69% · Heat Index: 38.5°C 🟠 Extreme caution
CO₂: 430 ppm · PM10: 20.0 µg/m³
สถานะ: 🟢 Online · อายุข้อมูล 5 นาที
Coverage 24h: 99% · WHO ratio: 0.3×
โรงเรียนเทศบาล 4 รัตนวิทยานุสรณ์
TH-TAK-TB4-001 · อัปเดต 2026-09-23 11:20
PM2.5 ทันที: 4.1 µg/m³
เฉลี่ย 24 ชม.: 1.7 µg/m³ · AQI US: 9 (ดี)
Temp: 30.7°C · Humidity: 71% · Heat Index: 37.2°C 🟠 Extreme caution
CO₂: 508 ppm · PM10: 12.0 µg/m³
สถานะ: 🟢 Online · อายุข้อมูล 0 นาที
Coverage 24h: 100% · WHO ratio: 0.1×
🤔 คำถามกระตุ้นความคิด — เปรียบเทียบสถานีบนฐานเวลาเดียวกัน
ระยะ Haversine: 4.69 km จากพิกัดในทะเบียนสถานี
ข้อมูล 24 ชม. ของอย่างน้อยหนึ่งสถานียังไม่ถึง coverage 75% จึงยังไม่คำนวณความต่างต่อระยะทาง
● LIVE ข้อมูลจริงจากเซ็นเซอร์

ค่าล่าสุดจาก เซ็นเซอร์จริง — ใช้ในบทเรียนทุกวิชา

หน้าเว็บตรวจข้อมูลใหม่ทุก 60 วินาที · ค่าทันทีใช้ดูการเปลี่ยนแปลง ส่วน AQI/WHO ใช้ค่าเฉลี่ย 24 ชั่วโมงเมื่อ coverage ≥75%

🌫️
2.0µg/m³
PM2.5
AQI 24h — · coverage 0%
🌡️
25.3°C
อุณหภูมิ
BME688
💧
44%RH
ความชื้นสัมพัทธ์
Relative Humidity
🫁
ppm
CO₂
รอข้อมูล
☁️
0.0µg/m³
PM10
ฝุ่นหยาบ ≤10 µm
🥵
25.2°C
Heat Index
🟢 ต่ำกว่า Caution
📊

สถิติ 24 ชั่วโมงล่าสุด ● ข้อมูลจริง PM2.5 จาก โรงเรียน เทศบาล 1 กิตติขจร · 0/144 รอบ · coverage 0%

µg/m³
ค่าเฉลี่ย (x̄)
µg/m³
มัธยฐาน (Median)
µg/m³
SD (σ)
µg/m³
สูงสุด (Max)
µg/m³
ต่ำสุด (Min)
r (PM2.5 vs Temp)
ค่าทันที PM2.5 — 24 ชั่วโมงล่าสุด (เส้นมาตรฐานเป็นเพียงบริบท 24h)
PM2.5 เฉลี่ยรายชั่วโมง — Diurnal Pattern
CO₂ เฉลี่ยรายชั่วโมง — ตัวชี้วัดประกอบการระบายอากาศ
PM2.5 เฉลี่ยรายวัน — 7 วันเต็มล่าสุด (ไม่รวมวันนี้)
วิธีอ่านกราฟและการคำนวณ: แนวโน้ม 24 ชั่วโมงใช้ข้อมูลดิบจาก pm_readings_v2 เรียงตามเวลาและสุ่มลดจุดเพื่อให้กราฟลื่น; Diurnal Pattern คือค่าเฉลี่ย PM2.5/CO₂ แยกตามชั่วโมงของวันนี้; กราฟ 7 วันใช้วันเต็ม 7 วันล่าสุดและไม่รวมวันปัจจุบัน; AQI คำนวณจากค่าเฉลี่ยเคลื่อนที่ 24 ชั่วโมงเมื่อ coverage ≥75% และแยก US EPA 2024 กับ Thai PCD; Heat Index ใช้ขั้นตอน NWS simple formula/Rothfusz ภายใต้สมมติฐานร่มและลมอ่อน; Pearson r ใช้เฉพาะคู่ข้อมูล valid ในช่วง 24 ชั่วโมงล่าสุด เป็นสถิติเชิงพรรณนา ไม่ใช่หลักฐานเหตุ-ผล; CO₂ เป็นตัวชี้วัดประกอบเรื่องการระบายอากาศ ไม่ใช่คะแนนคุณภาพอากาศภายในทั้งหมด
คณิตศาสตร์ · วิทยาศาสตร์

สูตรคำนวณ AQI พร้อมตัวอย่างจากข้อมูลจริง

เปรียบเทียบ US EPA AQI, Thai AQI และแนวทาง WHO — ฐาน PM2.5 เฉลี่ย 24 ชม. = — µg/m³ · coverage 0%

US AQI 0–50
Good
51–100
ปานกลาง
101–150
กลุ่มเสี่ยง
151–200
มีผลต่อสุขภาพ
201–500
อันตราย
ฐานการคำนวณ: ใช้ PM2.5 เฉลี่ยเคลื่อนที่ 24 ชั่วโมงจากสถานีที่เลือก จำนวน 0/144 รอบ (coverage 0%). US EPA ต้อง truncate ความเข้มข้นเหลือ 0.1 µg/m³ ก่อน interpolation; WHO 15 µg/m³ เป็นแนวทางค่าเฉลี่ย 24 ชั่วโมงและ 99th percentile ไม่ใช่ระบบ AQI หรือเส้นตัดสินจากค่าทันที
1

US EPA AQI — มาตรฐานสหรัฐอเมริกา PM2.5 เฉลี่ย 24 ชม. = — µg/m³ → AQI = (ข้อมูลยังไม่ครบ 75%)

📐 สูตร US EPA AQI — Linear Interpolation
\[AQI = \frac{I_{Hi} - I_{Lo}}{BP_{Hi} - BP_{Lo}} \times (C_p - BP_{Lo}) + I_{Lo}\]
📖 คำอธิบายตัวแปร — ค่าตัวอย่างจากข้อมูลจริง PM2.5 = 15.0 µg/m³
สัญลักษณ์ ชื่อ คำอธิบาย หน่วย ค่าจริง
\(C_p\) Concentration ค่า PM2.5 จากเซ็นเซอร์ (ค่าเฉลี่ย 24h) µg/m³ 15.0
\(BP_{Lo}\) Breakpoint Low ขอบล่างของช่วงที่ \(C_p\) ตกอยู่ µg/m³ 9.1
\(BP_{Hi}\) Breakpoint High ขอบบนของช่วงที่ \(C_p\) ตกอยู่ µg/m³ 35.4
\(I_{Lo}\) Index Low ค่า AQI ที่ตรงกับ \(BP_{Lo}\) 51
\(I_{Hi}\) Index High ค่า AQI ที่ตรงกับ \(BP_{Hi}\) 100
\(AQI\) Air Quality Index ผลลัพธ์ 0–500 62
แบบฝึกหัด — คำนวณ AQI จากค่าเฉลี่ย 24 ชม. (— µg/m³)

📋 ตาราง Breakpoint PM2.5 — US EPA (2024)

Category BPLo BPHi ILo IHi สี
Good 0.0 9.0 0 50
Moderate 9.1 35.4 51 100
Unhealthy for Sensitive 35.5 55.4 101 150
Unhealthy 55.5 125.4 151 200
Very Unhealthy 125.5 225.4 201 300
Hazardous 225.5 325.4 301 500
📚 อ้างอิง: US EPA AQI Breakpoints · PM2.5 averaging time 24 HOUR
2

Thai PCD AQI — กรมควบคุมมลพิษ AQI Thai = 0 · เกณฑ์ต่างจาก EPA

📐 สูตรเดียวกับ EPA แต่ Breakpoint ต่างกัน
\[AQI_{Thai} = \frac{I_{Hi} - I_{Lo}}{BP_{Hi} - BP_{Lo}} \times (C_p - BP_{Lo}) + I_{Lo}\]
Thai AQI และ US EPA AQI เป็นดัชนีคนละระบบ; WHO 15 µg/m³ เป็นแนวทางสุขภาพค่าเฉลี่ย 24 ชม. จึงไม่ควรเรียกรวมว่า “AQI 3 มาตรฐาน”
🤔 เปรียบเทียบ 2 ระบบ AQI กับ 1 แนวทาง — PM2.5 เฉลี่ย 24 ชม. = — µg/m³
US EPA: AQI = 0 (ข้อมูลยังไม่ครบ 75%)
Thai PCD: AQI = 0
WHO 2021: อัตราส่วนต่อแนวทาง 24h = 0.00× (15 µg/m³; 99th percentile)
บทเรียน: ค่าเท่ากัน แต่ "ระดับ" ต่างตามมาตรฐาน — นักเรียนต้องรู้ว่าดูมาตรฐานไหน
คณิตศาสตร์ ม.1–6 · Data Analytics

สถิติจาก ข้อมูล 24 ชั่วโมงจริง

ข้อมูล PM2.5 จำนวน 0 รายการ จากสถานี โรงเรียน เทศบาล 1 กิตติขจร

📐 สูตรที่ 1 — ค่าเฉลี่ยเลขคณิต (Arithmetic Mean)
\[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\]
✏️ ผลจากข้อมูลจริง 24h (n = 0)
\[\bar{x} = —\;\mu g/m^3\]
📐 สูตรที่ 2 — ส่วนเบี่ยงเบนมาตรฐาน (Standard Deviation)
\[s = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n-1}}\]
✏️ ผลจากข้อมูลจริง
\[s = —\;\mu g/m^3\]
📐 สูตรที่ 3 — เปอร์เซ็นไทล์ & IQR (v3.0 ใหม่)
\[Q_1 = P_{25}, \qquad Q_3 = P_{75}, \qquad IQR = Q_3 - Q_1\] \[\text{ค่าผิดปกติ (Outlier)}: x < Q_1 - 1.5 \times IQR \quad \text{หรือ} \quad x> Q_3 + 1.5 \times IQR\]
✏️ Percentile จากข้อมูลจริง 24h
📐 สูตรที่ 4 — Z-score ตรวจจับค่าผิดปกติ (v3.0 ใหม่)
\[z = \frac{x - \bar{x}}{s}\]
|z| > 2 หรือ 3 ใช้เป็น screening flag ตามบริบท ไม่ใช่หลักฐานว่าเกิดไฟไหม้/การเผา และไม่เท่ากับความน่าจะเป็น 95% หากข้อมูลไม่เป็น Normal distribution
📐 สูตรที่ 5 — สัมประสิทธิ์สหสัมพันธ์ Pearson (r)
\[r = \frac{n\sum x_i y_i - (\sum x_i)(\sum y_i)}{\sqrt{[n\sum x_i^2-(\sum x_i)^2][n\sum y_i^2-(\sum y_i)^2]}}\]
🤔 ตีความผล r = (รอข้อมูล) (PM2.5 กับ Temperature)
→ ต้องการข้อมูลอย่างน้อย 3 รายการในการคำนวณ
Advanced Math · วิทยาการคำนวณ ม.4–6

Kalman Filter — กรองสัญญาณรบกวนจากเซ็นเซอร์

สาธิต Kalman Filter 1D กับค่าจริงจาก PMS7003 เพื่อเรียนรู้การกรองสัญญาณ; ค่าพารามิเตอร์ Q/R ด้านล่างเป็นสมมติฐานการสอน ไม่ใช่ค่าที่สอบเทียบแล้ว

📐 Kalman Filter 1D — Predict
\[\hat{x}_{k|k-1} = \hat{x}_{k-1|k-1} \qquad P_{k|k-1} = P_{k-1|k-1} + Q\]
📐 Kalman Filter 1D — Update
\[K_k = \frac{P_{k|k-1}}{P_{k|k-1} + R}\] \[\hat{x}_{k|k} = \hat{x}_{k|k-1} + K_k \cdot (z_k - \hat{x}_{k|k-1})\] \[P_{k|k} = (1 - K_k) \cdot P_{k|k-1}\]
📖 คำอธิบายตัวแปร Kalman Filter — ค่าจากเซ็นเซอร์จริง + พารามิเตอร์สาธิต
สัญลักษณ์ ชื่อ (EN) คำอธิบาย ค่าในระบบ
\(z_k\) Measurement ค่าดิบจากเซ็นเซอร์ PMS7003 ณ เวลา k 2.0
\(K_k\) Kalman Gain "เชื่อใคร?" K→1 เชื่อเซ็นเซอร์, K→0 เชื่อค่าทำนาย 0.5025
\(Q\) Process Noise "ค่าจริงเปลี่ยนเร็วแค่ไหน" Q สูง = กรองเบา 0.01 (สมมติ)
\(R\) Measurement Noise "เซ็นเซอร์คลาดเคลื่อนแค่ไหน" R สูง = ไม่เชื่อเซ็นเซอร์ 1.0 (สมมติ)
\(\hat{x}_{k|k}\) Updated Estimate ผลลัพธ์สุดท้าย — ค่ากรองแล้ว
✏️ แบบฝึกหัด: ค่าป้อนจริง + Q/R สำหรับสาธิต
กำหนด: \(\hat{x}_0=50.0,\ P_0=1,\ Q=0.01,\ R=1.0\) · ค่าจากเซ็นเซอร์: \(z_1=2.0\) µg/m³

1
Predict: \(\hat{x}_{1|0}=50.0\), \(P_{1|0}=1+0.01=1.01\)
2
Kalman Gain: \[K_1 = \frac{1.01}{1.01+1.0} = 0.5025\]
3
Update: \[\hat{x}_{1|1} = 50.0 + 0.5025 \times (2.0-50.0)\]
= 25.87
เซ็นเซอร์บอก 2.0 µg/m³ แต่ Kalman กรองเป็น 25.87 µg/m³
ข้อจำกัด: ก่อนใช้ผลกรองเป็นข้อมูลรายงาน ต้องประมาณ Q/R จาก residual เทียบเครื่องอ้างอิง ตรวจ lag/step response และเก็บข้อมูลดิบไว้เสมอ การที่กราฟนิ่งขึ้นไม่ได้แปลว่าแม่นยำขึ้น
// C++ ตัวอย่างสำหรับห้องเรียน — ต้อง validate ก่อนใช้จริง class KalmanFilter { float x_est, P_est, Q, R; public: KalmanFilter(float q, float r, float x0=0) : Q(q), R(r), x_est(x0), P_est(1) {} float update(float z) { float P_pred = P_est + Q; // Predict float K = P_pred/(P_pred+R); // Gain x_est += K * (z - x_est); // Update P_est = (1-K) * P_pred; // Covariance return x_est; } }; // พารามิเตอร์สาธิต ไม่ใช่ผลสอบเทียบ KalmanFilter pm25Filter(0.01, 1.0, 50.0); float filtered = pm25Filter.update(2.0); // → 25.87 µg/m³
กลุ่มสาระวิทยาศาสตร์ ม.1–6

บทเรียน วิทยาศาสตร์ — หลักการทำงานของเซ็นเซอร์

PMS7003
Plantower — Laser Scattering
วัดค่า: PM1.0 · PM2.5 · PM10
ช่วงวัด: 0–500 µg/m³
Interface: UART 9600 bps
ค่าล่าสุด: 2.0 µg/m³
BME688
Bosch — MEMS 4-in-1 Gas Sensor
วัดค่า: Temp · Humidity · Pressure · Gas
Interface: I2C 0x77
ล่าสุด: 25.3°C / 44%
SCD30
Sensirion — NDIR CO₂
วัดค่า: CO₂ · Temp · Humidity
ช่วงวัด: 400–10,000 ppm · ±30 ppm
ล่าสุด: 0 ppm
🔬 Mie Scattering (PMS7003)
\[I \propto \frac{d^6}{\lambda^4}\]
I = ความเข้มแสงกระเจิง · d = เส้นผ่านศูนย์กลาง · λ = ความยาวคลื่น Laser (~650 nm)
🔬 Beer-Lambert Law (SCD30 NDIR)
\[A = \varepsilon \cdot c \cdot l\]
A = Absorbance · ε = สัมประสิทธิ์ดูดกลืน · c = ความเข้มข้น CO₂ · l = ระยะทางแสง
🥵

Heat Index — ดัชนีความร้อน (v3.0 ใหม่) วัดจาก BME688 จริง → อุณหภูมิที่ "รู้สึก" จริงเมื่อรวมความชื้น

📐 Rothfusz Regression (NOAA/NWS)
\[HI = c_1 + c_2 T + c_3 R + c_4 TR + c_5 T^2 + c_6 R^2 + c_7 T^2 R + c_8 T R^2 + c_9 T^2 R^2\]
T = อุณหภูมิ (°F) · R = ความชื้นสัมพัทธ์ (%) · c₁…c₉ = สัมประสิทธิ์ Rothfusz
✏️ Heat Index จากข้อมูลจริง
Temp: 25.3°C · RH: 44%
Heat Index = 25.2°C 🟢 ต่ำกว่า Caution
→ ต่างจากอุณหภูมิจริง 0.1°C
สูตร NWS นี้ใช้สำหรับร่มและลมอ่อน ไม่รวมรังสีแดด เสื้อผ้า ภาระงาน หรือการปรับตัวต่ออากาศร้อน
ระดับ Heat Index (°C) อาการ คำแนะนำ
🟢 ต่ำกว่า Caution < 27 ต่ำกว่าช่วงเตือนของตาราง NWS ยังต้องดูแดด ลม ระยะเวลา และอาการ
🟡 Caution 27–32 อ่อนเพลีย ถ้าออกกำลังนาน ดื่มน้ำบ่อย พักเป็นช่วง
🟠 Extreme caution 32–41 ตะคริว เพลียแดด ลดกิจกรรม ย้ายเข้าร่ม
🔴 อันตราย 41–54 ลมแดด งดกิจกรรม เข้าอาคาร
🟣 อันตรายมาก > 54 อันตรายถึงชีวิต อยู่ในอาคารเท่านั้น
📚 อ้างอิง: US National Weather Service — Heat Index Equation · ค่ากลางแจ้งสำหรับร่ม/ลมอ่อน; ไม่แทน WBGT
กลุ่มสาระคณิตศาสตร์ ม.1–6

บทเรียน คณิตศาสตร์ จากข้อมูลจริง

ทุกโจทย์ใช้ข้อมูลจากเซ็นเซอร์จริง — ไม่ใช่ตัวเลขสมมุติ

1

สมการเชิงเส้นจากสูตร AQI (ม.2–3)เปลี่ยนสูตร AQI ให้อยู่ในรูป y = mx + b

📐 AQI ในรูปสมการเชิงเส้น
\[y = mx + b \qquad m = \frac{I_{Hi}-I_{Lo}}{BP_{Hi}-BP_{Lo}} \qquad b = I_{Lo} - m \cdot BP_{Lo}\]
✏️ ช่วง BP 9.1–35.4
\[m = \frac{100-51}{35.4-9.1} = 1.863, \qquad b = 51 - 1.863 \times 9.1 = 34.0\]
AQI = 1.863 × PM2.5 + 34.0
แทนค่าเฉลี่ย 24h (0.0 µg/m³): AQI ≈ 0
2

Haversine Formula — ระยะห่าง 2 สถานี (ม.4–6)ใช้พิกัด GPS จริงคำนวณระยะทางบนผิวโลก

📐 Haversine Formula
\[d = 2R \arcsin\sqrt{\sin^2\!\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cos\phi_2 \sin^2\!\left(\frac{\Delta\lambda}{2}\right)}\]
📖 ตัวแปร Haversine — พิกัดจริงของ 2 สถานี
สัญลักษณ์ ชื่อ ค่าจริง
\(R\) รัศมีโลก 6,371 km
\(\phi_1\) โรงเรียน เทศบาล 1 กิตติขจร 16.867284°, 99.127582°
\(\phi_2\) โรงเรียนเทศบาล 2 วัดดอนมูลชัย 16.903990°, 99.105876°
\(d\) ระยะทาง 4.690 km
ยังไม่คำนวณความต่างต่อระยะทาง เพราะ coverage 24 ชม. ของทั้งสองสถานียังไม่ครบขั้นต่ำ 75%
3

ร้อยละและอัตราส่วน — WHO Ratio (ม.1–2)เปรียบเทียบค่าจริงกับเกณฑ์มาตรฐาน

ยังไม่คำนวณ WHO ratio เพราะข้อมูล 24 ชั่วโมงมี coverage 0% ซึ่งต่ำกว่าเกณฑ์ความพร้อม 75%
วิทยาการคำนวณ ม.1–6

บทเรียน Coding & IoT — ตัวอย่างที่ตรวจสอบความถูกต้อง

C

ESP32 — อ่าน PM2.5 จาก PMS7003C++ · Bit Manipulation · UART Protocol

// ตัวอย่างอ่าน PMS7003 — ตรวจ frame length และ checksum ก่อนใช้ค่า #include <HardwareSerial.h> HardwareSerial pms(2); // Serial2 uint8_t frame[32]; size_t pos = 0; void setup() { Serial.begin(115200); pms.begin(9600, SERIAL_8N1, 25, 26); } void loop() { while (pms.available()) { uint8_t b = pms.read(); if (pos == 0 && b != 0x42) continue; if (pos == 1 && b != 0x4D) { pos = (b == 0x42) ? 1 : 0; continue; } frame[pos++] = b; if (pos == 32) { uint16_t frameLen = (frame[2] << 8) | frame[3]; uint16_t sum = 0; for (int i = 0; i < 30; i++) sum += frame[i]; uint16_t expected = (frame[30] << 8) | frame[31]; if (frameLen == 28 && sum == expected) { uint16_t pm25 = (frame[12] << 8) | frame[13]; Serial.printf("PM2.5=%d µg/m³\n", pm25); // ค่าทันที: 2 µg/m³ } pos = 0; } } }
📖 คำอธิบายคำสั่งสำคัญ
คำสั่ง ชื่อ คำอธิบาย
0x42, 0x4D Header Bytes สัญญาณเริ่มต้น packet ของ PMS7003 (ASCII "BM")
<< 8 Bit Shift Left เลื่อนบิตซ้าย 8 ตำแหน่ง = คูณ 256 รวม High+Low byte
frame[12], frame[13] Data Position ตำแหน่ง byte 12-13 = ค่า PM2.5 atmospheric ใน packet 32 bytes
Σ byte 0–29 Checksum ต้องเท่ากับ byte 30–31 และ frame length ต้องเป็น 28 มิฉะนั้นต้องทิ้ง frame
🐍

Python — วิเคราะห์ข้อมูลเซ็นเซอร์pandas · matplotlib · scipy · ข้อมูลจาก API จริง

# ดึงข้อมูลจาก API และแยกค่าทันทีกับค่าเฉลี่ย 24 ชั่วโมง import pandas as pd import requests, matplotlib.pyplot as plt url = "https://tb1.ac.th/tak-aqm/integration_lessons.php?api=chart&station=TH-TAK-TB1-001" r = requests.get(url, timeout=15) r.raise_for_status() df = pd.DataFrame(r.json()) df['reading_time'] = pd.to_datetime(df['reading_time']) df['pm25'] = pd.to_numeric(df['pm2_5_compensated'], errors='coerce') df['temperature'] = pd.to_numeric(df['temperature'], errors='coerce') df['temperature'] = df['temperature'].where(df['temperature'].between(-40, 85)) df = df[df['pm25'].between(0, 1000)].sort_values('reading_time') df = df.set_index('reading_time') df['pm25_24h'] = df['pm25'].rolling('24h', min_periods=108).mean() # สถิติ print(f"Mean: {df['pm25'].mean():.2f}") # → 0.00 print(f"SD: {df['pm25'].std():.2f}") # → 0.00 print(f"r: {df['pm25'].corr(df['temperature']):.3f}") # → — # Z-score screening — ใช้ค้นจุดที่ควรตรวจ ไม่ใช่ข้อสรุปสาเหตุ df['z_score'] = (df['pm25'] - df['pm25'].mean()) / df['pm25'].std(ddof=1) anomalies = df[df['z_score'].abs() > 2] print(f"Anomalies: {len(anomalies)}") # วาดกราฟ fig, ax = plt.subplots(figsize=(10, 4)) ax.plot(df.index, df['pm25'], color='#93C5FD', alpha=.45, label='instantaneous') ax.plot(df.index, df['pm25_24h'], color='#2563EB', label='rolling 24h') ax.axhline(y=37.5, color='red', ls='--', label='Thai 24h reference') ax.axhline(y=15, color='green', ls='--', label='WHO 24h guideline') plt.tight_layout(); plt.show()
ตัวอย่างนี้ใช้ cadence ที่ตรวจพบของ TH-TAK-TB1-001 (10 นาที/ครั้ง) จึงคาด 144 จุด/24 ชม. และกำหนดขั้นต่ำ 108 จุด = coverage 75% ก่อนแสดงค่า rolling 24h
กลุ่มสาระสังคมศึกษาฯ ม.1–6

บทเรียน สังคมศึกษา — SDGs, สิ่งแวดล้อม & ธรรมาภิบาล

3 สุขภาพดี
4 การศึกษา
11 เมืองยั่งยืน
13 ภูมิอากาศ
17 ความร่วมมือ

SDG 3 + 13 — สุขภาพ & สิ่งแวดล้อม

บริบทสุขภาพ: WHO ประเมินการเสียชีวิตก่อนวัยราว 7 ล้านคน/ปีจากผลรวมมลพิษอากาศภายนอกและในครัวเรือน ไม่ใช่ค่าที่อนุมานจากเซ็นเซอร์หน้านี้
ข้อมูลวันนี้: PM2.5 เฉลี่ย = 0.0 µg/m³
โจทย์วิจัยท้องถิ่น: ตรวจข้อมูลย้อนหลังรายเดือนร่วมกับจุดความร้อน ลม และฝน ก่อนสรุปรูปแบบฤดูกาลของจังหวัดตาก

SDG 11 — เมืองยั่งยืน & ธรรมาภิบาล

บทบาทเทศบาล: ตาม พ.ร.บ.สิ่งแวดล้อมแห่งชาติ
ระบบของเรา: ใช้ข้อมูลเซ็นเซอร์เป็นหลักฐานสนับสนุนหลังตรวจ coverage/คุณภาพ ไม่ใช่ฐานตัดสินนโยบายเพียงแหล่งเดียว
UNESCO GNLC 2025: เทศบาลเมืองตากได้รับการรับรอง
📝 กิจกรรม — สำรวจและเสนอแนะ
ม.1-3: สำรวจพฤติกรรมการเผาในชุมชน เขียนรายงานอ้างอิงข้อมูล PM2.5 จาก Dashboard
ม.4-6: จัดทำ "ข้อเสนอแนะเชิงนโยบาย" โดยรายงานข้อมูลจาก 4 สถานีที่เปิดใช้งาน พร้อมข้อจำกัด coverage ตัวแปรกวน และแหล่งอ้างอิงภายนอก
สุขศึกษาและพลศึกษา

บทเรียน สุขภาพ — ฝึกออกแบบแนวปฏิบัติจากข้อมูลจริง

ตารางนี้ดัดแปลงเพื่อการเรียนรู้จาก AirNow School Activity Guidance ไม่ใช่คำสั่งของโรงเรียน ต้องผ่านผู้บริหาร ครูพยาบาล และหน่วยงานสาธารณสุขก่อนนำไปใช้จริง

🏫

Decision-matrix example — กิจกรรมกลางแจ้งตาม US AQI AQI ฐาน 24h: — (ข้อมูลยังไม่ครบ 75%) · coverage 0%

AQI ระดับ กิจกรรมสั้น กิจกรรมยาว/หนัก สิ่งที่ต้องติดตาม
0–50 🟢 Good ทำได้ตามแผน ทำได้ตามแผน ตรวจ AQI และอาการ
51–100 🟡 Moderate ทำได้ตามแผน ผู้ไวต่อมลพิษเฝ้าดูอาการ แผนโรคหืด/ยาประจำตัว
101–150 🟠 Sensitive groups ทำได้ โดยเฉพาะกิจกรรมสั้น เพิ่มพักและลดความหนัก ติดตามไอ หายใจลำบาก แน่นหน้าอก
151–200 🔴 Unhealthy เพิ่มพักและลดความหนัก พิจารณาย้ายในอาคาร/เลื่อนเวลา ติดตามอาการของทุกคน
201–500 🟣 Very unhealthy+ ย้ายในอาคารหรือเลื่อน ย้ายในอาคารหรือเลื่อน ตรวจคุณภาพอากาศภายในด้วย
📚 อ้างอิง: AirNow — Air Quality and Outdoor Activity Guidance for Schools · ต้องปรับให้เข้ากับแนวทางไทยและแผนสุขภาพของโรงเรียน
💚 สถานการณ์วันนี้ — คุณภาพอากาศ
AQI ฐาน 24 ชม.: — — ข้อมูลยังไม่ครบ 75% · PM2.5 = 0.0 µg/m³
ตัวอย่างการตีความ: ⚠️ coverage ยังไม่พอสำหรับใช้ AQI เป็นฐานตัดสิน
🥵 สถานการณ์วันนี้ — ดัชนีความร้อน
Heat Index: 25.2°C 🟢 ต่ำกว่า Caution
คำแนะนำ: ต่ำกว่าช่วง Caution ของ NWS; ยังต้องดูแดด ลม ระยะเวลา และอาการ
Heat Index สมมติพื้นที่ร่มและลมอ่อน; แดดตรงอาจทำให้ค่ารู้สึกร้อนสูงขึ้น และไม่แทน WBGT สำหรับกิจกรรมกีฬา
AI Tutoring Systems

ระบบ AI Tutor เสริมการเรียนรู้

Ollama + Qwen 2.5 — สอนคณิตศาสตร์แบบ 1:1 ด้วยข้อมูลจริงจาก Dashboard

🤖

ตัวอย่างบทสนทนา — PM2.5 เฉลี่ย 24 ชม. = 15.0 µg/m³

🤖 AI Tutor
สวัสดี! ค่า PM2.5 เฉลี่ย 24 ชม. อยู่ที่ 15.0 µg/m³ ลองดูว่าอยู่ในช่วง Breakpoint ไหนก่อนนะ 🎯
👨‍🎓 นักเรียน
อยู่ในช่วง 9.1–35.4 µg/m³ ครับ!
🤖 AI Tutor
ถูกต้อง! 🎉 +10 XP · ลองแทนค่าดูครับ 💪 \[AQI = \frac{100-51}{35.4-9.1} \times (15.0 - 9.1) + 51\]

🎮 Gamification

XP: ตอบถูก +10, Combo +15, จบบท +50
Levels: 🌱 ฝึกหัด → ⭐ นักคิด → 🔥 นักแก้โจทย์ → 💎 อัจฉริยะ
Leaderboard: จัดอันดับในห้อง/ระดับชั้น

📚 เทคนิคการสอน

Socratic Method: ถามนำ ไม่เฉลยทันที
Adaptive: ตอบถูกมาก → ยากขึ้นอัตโนมัติ
RAG: สอนจากเนื้อหาที่ครูเตรียมไว้