ผู้เขียนบทความ : นายเศรษฐพงศ์ จะนะจินา COE#15
คณะวิศวะกรรมศาสตร์ : สาขาวิศวะกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ชั้นสูง 1/2566
1. ความเป็นมา
ปัญหามลพิษทางอากาศเป็นปัญหาที่กำลังเติบโตขึ้นทั่วโลก โดยมีค่าดัชนีคุณภาพอากาศ (AQI) เป็นตัววัดที่เน้นความเสี่ยงต่อสุขภาพของมนุษย์ โครงการนี้ถูกสร้างขึ้นเพื่อแก้ไขประเด็นนี้ด้วยระบบตรวจวัดคุณภาพอากาศที่ใช้เซนเซอร์ MQ-135 โดยมีวัตถุประสงค์หลักในการตรวจจับและวัดระดับแก๊ส AQI ในอากาศเพื่อให้เกิดการเตือนล่วงหน้าสำหรับความเสี่ยงต่อสุขภาพที่เป็นไปได้
ในโครงการนี้มีการใช้ไมโคคอนโทรลเลอร์ ESP32 เพื่อตรวจสอบระดับ AQI อย่างต่อเนื่องในสภาพแวดล้อม และเมื่อระดับ AQI เกินค่าความปลอดภัยที่กำหนดล่วงหน้า ระบบจะเริ่มทำงานโดยเปิดพัดลมเพื่อเพิ่มการไหลของอากาศ ลดระดับ AQI และลดความเสี่ยงต่อสุขภาพให้น้อยที่สุด อีกทั้งระบบยังสามารถส่งข้อความเตือนผ่านแอปพลิเคชันไลน์ เพื่อให้ผู้ใช้ทราบในทันทีเกี่ยวกับความเสี่ยงต่อสุขภาพจากระดับ AQI ที่เพิ่มขึ้น
2. วัตถุประสงค์
- เพื่อศึกษาระบบการทำงานของ sensor และ micro controller
- เพื่อพัฒนาระบบวัดคุณภาพอากาศ
3.ขอบเขต
- สามารถทำระบบได้ด้วย ESP 32 38pin
- ใช้เซ็นเซอร์ MQ-135 เพื่อวัดค่าคุณภาพของอากาศ
- การแจ้งเตือนผ่าน Line เมื่อค่าคุณภาพอากาศเกินค่าที่กำหนดหรือไม่เหมาะสม
- เมื่อคุณภาพอากาศไม่เหมาะสมจะเปิดพัดลมระบายอากาศหรือเครื่องฟอกอากาศ
4.ประโยชน์ที่คาดว่าจะได้รับ
- ช่วยอำนวยความสะดวกในการวัดคุณภาพของอากาศ
- ทำให้อากาศภายในอาคารมีคุณภาพที่ดีขึ้น
5.ความรู้ที่เกี่ยวข้อง
5.1 ESP32 คือ ไมโครคอนโทรลเลอร์บอร์ดมีลักษณะเป็นบอร์ดขนาดเล็กที่มาพร้อมกับหน่วยประมวลผลแบบคู่ (Dual-core) โดยใช้ชิป Wi-Fi และ Bluetooth รวมอยู่ในบอร์ดเดียว พัฒนาโปรแกรมโดยใช้ภาษา C++ หรือ MicroPython และมีหลายชุดเครื่องมือพัฒนาที่สามารถใช้ในการโปรแกรมและอัปโหลดโปรแกรมลงใน ESP32
- โค้ดสำหรับ ESP32 (microcontroller platform) ที่ใช้ในการตรวจสอบคุณภาพอากาศโดยใช้เซนเซอร์ MQ135 และส่งข้อมูลผ่าน LINE Messaging API ในกรณีที่คุณภาพอากาศไม่ดีกับค่า AQI (Air Quality Index) ที่กำหนดไว้. นี่คือคำอธิบายของโค้ด:
- คำสั่งการเรียกใช้ไลบรารีและกำหนดตัวแปรที่จำเป็น เช่น ชื่อและรหัสผ่านของเครือข่าย Wi-Fi, LINE Token, LINE User ID, และ URL สำหรับส่งข้อความผ่าน LINE.
- กำหนดค่าของพินของเซนเซอร์ MQ135 และโมดูลรีเลย์.
- สร้างคลาส
AirQualityMonitor
ที่มีเมท็อดและตัวแปรสำหรับการตรวจสอบคุณภาพอากาศ:startMeasurement()
เริ่มการวัดคุณภาพอากาศstopMeasurement()
หยุดการวัดคุณภาพอากาศisMeasurementStarted()
ตรวจสอบสถานะการวัดคุณภาพอากาศsetMQ135Threshold()
กำหนดค่าเกณฑ์ AQI สำหรับการแจ้งเตือนผ่าน LINEsendLineMessage()
ส่งข้อความผ่าน LINE
- ในเมท็อด
setup()
, กำหนดการเชื่อมต่อกับ Wi-Fi และตรวจสอบว่าการเชื่อมต่อถูกต้อง. - ในเมท็อด
loop()
, ตรวจสอบข้อมูลที่รับจากหน้าต่างควบคุม (Serial Monitor) และคำสั่งเริ่มหรือหยุดการวัดคุณภาพอากาศ. หากการวัดถูกเริ่มต้น, จะอ่านค่าจากเซนเซอร์ MQ135, คำนวณค่า AQI, และตรวจสอบว่าคุณภาพอากาศเป็นไปตามค่าเกณฑ์ AQI หรือไม่. หากคุณภาพอากาศไม่ดี (AQI > เกณฑ์), จะส่งข้อความผ่าน LINE และเปิดโมดูลรีเลย์เพื่อเปิดพัดลม. หากคุณภาพอากาศดี (AQI <= เกณฑ์), โมดูลรีเลย์จะปิดเพื่อหยุดพัดลม. - ใน
calculateAQI()
จะคำนวณค่า AQI ขึ้นอยู่กับค่าที่ได้จากเซนเซอร์ MQ135 โดยใช้สูตรสำหรับ CO (คาร์บอนมอนอกไซด์) ซึ่งเป็นค่าที่ MQ135 วัด. - ใน
setup()
และloop()
, เรียกเมท็อดที่เกี่ยวข้องกับคลาสAirQualityMonitor
เพื่อเริ่มต้นและรันการทำงานของโปรแกรม.
การทำงานของระบบที่ทำงานโดยใช้ ESP32 ควบคุมมี Code ดังนี้
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "zhep"; // ชื่อของเครือข่าย Wi-Fi
const char* password = "innocent1045"; // รหัสผ่านของเครือข่าย Wi-Fi
const String LINE_TOKEN = "y7aI4Fo7yrYRK/hgkggKyyvSSLNFajtTcWqYSUp2p8HDCIz3LrezI5gt7Nfk9dQGiaAgVB5aKbSFAkkkn7sQ8Jy7/u3/NqsCsV0bTBd80Z2mEtqNVcxGXXEj8s8G8wQRA94mvhNyH54ejlVzhDzqIAdB04t89/1O/w1cDnyilFU"; // LINE Token
const String LINE_USER_ID = "U9b5a01c91676706952bcf703bae5e172"; // LINE User ID
const String LINE_URL = "https://api.line.me/v2/bot/message/push"; // URL สำหรับส่งข้อความผ่าน LINE
#define MQ135PIN 32 // พินที่เชื่อมต่อกับเซนเซอร์ MQ135
#define RELAY_PIN 13 // พินที่เชื่อมต่อกับโมดูลรีเลย์
class AirQualityMonitor {
private:
bool measurementStarted; // สถานะการวัด
float MQ135_THRESHOLD_AQI; // ค่าเกณฑ์ AQI
float aqiValue; // ค่า AQI
public:
AirQualityMonitor() {
measurementStarted = false; // ยังไม่เริ่มการวัด
MQ135_THRESHOLD_AQI = 50.0; // กำหนดค่าเริ่มต้นของค่าเกณฑ์ AQI
}
void startMeasurement() {
measurementStarted = true; // เริ่มการวัด
}
void stopMeasurement() {
measurementStarted = false; // หยุดการวัด
digitalWrite(RELAY_PIN, LOW); // หยุดพัดลมเมื่อหยุดการวัด
}
bool isMeasurementStarted() {
return measurementStarted; // ตรวจสอบสถานะการวัด
}
void setMQ135Threshold(float threshold) {
MQ135_THRESHOLD_AQI = threshold; // กำหนดค่าเกณฑ์ AQI
}
void sendLineMessage(String message) {
// สร้าง JSON payload สำหรับส่งข้อความผ่าน LINE
String jsonPayload = "{\"to\":\"" + LINE_USER_ID + "\",\"messages\":[{\"type\":\"text\",\"text\":\"" + message + "\"}]}";
HTTPClient http;
http.begin(LINE_URL);
http.addHeader("Authorization", "Bearer " + LINE_TOKEN);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(jsonPayload);
if (httpResponseCode > 0) {
Serial.print("ส่งข้อความไปที่ LINE สำเร็จ, รหัสการตอบกลับ: ");
Serial.println(httpResponseCode);
} else {
Serial.print("เกิดข้อผิดพลาดในการส่งข้อความ, รหัส HTTP ผิดพลาด: ");
Serial.println(httpResponseCode);
}
http.end();
}
void setup() {
Serial.begin(9600);
pinMode(MQ135PIN, INPUT); // กำหนดพิน MQ135 เป็นขาอินพุต
pinMode(RELAY_PIN, OUTPUT); // กำหนดพินเป็นขาเอาต์พุตสำหรับโมดูลรีเลย์
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, password);
delay(1000);
Serial.println("กำลังเชื่อมต่อกับ Wi-Fi...");
}
Serial.println("เชื่อมต่อกับ Wi-Fi สำเร็จ");
}
void loop() {
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
if (input.equals("start")) {
startMeasurement();
Serial.println("เริ่มการวัด. พิมพ์ 'stop' เพื่อหยุด.");
} else if (input.equals("stop")) {
stopMeasurement();
Serial.println("หยุดการวัด.");
}
}
if (isMeasurementStarted()) {
int mq135Value = analogRead(MQ135PIN);
aqiValue = calculateAQI(mq135Value);
Serial.print("ดัชนีคุณภาพอากาศ (AQI): ");
Serial.println(aqiValue);
if (aqiValue > MQ135_THRESHOLD_AQI) {
sendLineMessage("คุณภาพอากาศไม่ดี: AQI " + String(aqiValue));
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
delay(10000); // รอเป็นเวลา 10 วินาที
}
}
float calculateAQI(int sensorValue) {
float CO_low = 0;
float CO_high = 5000;
float AQI_low = 0;
float AQI_high = 500;
// คำนวณค่า AQI โดยใช้สูตรสำหรับ CO
float aqi = ((AQI_high - AQI_low) / (CO_high - CO_low)) * (sensorValue - CO_low) + AQI_low;
return aqi;
}
};
AirQualityMonitor airQualityMonitor;
void setup() {
airQualityMonitor.setup(); // เรียกเมท็อด setup ของ AirQualityMonitor
}
void loop() {
airQualityMonitor.loop(); // เรียกเมท็อด loop ของ AirQualityMonitor
}
5.2 MQ-135: โมดูลเซ็นเซอร์ MQ135 Air Quality Sensor ซึ่งเป็นเซ็นเซอร์แบบตรวจวัดคุณภาพอากาศที่ใช้ SnO2 (ดีบุกออกไซด์) ในกระบวนการตรวจวัด โดยเซ็นเซอร์นี้มีความสามารถในการตรวจวัดความเข้มข้นของก๊าซต่าง ๆ ในอากาศที่ไม่บริสุทธิ์ เช่น ก๊าซอันตรายหลายชนิดที่คุณกล่าวถึง เช่น H2, CO, SO2, NOx, NH3, NOx, alcohol, Benzene, CO2 และอื่น ๆ อีกมากมาย โดยมีความไวและแม่นยำในการตรวจวัดค่าเข้ากับค่าความเข้มข้นของก๊าซที่เราต้องการตรวจวัด จากภาพข้างล้างจะเป็นโค๊ดการทำงานของ MQ-135 ในระบบ
if (isMeasurementStarted()) {
int mq135Value = analogRead(MQ135PIN);
aqiValue = calculateAQI(mq135Value);
Serial.print("ดัชนีคุณภาพอากาศ (AQI): ");
Serial.println(aqiValue);
if (aqiValue > MQ135_THRESHOLD_AQI) {
sendLineMessage("คุณภาพอากาศไม่ดี: AQI " + String(aqiValue));
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
delay(10000); // รอเป็นเวลา 10 วินาที
int mq135Value = analogRead(MQ135PIN);
: อ่านค่าแอนะล็อกจากเซนเซอร์ MQ135 ที่เชื่อมต่อกับพินMQ135PIN
.aqiValue = calculateAQI(mq135Value);
: คำนวณค่า AQI โดยใช้ค่าที่ได้จากเซนเซอร์ MQ135 โดยเรียกใช้เมท็อดcalculateAQI()
และเก็บผลลัพธ์ในตัวแปรaqiValue
.- นำผลลัพธ์ AQI มาแสดงผลบนหน้าจอด้วยคำสั่ง
Serial.print()
. - ตรวจสอบว่า AQI มากกว่าค่าเกณฑ์ AQI ที่กำหนดไว้ใน
MQ135_THRESHOLD_AQI
หรือไม่ ถ้าใช่ จะส่งข้อความผ่าน LINE และเปิดโมดูลรีเลย์เพื่อเปิดพัดลม ด้วยคำสั่งsendLineMessage()
และdigitalWrite(RELAY_PIN, HIGH)
. - ถ้า AQI ต่ำกว่าหรือเท่ากับค่าเกณฑ์ AQI จะปิดโมดูลรีเลย์ (พัดลม) ด้วยคำสั่ง
digitalWrite(RELAY_PIN, LOW)
. - มีคำสั่ง
delay(10000);
เพื่อรอเป็นเวลา 10 วินาทีก่อนที่จะทำการวัดอีกครั้ง.
5.3 Line Message API คือฟีเจอร์หนึ่งในการทำตัวบอทสำหรับแอปพลิเคชัน Line ซึ่งมีการส่งค่ากันผ่าน Line Message API โดยที่เราสามารถตั้งค่าไว้ได้เลยต้องการบอทตอบกลับแบบใด
const String LINE_TOKEN = "y7aI4Fo7yrYRK/hgkggKyyvSSLNFajtTcWqYSUp2p8HDCIz3LrezI5gt7Nfk9dQGiaAgVB5aKbSFAkkkn7sQ8Jy7/u3/NqsCsV0bTBd80Z2mEtqNVcxGXXEj8s8G8wQRA94mvhNyH54ejlVzhDzqIAdB04t89/1O/w1cDnyilFU"; // LINE Token
const String LINE_USER_ID = "U9b5a01c91676706952bcf703bae5e172"; // LINE User ID
const String LINE_URL = "https://api.line.me/v2/bot/message/push"; // URL สำหรับส่งข้อความผ่าน LINE
จาก Code นี้คือโค๊ดของการเชื่อมต่อ ESP32 กับ Line API โดยต้องมี LINE TOKEN LINE USER ID และ LINE URL
void sendLineMessage(String message) {
// สร้าง JSON payload สำหรับส่งข้อความผ่าน LINE
String jsonPayload = "{\"to\":\"" + LINE_USER_ID + "\",\"messages\":[{\"type\":\"text\",\"text\":\"" + message + "\"}]}";
HTTPClient http;
http.begin(LINE_URL);
http.addHeader("Authorization", "Bearer " + LINE_TOKEN);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(jsonPayload);
จากภาพนี้คือโค๊ดที่ส่งข้อความเตือนว่าคุณภาพอากาศไม่ดีเข้า Line Chat การทำงานของ LINE ในโค้ดนี้เกิดขึ้น ในเมท็อด sendLineMessage
ที่อยู่ในคลาส AirQualityMonitor
. โค้ดนี้ใช้ส่งข้อความผ่าน LINE Messaging API ไปยังผู้ใช้ LINE ที่ระบุในตัวแปร LINE_USER_ID
โดยใช้ LINE Token ที่ระบุในตัวแปร LINE_TOKEN
.
6.ผลการดำเนินงาน
6.1 Diagram ระบบการทำงาน
6.2 การใช้งานระบบ
การใช้งานเพียงแค่เปิดระบบ ระบบจะทำการวัดค่า AQI ในบริเวณนั้นและส่งค่าให้ ESP32 จากนั้นจะคำนวณว่ามีอันตรายต่อร่างกายหรือไม่ และ ถ้าอันตรายจะแจ้งเตือนใน LINE และเปิดอุปกรณ์ระบายอากาศ
6.3 การทดลอง
7.สรุปผลและข้อเสนอแนะ
7.1 สรุปผลคือ MQ-135 สามารถวัดค่าได้ปกติ และระบบได้ทำงานอย่างราบรื่นและไม่มีข้อผิดพลาดใดๆ มีประสิทธิภาพตรงตามเงื่อนไขที่ทดลองไว้ ได้แก่
7.1.1 อุปกรณ์ MQ-135 สามารถวัดค่าได้อย่างคงที่และไม่มีความผิดพลาดในการการวัด
7.1.2 ระบบแจ้งเตือนผ่านแอปพลิเคชัน Line ไม่มีข้อผิดพลาดและสามารถแจ้งเตือนเมื่อคุณภาพอากาศไม่ดี
7.1.3 อุปกรณ์ระบายอากาศทำงานโดยอัตโนมัติเมื่อคุณภาพอากาศไม่ดี และจะหยุดทำงานเมื่อคุณภาพอากาศดีขึ้นแล้ว
7.2 ข้อเสนอแนะ
7.2.1 ควรพิจารณาการเชื่อมต่ออุปกรณ์ระบายอากาศให้ง่ายและสะดวกมากขึ้น
7.2.2 ควรบันทึกค่าที่วัดได้ในฐานข้อมูลสำหรับการติดตามและการวิเคราะห์เพิ่มเติม
7.2.3 ควรสามารถสั่งการและติดตามข้อมูลผ่านแชทบนแอปพลิเคชัน Line Chat ให้ผู้ใช้งานได้อย่างสะดวกและรวดเร็ว
8.อ้างอิง
- แนะนำ ESP32 [ออนไลน์] สืบค้นวันที่ 01/09/2566 ที่ www.artronshop.co.th/article/51/esp32-เบื้องต้น-บทที่-1-แนะนำ-esp32
- ค่าดัชนีคุณภาพอากาศ AQI คืออะไร [ออนไลน์] สืบค้นวันที่ 03/09/2566 ที่www.eng.chula.ac.th/th/29782
- MQ-135 Data Sheet [ออนไลน์] สืบค้นวันที่ 14/09/2566 ที่ www.electronicoscaldas.com/datasheet/MQ-135_Hanwei.pdf
- Relay Module คืออะไร [ออนไลน์] สืบค้นวันที่ 14/09/2566 ที่ www.iot.codemobiles.com/product /14/2-channel-5v-relay-module