{"id":1167,"date":"2025-02-14T16:14:23","date_gmt":"2025-02-14T09:14:23","guid":{"rendered":"https:\/\/ct.utc.ac.th\/?page_id=1167"},"modified":"2025-02-14T16:37:14","modified_gmt":"2025-02-14T09:37:14","slug":"%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%95%e0%b8%a3%e0%b8%a7%e0%b8%88%e0%b8%88%e0%b8%b1%e0%b8%9a%e0%b8%9d%e0%b8%b8%e0%b9%88%e0%b8%99-pm2-5","status":"publish","type":"page","link":"https:\/\/ct.utc.ac.th\/?page_id=1167","title":{"rendered":"\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e15\u0e23\u0e27\u0e08\u0e08\u0e31\u0e1a\u0e1d\u0e38\u0e48\u0e19 PM2.5"},"content":{"rendered":"\n\n\n<!-- \u0e42\u0e2b\u0e25\u0e14 Chart.js -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n\n<!-- \u0e41\u0e2a\u0e14\u0e07\u0e04\u0e48\u0e32\u0e1d\u0e38\u0e48\u0e19 PM2.5 \u0e41\u0e25\u0e30\u0e01\u0e23\u0e32\u0e1f -->\n<div style=\"text-align: center;\">\n    <h2>\u0e04\u0e48\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19: <span id=\"pm25-value\">\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14&#8230;<\/span><\/h2>\n    <canvas id=\"pm25-chart\" width=\"400\" height=\"200\"><\/canvas>\n<\/div>\n\n<!-- Firebase SDK -->\n<script type=\"module\">\n    import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/10.6.0\/firebase-app.js\";\n    import { getDatabase, ref, onValue } from \"https:\/\/www.gstatic.com\/firebasejs\/10.6.0\/firebase-database.js\";\n\n    \/\/ \u2705 \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Firebase Config\n    const firebaseConfig = {\n        apiKey: \"AIzaSyCzTtQIJtzv85QqTMx4Qjw68sSDXvYV_-U\",\n        authDomain: \"pmct-e750b.firebaseapp.com\",\n        databaseURL: \"https:\/\/pmct-e750b-default-rtdb.firebaseio.com\/\",\n        projectId: \"pmct-e750b\",\n        storageBucket: \"pmct-e750b.appspot.com\",\n        messagingSenderId: \"234591779461\",\n        appId: \"1:234591779461:web:327c74c5ddd565175f07ec\",\n        measurementId: \"G-232D603QC0\"\n    };\n\n    \/\/ \ud83d\udd25 \u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19 Firebase\n    const app = initializeApp(firebaseConfig);\n    const db = getDatabase(app);\n\n    \/\/ \ud83d\udccc \u0e14\u0e36\u0e07\u0e04\u0e48\u0e32 PM2.5 \u0e08\u0e32\u0e01 `sensor\/pm2_5`\n    const pm25Ref = ref(db, \"sensor\/pm2_5\");\n\n    \/\/ **\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e01\u0e23\u0e32\u0e1f**\n    const ctx = document.getElementById(\"pm25-chart\").getContext(\"2d\");\n    const pm25Chart = new Chart(ctx, {\n        type: \"bar\",\n        data: {\n            labels: [\"PM2.5\"],\n            datasets: [{\n                label: \"\u0e04\u0e48\u0e32\u0e1d\u0e38\u0e48\u0e19 PM2.5\",\n                data: [0], \/\/ \u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\n                backgroundColor: \"rgba(0, 255, 0, 0.6)\", \/\/ \u0e2a\u0e35\u0e40\u0e02\u0e35\u0e22\u0e27\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\n                borderColor: \"rgba(0, 255, 0, 1)\",\n                borderWidth: 1\n            }]\n        },\n        options: {\n            responsive: true,\n            scales: {\n                y: {\n                    beginAtZero: true,\n                    suggestedMax: 150\n                }\n            }\n        }\n    });\n\n    \/\/ **\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e48\u0e32 PM2.5 \u0e08\u0e32\u0e01 Firebase**\n    onValue(pm25Ref, (snapshot) => {\n        const pm25Value = snapshot.val();\n        const pm25Element = document.getElementById(\"pm25-value\");\n\n        \/\/ \u0e01\u0e33\u0e2b\u0e19\u0e14\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e2a\u0e35\u0e15\u0e32\u0e21\u0e04\u0e48\u0e32 PM2.5\n        let bgColor, borderColor, levelText;\n        if (pm25Value <= 25) {\n            bgColor = \"rgba(0, 255, 0, 0.6)\"; \/\/ \u0e2a\u0e35\u0e40\u0e02\u0e35\u0e22\u0e27\n            borderColor = \"rgba(0, 255, 0, 1)\";\n            levelText = \"\u0e14\u0e35\u0e21\u0e32\u0e01 (Good)\";\n        } else if (pm25Value <= 50) {\n            bgColor = \"rgba(255, 255, 0, 0.6)\"; \/\/ \u0e2a\u0e35\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\n            borderColor = \"rgba(255, 255, 0, 1)\";\n            levelText = \"\u0e1b\u0e32\u0e19\u0e01\u0e25\u0e32\u0e07 (Moderate)\";\n        } else if (pm25Value <= 100) {\n            bgColor = \"rgba(255, 165, 0, 0.6)\"; \/\/ \u0e2a\u0e35\u0e2a\u0e49\u0e21\n            borderColor = \"rgba(255, 165, 0, 1)\";\n            levelText = \"\u0e21\u0e35\u0e1c\u0e25\u0e15\u0e48\u0e2d\u0e2a\u0e38\u0e02\u0e20\u0e32\u0e1e (Unhealthy)\";\n        } else {\n            bgColor = \"rgba(255, 0, 0, 0.6)\"; \/\/ \u0e2a\u0e35\u0e41\u0e14\u0e07\n            borderColor = \"rgba(255, 0, 0, 1)\";\n            levelText = \"\u0e2d\u0e31\u0e19\u0e15\u0e23\u0e32\u0e22 (Hazardous)\";\n        }\n\n        \/\/ \u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e48\u0e32\u0e43\u0e19\u0e40\u0e27\u0e47\u0e1a\n        pm25Element.textContent = `${pm25Value} \u00b5g\/m\u00b3 - ${levelText}`;\n\n        \/\/ \u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e48\u0e32\u0e01\u0e23\u0e32\u0e1f\n        pm25Chart.data.datasets[0].data = [pm25Value];\n        pm25Chart.data.datasets[0].backgroundColor = bgColor;\n        pm25Chart.data.datasets[0].borderColor = borderColor;\n        pm25Chart.update();\n    });\n<\/script>\n\n\n\n<details class=\"wp-block-details has-black-color has-text-color has-link-color has-large-font-size wp-elements-a052ae5d151f285bc94f99aa45d691ad is-layout-flow wp-block-details-is-layout-flow\"><summary>\u00a0\u0e41\u0e08\u0e01\u0e42\u0e04\u0e49\u0e14\u0e1f\u0e23\u0e35 AERDUINO <\/summary>\n<p>define BLYNK_PRINT Serial<br>define BLYNK_TEMPLATE_ID \"YOUR_TEMPLATE_ID\"<br>define BLYNK_TEMPLATE_NAME \"YOUR_TEMPLATE_NAME\"<br>define BLYNK_AUTH_TOKEN \"YOUR_BLYNK_AUTH_TOKEN\"<br>include<br>include<br>include<br>include<br>include<br>include<br>include<br>include<br>LiquidCrystal_PCF8574 lcd(0x27);<br>\/\/ \ud83d\udd10 WiFi Credentials<br>define WIFI_SSID \"YOUR_WIFI_SSID\"<br>define WIFI_PASSWORD \"YOUR_WIFI_PASSWORD\"<br>\/\/ \ud83d\udd10 Firebase Credentials<br>define API_KEY \"YOUR_FIREBASE_API_KEY\"<br>define DATABASE_URL \"YOUR_FIREBASE_DATABASE_URL\"<br>\/\/ \ud83d\udd10 Firebase Authentication<br>define USER_EMAIL \"YOUR_FIREBASE_EMAIL\"<br>define USER_PASSWORD \"YOUR_FIREBASE_PASSWORD\"<br>FirebaseData fbdo;<br>FirebaseAuth auth;<br>FirebaseConfig config;<br>unsigned long sendDataPrevMillis = 0;<br>unsigned int pm2_5 = 0;<br>\/\/ \u0e02\u0e32 RX \u0e41\u0e25\u0e30 TX \u0e02\u0e2d\u0e07\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c PM2.5<br>SoftwareSerial mySerial(D3, D4); \/\/ RX, TX<br>void checkBlynkConnection() {<br>if (!Blynk.connected()) {<br>Serial.println(\"Blynk Disconnected! Reconnecting\u2026\");<br>Blynk.connect();<br>}<br>}<br>void readPM25() {<br>int index = 0;<br>char value;<br>char previousValue;<br>unsigned int tempPM2_5 = 0;<br><code>if (mySerial.available()) { Serial.println(\"Reading Sensor Data...\"); } while (mySerial.available()) { value = mySerial.read(); Serial.print(\"Byte [\"); Serial.print(index); Serial.print(\"]: \"); Serial.println(value, HEX); if ((index == 0 &amp;&amp; value != 0x42) || (index == 1 &amp;&amp; value != 0x4D)) { Serial.println(\"Cannot find the data header.\"); break; } if (index == 6) { previousValue = value; } else if (index == 7) { tempPM2_5 = 256 * previousValue + value; Serial.print(\"Calculated PM2.5: \"); Serial.println(tempPM2_5); \/\/ \u0e2a\u0e48\u0e07\u0e04\u0e48\u0e32\u0e44\u0e1b\u0e22\u0e31\u0e07 Blynk if (Blynk.connected()) { Blynk.virtualWrite(V2, tempPM2_5); } \/\/ \u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e48\u0e32 PM2.5 \u0e1a\u0e19 LCD \u0e40\u0e09\u0e1e\u0e32\u0e30\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e04\u0e48\u0e32\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07 if (pm2_5 != tempPM2_5) { pm2_5 = tempPM2_5; lcd.setCursor(0, 0); lcd.print(\"PM2.5: \"); lcd.setCursor(7, 0); lcd.print(pm2_5); lcd.print(\"ug\"); } break; } index++; } while (mySerial.available()) { mySerial.read(); }<\/code><br>}<br>\/\/ \u2705 <strong>\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e2a\u0e48\u0e07\u0e04\u0e48\u0e32\u0e02\u0e36\u0e49\u0e19 Firebase<\/strong><br>void sendToFirebase() {<br>if (Firebase.ready() &amp;&amp; (millis() - sendDataPrevMillis > 10000 || sendDataPrevMillis == 0)) {<br>sendDataPrevMillis = millis();<br><code>Serial.println(\"Sending PM2.5 data to Firebase...\"); if (Firebase.setInt(fbdo, \"\/sensor\/pm2_5\", pm2_5)) { Serial.println(\"PM2.5 data sent successfully.\"); } else { Serial.println(\"Failed to send PM2.5 data: \" + fbdo.errorReason()); } Serial.println(\"------------------------------------------------\"); }<\/code><br>}<br>void setup() {<br>Serial.begin(115200);<br>mySerial.begin(9600);<br><code>\/\/ \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 LCD lcd.begin(16, 2); lcd.setBacklight(255); lcd.setCursor(0, 0); lcd.print(\"Initializing...\"); \/\/ \u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d WiFi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print(\"Connecting to WiFi...\"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(\".\"); } Serial.println(\" Connected!\"); lcd.clear(); lcd.setCursor(0, 0); lcd.print(\"WiFi Connected!\"); Blynk.begin(BLYNK_AUTH_TOKEN, WIFI_SSID, WIFI_PASSWORD); \/\/ \ud83d\udd25 \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Firebase config.api_key = API_KEY; auth.user.email = USER_EMAIL; auth.user.password = USER_PASSWORD; config.database_url = DATABASE_URL; config.token_status_callback = tokenStatusCallback; Firebase.reconnectNetwork(true); fbdo.setBSSLBufferSize(4096, 1024); Firebase.begin(&amp;config, &amp;auth); Firebase.setDoubleDigits(5); Serial.println(\"Firebase setup completed!\");<\/code><br>}<br>void loop() {<br>checkBlynkConnection();<br>readPM25();<br>sendToFirebase(); \/\/ \ud83d\udccc \u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e2a\u0e48\u0e07\u0e04\u0e48\u0e32\u0e44\u0e1b Firebase<br>delay(1000);<br>Blynk.run();<br>}<\/p>\n<\/details>\n","protected":false},"excerpt":{"rendered":"<p>\u0e04\u0e48\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19: \u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b<\/p>\n","protected":false},"author":1,"featured_media":1173,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1167","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/pages\/1167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1167"}],"version-history":[{"count":9,"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/pages\/1167\/revisions"}],"predecessor-version":[{"id":1183,"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/pages\/1167\/revisions\/1183"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=\/wp\/v2\/media\/1173"}],"wp:attachment":[{"href":"https:\/\/ct.utc.ac.th\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}