ระบบวัดคุณภาพอากาศภายในห้อง(Air Quality Monitor)

ผู้เขียนบทความ : นายเศรษฐพงศ์ จะนะจินา 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 สำหรับการแจ้งเตือนผ่าน LINE
    • sendLineMessage() ส่งข้อความผ่าน 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 และเปิดอุปกรณ์ระบายอากาศ

https://cdn.discordapp.com/attachments/723212655963144306/1169922622738407454/IMG_1159.png

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

9. VDO การทำงานของระบบ

https://youtu.be/y6w6ybVsW-U?feature=shared

https://youtu.be/y6w6ybVsW-U?feature=shared

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *