อยากวัด PM2.5 รอบบ้านเอง? ESP32 + SDS011 ส่งค่าขึ้นกราฟได้ทุก 5 นาที
เวลาพูดถึง PM2.5 เรามักเปิดแอปแล้วดูค่าจากสถานีตรวจวัดใกล้บ้าน แต่ถ้าอยากลองวัดสภาพอากาศ ในพื้นที่ของตัวเองแบบ Maker ล่ะ?
โปรเจกต์ Air Pollution Monitoring ของผู้ใช้ Hackaday.io ชื่อ niriho ใช้ ESP32 + SDS011 ทำ Sensor Node สำหรับอ่าน PM2.5 และ PM10, แสดงค่าบน OLED, ส่งข้อมูลผ่าน Wi-Fi ไปยัง Server และใช้ Cacti ทำกราฟย้อนหลัง
จุดน่าสนใจคือมันไม่ใช่แค่ “ต่อ Sensor แล้ว Serial Print” แต่เป็น Pipeline ครบตั้งแต่ Sensor ไปจนถึง Historical Dashboard พร้อม Sleep Cycle เพื่อไม่ให้ SDS011 ทำงานตลอดเวลา
- ESP32 อ่านค่า PM2.5 และ PM10 จาก SDS011 ผ่าน UART
- OLED ใช้แสดงค่าฝุ่นและสถานะของระบบในเครื่อง
- ESP32 เชื่อม Wi-Fi และ Sync เวลาผ่าน NTP
- Code ใช้ Flow: Wake SDS011 → Read → Upload → Sleep
- ข้อมูลถูกส่งด้วย HTTP GET ไปยัง IIS/.NET Server
- Cacti ใช้เก็บและสร้างกราฟย้อนหลัง
- Instructions เดิมสลับ SDA/SCL ของ OLED กับ Source Code ต้องระวัง
- ระบบนี้เหมาะกับ DIY/Trend Monitoring ไม่ควรตีความเป็น Regulatory-grade Monitor
โปรเจกต์นี้ทำอะไร?
เป้าหมายของโปรเจกต์คือ สร้าง Node สำหรับ Monitor ฝุ่น PM2.5 และ PM10 แล้วเก็บข้อมูลเป็นกราฟย้อนหลัง แทนการอ่านค่าจาก Sensor เฉพาะเวลาที่เสียบคอมพิวเตอร์
ระบบจึงแบ่งได้เป็นสามส่วน:
Sensor Node
ESP32 + SDS011 + OLED สำหรับอ่านและแสดงค่าฝุ่น
Data Transport
Wi-Fi + HTTP GET สำหรับส่งค่าจาก Sensor ไป Server
History
IIS/.NET + Text Files + Cacti สำหรับเก็บและสร้างกราฟย้อนหลัง
SDS011 วัด PM2.5 และ PM10 ยังไง?
SDS011 ใช้หลักการ Optical Scattering: มีแหล่งกำเนิดแสงภายใน Sensor และตรวจแสงที่กระเจิงจากอนุภาคในอากาศ เพื่อนำมาประเมิน Particulate Matter
| รายการ | ข้อมูลจาก SDS011 datasheet-derived reference |
|---|---|
| Output | PM2.5 และ PM10 |
| Measurement Range | 0.0–999.9 µg/m³ |
| Input Voltage | 5 V |
| Response Time | 1 second |
| Serial Output Frequency | 1 ครั้งต่อวินาที |
| Relative Error | 10% ตาม Specification ที่ Source อ้างอิง |
Sensor ราคาประหยัดเหมาะกับการดู Trend และการทดลองแบบ Maker แต่ไม่ควรสรุปว่าให้ผลเทียบเท่าสถานีตรวจวัดมาตรฐาน โดยไม่มี Calibration / Validation เพิ่มเติม
Architecture ตั้งแต่ Sensor ถึง Cacti
Data Flow แบบย่อ
PM2.5 / PM10
UART + OLED + Wi-Fi
HTTP Endpoint
Historical Graph
ESP32 ไม่ได้ทำ Data Logging ระยะยาวเอง แต่ทำหน้าที่เป็น Sensor Node: อ่านค่า, ใส่ข้อมูลลง Display, แล้ว Push Measurement ไปยัง Server
ต้องใช้อุปกรณ์อะไรบ้าง?
| อุปกรณ์ | หน้าที่ |
|---|---|
| ESP32 | Controller, Wi-Fi, NTP และส่งข้อมูล |
| SDS011 | วัด PM2.5 / PM10 |
| OLED | แสดง Measurement และสถานะระบบ |
| Power Cables / Supply | จ่ายไฟให้ชุดทดลอง |
| Windows Server | รัน IIS/.NET Data Collector และ Cacti ตาม Build เดิม |
Wiring ESP32 กับ SDS011 ผ่าน UART
| SDS011 | ESP32 ตามต้นฉบับ |
|---|---|
| RX | TX2 |
| TX | RX2 |
| Power | 5 V ตาม SDS011 Specification |
| Ground | Common GND |
Code ใช้
HardwareSerial port(2) แต่ ESP32 Board แต่ละรุ่นอาจมี Pin Mapping ต่างกัน จึงควรตรวจ Pinout ของ Board ที่ใช้จริง แทนการเดา GPIO จากชื่อ RX2/TX2OLED Wiring มี Conflict ใน Source ต้องระวัง
Instructions ปี 2019 เขียนว่า:
- SCL → D21
- SDA → D22
แต่ Code ใช้:
SSD1306Wire display(0x3c, 21, 22);
และ Constructor ของ ThingPulse SSD1306Wire เรียง Parameter เป็น:
address, sda, scl
- OLED SDA → GPIO21
- OLED SCL → GPIO22
VCC ของ OLED ใน Build ต้นฉบับถูกต่อกับ 3 V ของ ESP32 และ Ground ต่อร่วมกัน
Arduino ESP32 Setup: อะไรจากปี 2019 ที่ควรอัปเดต?
Build Instructions เดิม ใช้ Arduino IDE และเพิ่ม ESP32 ผ่าน Boards Manager ซึ่ง Concept ยังใช้ได้
แต่ URL Package Index ใน Tutorial ปี 2019 เป็น URL รุ่นเก่า ขณะที่ Official Espressif Documentation ปัจจุบัน ใช้ Stable Package Index ชุดใหม่
เปิด Official Arduino-ESP32 Installation Documentation แล้วใช้ Stable Release Link ที่ Espressif ระบุในเอกสารปัจจุบัน ก่อนติดตั้งแพ็กเกจผ่าน Boards Manager
หลังติดตั้งให้เลือก Board ที่ตรงกับ ESP32 Hardware จริง ไม่ควรเลือก “ESP32 Pico Kit” เพียงเพราะ Tutorial เก่าเคยใช้ชื่อดังกล่าว
ทำไมผู้สร้างต้องแก้ SDS011 Sleep Library?
Instructions ระบุชัดว่า SDS011 Library ที่ผู้สร้างใช้ในตอนนั้น มีปัญหากับ Sleep Function
ผู้สร้างจึงแก้ Function และแนบ Library Pack ที่แก้ไว้แล้วเป็น libraries.rar ในหน้า Hackaday.io
Original Firmware ถูกพัฒนาคู่กับ Library ที่ผู้สร้างแก้ Sleep Function ไว้ หากเปลี่ยน Library หรือ Version ต้องตรวจ API และ Sleep/Wake Behaviour ใหม่
หนึ่งรอบของ Firmware ทำอะไรบ้าง?
ESP32 เชื่อม Network ที่กำหนดไว้
ใช้ NTP Client ดึงเวลา
ปลุก Sensor ก่อนเริ่มอ่านค่า
อ่าน Measurement ผ่าน SDS011 Library
ส่งค่า PM10 และ PM2.5 ไปยัง HTTP Endpoint
แสดงค่าและเวลาในเครื่อง
สั่ง Sensor เข้าสู่ Sleep
Firmware ต้นฉบับรอประมาณ 5 นาทีแล้วเริ่มรอบใหม่
Source Code Restart ESP32 หลังทำ Update ครบจำนวนหนึ่งเพราะผู้สร้างพบปัญหาเครื่องค้าง จุดนี้เป็น Workaround ของ Build ต้นฉบับ ไม่ใช่ Requirement ปกติของ ESP32 หรือ SDS011
ดู Code Wake → Read → Sleep จาก Project จริง
Snippet ด้านล่างตัดมาจาก esp32_sds011_V2.ino ใน GitHub ของผู้สร้าง เพื่อให้เห็น Core Sensor Flow โดยไม่คัดลอก Firmware ทั้งไฟล์
my_sds.wakeup();
delay(2500);
err = my_sds.read(&p25, &p10);
/* Project sends values to its remote server here */
my_sds.sleep();
Wi-Fi, NTP, HTTP, Error Handling, OLED และ Delay Logic อยู่ใน Source Code เต็มบน GitHub
ส่ง PM2.5/PM10 ไป Server ผ่าน HTTP GET
Firmware ต้นฉบับ สร้าง HTTP Request แยกสำหรับ:
- PM10
- PM2.5
แล้วเรียก WebService ให้เขียน Measurement ลง File ที่ Server
Upload Flow
PM10
HTTPClient
CreateFile
ไม่ควร Copy Address/Port ใน Firmware เดิม ไปใช้เป็น Server Endpoint จริงโดยตรง
IIS / .NET Server ทำหน้าที่อะไร?
Backend ของ Project เดิม ไม่ได้ใช้ Cloud IoT Platform แต่ใช้ Windows Server ที่ประกอบด้วย:
- IIS
- .NET WebService
- Text Files
- PowerShell
- Cacti
WebService รับ Filename และ Content จาก HTTP Request แล้วเขียน Measurement ลง Directory ที่ Cacti จะนำไปใช้ต่อ
Instructions เดิมระบุว่า IIS User ต้องมี Write Permission ใน Destination Folder ไม่เช่นนั้น WebService จะไม่สามารถสร้างหรืออัปเดตไฟล์ได้
ทำไม Sensor Offline แล้ว PowerShell เขียนค่า 0?
Project มี PowerShell Script ตรวจ Sensor Files และหาก File ไม่ถูก Update ภายในประมาณ 15 นาที Script จะเขียน 0 ลงไป
จุดประสงค์ของผู้สร้างคือ ไม่อยากให้กราฟเป็นเส้นตรงเดิม จนดูเหมือน Sensor ยังทำงานอยู่
ถ้าเอาข้อมูลไปวิเคราะห์ต่อ ต้องแยกให้ได้ว่า PM2.5 = 0 มาจาก Sensor จริง หรือถูก Script เขียนแทนเพราะ Sensor Offline
สำหรับระบบ Data Logging ใหม่ การใช้ State เช่น Missing / Stale / Offline แยกจาก Measurement จะลดความเสี่ยงในการตีความผิด แต่แนวทางนี้เป็นข้อเสนอด้าน Data Quality ไม่ใช่สิ่งที่ Source เดิม Implement ไว้
สร้างกราฟ PM2.5/PM10 ด้วย Cacti
Workflow ฝั่ง Cacti ใน Tutorial แบ่งเป็นขั้นหลัก ๆ:
- สร้าง Data Input Method สำหรับ PM2.5 และ PM10
- สร้าง Data Source Template
- สร้าง Graph Template
- สร้าง Graph สำหรับ Sensor
- ชี้ Data Source ไปยัง File ที่ WebService เขียนไว้
- รอ Cacti Poll หลายรอบก่อนกราฟเริ่มแสดงข้อมูล
เมนูหรือหน้าตาของ Cacti รุ่นปัจจุบัน อาจไม่ตรงกับภาพทุกจุด ควรใช้ภาพนี้เพื่อเข้าใจ Workflow และตรวจ Documentation ของ Version ที่ติดตั้งจริง
ผลลัพธ์คือกราฟ PM2.5/PM10 ย้อนหลัง
Instructions เตือนว่า Cacti ต้อง Poll ข้อมูลหลายรอบ ก่อนกราฟจะเริ่มแสดงผล จึงไม่ควรคาดหวังว่า สร้าง Graph เสร็จแล้วจะเห็น History ทันที
ข้อจำกัดของ SDS011 และเรื่องความชื้น
Reference ที่รวบรวมข้อมูลจาก SDS011 Datasheet ระบุ Relative Error ที่ 10% และ Humidity Working Range อยู่ถึงประมาณ 70%
ดังนั้นหากใช้ Sensor Outdoor หรือในสภาพอากาศชื้น ไม่ควรมองค่าจาก SDS011 เป็น Ground Truth โดยอัตโนมัติ
สิ่งที่เหมาะกับ Project นี้มากกว่า คือใช้ดู:
- Trend ตามเวลา
- ความแตกต่างระหว่าง Location
- ช่วงที่ค่าฝุ่นเพิ่มหรือลด
- การทดลอง IoT / Data Logging
หากต้องใช้ข้อมูลเพื่อการตัดสินใจที่สำคัญ ควรเทียบกับสถานีหรือเครื่องมืออ้างอิง ที่เหมาะกับงานนั้น
Security: HTTP GET แบบต้นฉบับไม่ควรเปิดตรงออก Internet
Project ปี 2019 ใช้ Plain HTTP GET สำหรับส่ง Filename และ Measurement ไปยัง WebService
Source เดิมไม่ได้แสดง:
- TLS / HTTPS
- Device Authentication
- API Key
- Request Signing
- Input Validation Architecture แบบ Modern API
ไม่ควร Forward HTTP Data Collector ออก Public Internet โดยตรง โดยไม่มี Authentication, TLS และ Access Control
สำหรับระบบใหม่ ควรออกแบบ Server Endpoint ให้ Validate Filename / Content และจำกัดสิทธิ์ของ Device แต่รายละเอียดดังกล่าวเป็น Modern Security Recommendation ไม่ใช่ Feature ที่ Source ปี 2019 ระบุว่ามีอยู่แล้ว
ถ้าทำ Project นี้ใหม่ในปี 2026 ต้องตรวจอะไรบ้าง?
| จุดที่ต้องตรวจ | เหตุผล |
|---|---|
| Arduino-ESP32 Installation | Package Index ใน Tutorial ปี 2019 เก่าแล้ว ให้ยึด Official Espressif Docs ปัจจุบัน |
| Board Selection | เลือก Board/Variant ให้ตรงกับ ESP32 ที่ใช้จริง |
| SDS011 Library | Original Build ใช้ Library ที่แก้ Sleep Function |
| OLED SDA/SCL | Instructions กับ Source Code ขัดกัน; Code ใช้ SDA 21 / SCL 22 |
| UART Pin Mapping | ตรวจ Pinout ตาม ESP32 Board จริง |
| Timezone | Code เดิม Hard-code NTP Offset สำหรับ Environment ของผู้สร้าง |
| Server Security | Plain HTTP Endpoint เดิมไม่เหมาะกับการเปิด Public Internet |
| Offline Data | ค่า 0 จาก PowerShell อาจหมายถึง Sensor Offline ไม่ใช่ PM = 0 |
| Cacti UI | Screenshot เป็น UI จาก Environment ปี 2019 |
Source Code และไฟล์ต้นฉบับ
FAQ: ESP32 + SDS011 Air Quality Monitor
1. โปรเจกต์นี้วัดอะไร?
SDS011 ส่งค่า PM2.5 และ PM10 ให้ ESP32 อ่านและบันทึก
2. SDS011 ติดต่อกับ ESP32 ผ่านอะไร?
ผ่าน UART โดยต้นฉบับต่อ SDS011 RX ไป TX2 และ SDS011 TX ไป RX2
3. RX2/TX2 คือ GPIO ไหน?
Source ไม่ได้ล็อก GPIO Number สำหรับ ESP32 Board ทุก Variant จึงควรตรวจ Pinout ของ Board ที่ใช้งานจริง
4. OLED ต่อ SDA/SCL ที่ GPIO ไหน?
Source Code และ SSD1306Wire Constructor สอดคล้องกับ SDA = GPIO21 และ SCL = GPIO22 แม้ Instructions เดิมจะเขียนสองขานี้สลับกัน
5. SDS011 ใช้ไฟเท่าไร?
Reference ที่อ้าง SDS011 Datasheet ระบุ Input Voltage 5 V
6. ESP32 ส่งข้อมูลทุกกี่นาที?
Project ต้นฉบับใช้ Loop ที่รอประมาณ 5 นาที ก่อนเริ่ม Measurement รอบใหม่
7. SDS011 ทำงานตลอดเวลาหรือไม่?
Firmware ต้นฉบับใช้ Wake → Read → Sleep ในแต่ละ Measurement Cycle
8. ทำไมต้องใช้ Modified SDS011 Library?
ผู้สร้างระบุว่า Library ที่ใช้เดิม มีปัญหากับ Sleep Function จึงแก้ Function และแนบ Library Pack ไว้กับ Project
9. ส่งข้อมูลไป Cacti โดยตรงหรือไม่?
ไม่ ESP32 ส่งค่าไปยัง IIS/.NET WebService ก่อน จากนั้น Measurement ถูกเขียนเป็น File ให้ Cacti นำไปสร้างกราฟ
10. ใช้ HTTPS หรือไม่?
Firmware ต้นฉบับใช้ Plain HTTP GET และ Source ไม่ได้ระบุ TLS หรือ Device Authentication
11. เปิด Server Endpoint ออก Internet ได้เลยหรือไม่?
ไม่ควรทำตาม Architecture เดิมโดยตรง หากไม่มี Authentication, TLS และ Access Control ที่เหมาะสม
12. ทำไมกราฟบางช่วงอาจเป็น 0?
PowerShell Script ของ Project เขียนค่า 0 หาก Sensor File ไม่ถูกอัปเดตภายในประมาณ 15 นาที ดังนั้น 0 อาจเป็น Offline Marker ไม่ใช่ Measurement จริง
13. SDS011 แม่นแค่ไหน?
Reference ที่อ้าง SDS011 Specification ระบุ Relative Error 10% แต่ Measurement จริงยังขึ้นกับ Environment และเงื่อนไขการใช้งาน
14. ความชื้นมีผลกับ SDS011 หรือไม่?
Reference SDS011 ที่ใช้ในบทความ เตือนว่าความชื้นสูงกว่า Working Range สามารถทำให้ Reading ไม่น่าเชื่อถือ
15. ใช้แทนสถานีวัด PM2.5 ทางการได้หรือไม่?
Source ไม่ได้รองรับ Claim ดังกล่าว Project นี้เหมาะกับ DIY Monitoring, Trend Analysis และการเรียนรู้ IoT มากกว่า
16. ต้อง Restart ESP32 ทุก 5 รอบหรือไม่?
ไม่ใช่ ESP32 Requirement แต่เป็น Workaround ที่ผู้สร้างใส่ไว้เพราะ Build ของเขา มีอาการค้างหลังทำงานหลายรอบ
17. Tutorial ปี 2019 ใช้กับ Arduino IDE ปัจจุบันได้เหมือนเดิมหรือไม่?
Concept ยังใช้ได้ แต่ Board Manager URL, UI, Board Package และ Library Version ควรตรวจจาก Official Documentation ปัจจุบัน
18. ต้องใช้ Cacti หรือไม่?
Build ต้นฉบับใช้ Cacti สำหรับ Logging และ Graphing แต่ Source ไม่ได้กำหนดว่า ESP32/SDS011 ต้องใช้ Cacti เท่านั้น
สิ่งที่น่าสนใจไม่ใช่แค่ Sensor แต่คือ Data Pipeline ทั้งระบบ
ESP32 + SDS011 เป็นคู่ที่เข้าใจง่ายสำหรับการเริ่มทดลอง Air Quality Monitoring เพราะ ESP32 มี Wi-Fi ในตัว ส่วน SDS011 ส่ง PM2.5/PM10 ออกมาให้ระบบนำไปใช้งานต่อได้
แต่ Project นี้น่าสนใจขึ้น เพราะผู้สร้างไม่ได้หยุดที่การอ่าน Sensor เขาพา Measurement ตั้งแต่ UART, OLED, Wi-Fi, HTTP, Windows Server ไปจนถึง Historical Graph ใน Cacti
ขณะเดียวกัน Source เก่าก็แสดงให้เห็นบทเรียนสำคัญ: Wiring Documentation อาจผิด, Library อาจมี Bug, Sensor Offline ต้องแยกจากค่าจริง และ Architecture ที่ใช้ Plain HTTP เมื่อปี 2019 ควรถูกทบทวนด้าน Security หากนำกลับมาสร้างใหม่ในปี 2026
ถ้ามองในมุม Maker นี่จึงเป็น Project ที่ดีสำหรับเรียนพร้อมกันทั้ง Sensor Interface, ESP32 Networking, Data Logging และ Dashboard โดยไม่จำเป็นต้องเริ่มจากระบบ Cloud ขนาดใหญ่
โปรเจกต์นี้มีหลายขั้น แนะนำอ่านต้นฉบับควบคู่กัน
References / แหล่งข้อมูลต้นฉบับ
- Hackaday — Measuring Particulate Pollution With The ESP32
- Hackaday.io — Air Pollution Monitoring Project
- Hackaday.io — Project Build Instructions
- GitHub — niriho/ESP32_SDS011
- GitHub — esp32_sds011_V2.ino
- Espressif — Arduino-ESP32 Installation Documentation
- World Air Quality Index Project — SDS011 Sensor Reference
- Cacti — Official Website
กำลังทำ ESP32, Air Quality หรือ IoT Sensor Project?
โปรเจกต์นี้เป็นตัวอย่างที่ดี ของการเชื่อม Sensor, Display, Wi-Fi และ Data Logging ให้ทำงานเป็นระบบเดียว
หากกำลังเลือก ESP32, Development Board, Sensor หรือ Module สามารถสอบถามทีม GlobalByte เรื่องบอร์ดหรืออุปกรณ์ที่เหมาะกับ Project ได้