สวัสดีชาว Maker สายรักษ์สุขภาพทุกคนครับ! ปฏิเสธไม่ได้เลยว่าปัญหามลพิษทางอากาศ โดยเฉพาะเจ้าฝุ่นจิ๋ว PM2.5 และ PM10 กลายเป็นภัยเงียบที่คุกคามสุขภาพคนเมืองอย่างเรามากๆ เพราะมันสามารถทะลุทะลวงเข้าสู่ปอดและกระแสเลือดได้โดยตรง
เพื่อรับมือกับปัญหานี้ วันนี้เราจะพาทุกคนมาสร้าง "เครื่องวัดคุณภาพอากาศแบบพกพา" ฉบับ DIY ที่ทั้งเล็ก กะทัดรัด และแสดงผลแบบเรียลไทม์ แถมยังส่งข้อมูลผ่าน Wi-Fi ได้ด้วย โดยใช้พระเอกหลักคือบอร์ด Seeed Studio Wio Terminal และเซนเซอร์วัดฝุ่นตระกูล Grove ครับ มาดูกันว่าข้างในโปรเจกต์นี้มีอะไรบ้าง!
ฮาร์ดแวร์ตัวตึงที่ต้องใช้ (Hardware Components)
1. สมองกลหลัก: Wio Terminal
นี่คือบอร์ดไมโครคอนโทรลเลอร์ที่ครบจบในตัวเดียวมากๆ ครับ เพราะมันมาพร้อมกับชิป ATSAMD51 (120 MHz), หน้าจอ LCD ในตัว, พอร์ตเชื่อมต่อ Grove ที่เสียบสายปุ๊บใช้ได้ปั๊บ และยังมี Wi-Fi / BLE สำหรับทำอุปกรณ์ IoT ส่งข้อมูลขึ้นคลาวด์ได้สบายๆ
2. เซนเซอร์วัดฝุ่น: Grove - Laser PM2.5 Dust Sensor (HM3301)
เซนเซอร์ตัวนี้ใช้เทคโนโลยีการกระจายแสงเลเซอร์ (Laser scattering) ยิงแสงไปกระทบอนุภาคฝุ่นในอากาศแล้วประเมินความหนาแน่นออกมาเป็นหน่วย µg/m³ ซึ่งมันสามารถแยกแยะขนาดฝุ่นได้ทั้ง PM1.0, PM2.5 และ PM10 เลยทีเดียว
💡 Maker's Tip: การทำเครื่องวัดฝุ่นแบบพกพา (Portable) หัวใจสำคัญคือการจับเซนเซอร์และบอร์ด Wio Terminal มารวมร่างกันให้แข็งแรงครับ การใช้ บริการ 3D Printing เพื่อออกแบบและปริ้นท์เคส (Enclosure) จะช่วยให้เครื่องวัดฝุ่นของคุณมีช่องรับลมที่พอดี และถือใช้งานได้สะดวกเหมือนเครื่องมือระดับโปร!
หากเพื่อนๆ ต้องการ บริการรับปริ้นท์ 3D Printing คุณภาพสูง สั่งทำเคส หรืออยากซื้อ บอร์ด Wio Terminal และเซนเซอร์ Grove ไปลองเล่นดู แวะมาสั่งซื้อพร้อมส่งได้ที่ Globalbyte เลยครับ!
ระบบทำงานยังไง? (System Architecture)
ระบบของเครื่องวัดฝุ่นตัวนี้ถูกออกแบบให้ทำงานผ่าน 3 ขั้นตอนหลักๆ (3 Layers) ครับ:
-
การดึงข้อมูล (Data Acquisition): เซนเซอร์ HM3301 จะดูดอากาศเข้าไปวัดค่าฝุ่นอย่างต่อเนื่อง และส่งข้อมูลดิบผ่านสาย I2C ไปยังบอร์ด Wio Terminal
-
การประมวลผล (Data Processing): บอร์ด Wio Terminal จะรับข้อมูลดิบมาถอดรหัส แปลงเป็นหน่วย µg/m³ และใช้สมการช่วยลดสัญญาณรบกวน (Smoothing) ให้ค่าฝุ่นนิ่งขึ้น
-
การแสดงผลและส่งข้อมูล (Data Presentation & Communication): นำค่าฝุ่นไปแสดงบนหน้าจอ LCD ของบอร์ด พร้อมจัดหมวดหมู่สี (เช่น เขียว=ดี, เหลือง=ปานกลาง, แดง=อันตราย) และสามารถส่งข้อมูลผ่าน Wi-Fi ขึ้นระบบ Cloud (เช่น Blynk หรือ ThingsBoard) ได้ด้วย
การออกแบบซอฟต์แวร์ (Software Design)
ในการเขียนโปรแกรม เราสามารถใช้โปรแกรมยอดฮิตอย่าง Arduino IDE ได้เลยครับ โค้ดจะถูกแบ่งเป็นโมดูลย่อยๆ เช่น โมดูลสื่อสารกับเซนเซอร์ (อ่านค่าเช็คความถูกต้อง), โมดูลอัปเดตหน้าจอ LCD, และโมดูลส่งข้อมูลเข้า Wi-Fi ทำให้โปรเจกต์นี้เป็นแหล่งเรียนรู้วิชา Embedded Systems ที่ดีมากๆ สำหรับมือใหม่ครับ
อยากเจาะลึกและลองทำตามใช่ไหม? 🤓
เนื้อหาของโปรเจกต์นี้มีรายละเอียดโครงสร้างโค้ดและไลบรารีที่น่าสนใจอีกเพียบ! หากเพื่อนๆ อยากอ่านคู่มือแบบเจาะลึก อยากดูแนวทางการนำไปพัฒนาเป็น Smart City หรืออยากสนับสนุนผลงานของผู้สร้าง...
เราขอเชียร์ให้กดเข้าไปอ่านบทความรีวิวฉบับเต็มและดาวน์โหลด Source Code ได้ที่ลิงก์ด้านล่างนี้เลยครับ!
อ่านบทความเต็มบน Hackster.io
แผนผังการทำงาน (Project Diagram)
แผนผังแสดงการส่งข้อมูลจากเซนเซอร์สู่บอร์ด และออกสู่หน้าจอ/ระบบไร้สาย
ตัวอย่างโค้ด C/C++ เบื้องต้น (Code Snippet)
ตัวอย่างโค้ดพื้นฐานสำหรับดึงค่า PM1.0, PM2.5 และ PM10 ออกมาแสดงผลทาง Serial Monitor และการจำแนกเกณฑ์คุณภาพอากาศครับ
#include <Arduino.h>
#include <Wire.h>
#include "Seeed_HM330X.h"
// Create sensor object (I2C mode)
HM330X sensor;
uint8_t buffer[30];
void printError(HM330XErrorCode error)
{
switch (error)
{
case NO_ERROR:
Serial.println("No error");
break;
case ERROR_NOT_READY:
Serial.println("Sensor not ready");
break;
case ERROR_DATA_OVERFLOW:
Serial.println("Data overflow");
break;
case ERROR_SERIAL_NO_ACK:
Serial.println("No ACK from sensor");
break;
default:
Serial.println("Unknown error");
break;
}
}
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println("=== Wio Terminal Air Quality Monitor (I2C) ===");
// Initialize I2C
Wire.begin();
// Initialize sensor in I2C mode
if (sensor.init())
{
Serial.println("HM3301 sensor initialized successfully");
}
else
{
Serial.println("Sensor initialization failed!");
}
}
void loop()
{
HM330XErrorCode error;
error = sensor.read_sensor_value(buffer, 29);
if (error == NO_ERROR)
{
// Data format: PM1.0, PM2.5, PM10 (standard positions)
int pm1_0 = buffer[4] << 8 | buffer[5];
int pm2_5 = buffer[6] << 8 | buffer[7];
int pm10 = buffer[8] << 8 | buffer[9];
Serial.println("\n---------------------------");
Serial.println("AIR QUALITY DATA (I2C)");
Serial.println("---------------------------");
Serial.print("PM1.0 : ");
Serial.print(pm1_0);
Serial.println(" µg/m³");
Serial.print("PM2.5 : ");
Serial.print(pm2_5);
Serial.println(" µg/m³");
Serial.print("PM10 : ");
Serial.print(pm10);
Serial.println(" µg/m³");
// Air quality classification
String status;
if (pm2_5 <= 12)
status = "Good";
else if (pm2_5 <= 35)
status = "Moderate";
else if (pm2_5 <= 55)
status = "Unhealthy";
else
status = "Hazardous";
Serial.print("Status : ");
Serial.println(status);
}
else
{
Serial.print("Sensor error: ");
printError(error);
}
delay(2000);
}
สรุปโปรเจกต์ (Conclusion)
เครื่องวัดคุณภาพอากาศจากบอร์ด Wio Terminal และเซนเซอร์ HM3301 ตัวนี้ ถือเป็นจุดเริ่มต้นที่ดีมากๆ สำหรับคนที่อยากทำอุปกรณ์สวมใส่ หรืออุปกรณ์ IoT เพื่อช่วยปกป้องสุขภาพตัวเองและคนในครอบครัวครับ นอกจากจะได้ความรู้เรื่องโค้ดดิ้งแล้ว ยังสามารถนำไปประยุกต์ทำเป็นเครือข่ายเซนเซอร์ส่งข้อมูลระดับเมือง (Smart City) ได้อีกด้วย
*คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงแนวคิดจากบทความโปรเจกต์ต้นฉบับภาษาอังกฤษ ข้อมูลและขั้นตอนการทำงานบางส่วนอาจถูกปรับรูปแบบเพื่อให้ผู้เริ่มต้นทำความเข้าใจได้ง่ายขึ้น ผู้สนใจนำโค้ดไปใช้งานจริง ควรศึกษาการติดตั้งไลบรารี
Seeed_HM330X.h เพิ่มเติมจาก
เว็บไซต์ต้นฉบับ ก่อนดำเนินการ