การใช้งานเซนเซอร์วัดแก๊ส CO2 ด้วย MQ135
เซนเซอร์ MQ135 เป็นเซนเซอร์ใช้หลักการนำกระแสของวัสดุแคสซิเทอไรต์ SnO2 ซึ่งนำกระแสได้ต่ำในอากาศที่บริสุทธิ์แต่นำกระแสได้ดีในอากาศที่มีมลพิษ ซึ่งทำให้เรานำคุณสมบัตินี้มาทำวงจรสำหรับตอบสนองต่อคุณภาพอากาศได้
โดย MQ135 มีการตอบสนองอย่างมากกับแก๊สแอมโมเนีย ซัลไฟด์ แก๊สตระกูลเบนซีน และใน Datasheet ยังระบุว่าตรวจจับควันและแก๊สพิษอื่น ๆ ได้เช่นกัน (ซึ่งอาจไม่มี Data ให้ ต้องไปลองเอง?)
(Datasheet : https://www.winsen-sensor.com/d/files/PDF/Semiconductor%20Gas%20Sensor/MQ135%20(Ver1.4)%20-%20Manual.pdf)
เซนเซอร์ตัวนี้ผู้ผลิตเครมว่านอกจากตรวจจับแก๊สพิษได้หลายชนิดแล้ว ยังมีอายุการใช้งานยาวนานเทียบกับราคาแสนต่ำ มักใช้ในงานประเภทการตรวจจับแจ้งเตือนในอาคาร หรือแบบพกพา
ทำความเข้าใจพารามิเตอร์และวงจรต่าง ๆ ในเซนเซอร์
พารามิเตอร์
วงจร
มาเริ่มที่วงจร (มาจาก Datasheet) แสดงวิธีการนำคุณสมบัติของเซนเซอร์มาใช้ โดยการกระตุ้นด้วยแรงดัน VH ซึ่งเป็นแรงดันที่ใช้ในการสร้างความร้อนให้เซนเซอร์เพื่อรักษาคุณสมบัติของการตอบสนองต่อแก๊สไว้ โดย Datasheet ระบุว่ามีการ Preheat เป็นระยะเวลา 48 ชั่วโมง
เมื่อเซนเซอร์อยู่ในสถานะร้อนพร้อมใช้งาน จากวงจรจะเห็นพารามิเตอร์แรงดันอีกตัวเรียกว่าแรงดัน Loop voltage Vc
แรงดันนี้ใช้ในการปล่อยแรงดันให้ตกคร่อมเซนเซอร์(ที่ทำตัวเสมือนตัวต้านทานที่แปรตามมลพิษในอากาศ ซึ่งแรงดันนี้จะต้องไม่เกิน 24V แต่ในตัวอย่างวงจรเราจะเห็นว่าข้อมูลที่ได้ใน Datasheet หลังจากนี้ (ผลการทดลอง) จะใช้แรงดัน 5V เท่ากับแรงดัน VH แต่ให้เข้าใจว่าเป็นคนละตัวกัน และไม่จำเป็นต้องมีค่าเท่ากัน
เมื่อมีการปล่อยแรงดันให้ตกคร่อมเซนเซอร์ จะมีกระแสไหลผ่านเซนเซอร์จำนวนมากหากความต้านทานที่เกิดขึ้นบนตัวเซนเซอร์มีค่าต่ำ จึงต้องมีการลิมิตกระแสไว้ด้วยตัวต้านทาน RL ซึ่งเราจะวัดแรงดันที่ตกคร่อมตัวต้านทานนี้ เพราะแรงดันที่ตกคร่อมตัวต้านทานนี้แปรผันตรงกับกระแสที่ไหลผ่านตัวเซนเซอร์ และแปรผกผันกับตัวต้านทานที่เกิดขึ้นบนตัวเซนเซอร์ และแปรผันตรงกับปริมาณแก๊สพิษในอากาศดังความสัมพันธ์ด้านล่าง
VRL ∝ กระแสผ่านเซนเซอร์ ∝ ประมาณ ppm อากาศเป็นพิษ
โดยผลการทดลองที่ให้มากับ Datasheet ทำให้เราทราบการตอบสนองกับแก๊สชนิดต่าง ๆ 4 ตัว ประกอบด้วย แก๊ส H2 , อากาศ, แอมโมเนีย และโทลูอีน ดังรูป
โดยกราฟแกน x คือความเข้มข้นของแก๊ส และแกน Y คือค่าอัตราส่วน Rs/Ro ซึ่ง Rs คือความต้านทานของเซนเซอร์ตอนวัดแก๊สพิษ และ Ro คือความต้านทานเมื่อวัดในอากาศบริสุทธิ์
(ซึ่งจากผลการทดลองที่เกิดขึ้นใน Datasheet จะถูกวัดโดยทำในอุณหภูมิห้องที่ 20 องศาเซลเซียส และความชื้นในอากาศ 55% ดังนั้นถ้าเราคาดหวังให้เซนเซอร์ตัวนี้ให้ค่า ppm ตามกราฟ เราต้องพิจารณาค่าเหล่านี้ด้วย)
การนำไปใช้งานกับ Microcontroller
เมื่อพิจารณาการนำมาใช้งานจริงจากข้อมูลด้านบนเป็นข้อมูลที่วัดบนตัวเซนเซอร์โดยตรง หากเราใช้โมดูลที่เป็นโมดูลพร้อม PCB แบบพร้อมใช้งาน เราจำเป็นต้องทำความเข้าใจวงจรที่สอดคล้องกันกับที่วางขาย ซึ่งมักจะเป็นไปตาม schematic ด้านล่าง (1)
จาก Schematic จะเห็นว่าส่วนของเซนเซอร์ (ไฮไลท์สีเขียว) จะเหมือนที่เราอธิบายไปข้างต้น โดยมีส่วนของ VH และ VL จะถูกใช้เป็น VCC บนตัวโมดูล และ VRL จะถูกดึงไปออกทางพอร์ตเป็นชื่อ AOUT แต่ในส่วนของวงจรทางซีกขวา (ไฮไลท์สีแดง) จะเป็นส่วนการเทียบแรงดันให้ออกเป็นสัญญาณ Digital นั้นเราจะไม่ให้ความสนใจในส่วนนี้
ส่วนที่สำคัญที่สุดในวงจรนี้คือส่วน RL ซึ่งใน Datasheet ระบุว่าควรมีค่าอยู่ระหว่าง 10KΩ - 47KΩ โดย Datasheet ให้คำแนะนำว่า ต้อง calibrate ค่า NH3 100ppm หรือ แอลกอฮอร์ 50ppm แล้วนำค่า RL ที่วัดได้มาใช้เพื่อให้สอดคล้องกับ Datasheet ซึ่งจะวัดได้ค่าราว ๆ 20KΩ แต่จาก (1) ระบุว่าใน PCB ใส่ค่ามาให้แค่ 1KΩ ตามรูปด้านล่าง
โดยในกรณีนี้จะยกตัวอย่างการวัดแก๊สที่มักนิยมซื้อเซนเซอร์ตัวนี้ไปวัดกันนั่นคือ CO2
ขั้นตอนที่ 1
ต้องเปลี่ยนค่าตัวต้านทาน RL ให้เหมาะสมกับการใช้วัด CO2 โดยต้องเปลี่ยนตัวต้านทานตัวนี้เป็น 22KΩ ตาม (1)
ขั้นตอนที่ 2
ดาวน์โหลด Library https://github.com/GeorgK/MQ135
ขั้นตอนที่ 3
ให้อัพโหลดโค้ดด้านล่างเพื่ออ่านค่า R0 โดยเปิดทิ้งไว้นานกว่า 24 ชั่วโมง เพื่อรอให้เซนเซอร์ร้อนได้ที่ก่อน จึงอ่านค่าล่าสุดหลังเวลาดังกล่าว สมมติได้ 8965.1 Ohm
#include "MQ135.h"
void setup (){
Serial.begin (9600);
}
void loop() {
MQ135 gasSensor = MQ135(A0); // Attach sensor to pin A0
float rzero = gasSensor.getRZero();
Serial.println (rzero);
delay(1000);
}
ขั้นตอนที่ 4
นำค่า R0 ที่ได้ใส่ใน Documents > Arduino > libraries > MQ135-master > MQ135.h ตรงส่วนของ RLOAD และ RZERO ดังนี้
///The load resistance on the board
#define RLOAD 22000.0 //อันนี้เป็นค่าตัวต้านทาน RL ที่เราพึ่งเปล่ียนในขั้นตอนที่ 1
///Calibration resistence at atmospheric CO2 level
#define RZERO 8965.1 //อันนี้เป็นค่าที่วัดได้ในเซนเซอร์นั้น ๆ
จากนั้นเลื่อนลงมาจะเจอพารามิเตอร์อีกตัวชื่อ ATMOCO2 ให้เราแก้จาก 397.13 เป็น 419 ซึ่งเป็นค่า CO2 ในชั้นบรรยากาศปัจจุบัน (2)
///Atmospheric CO2 level for calibration purposes
#define ATMOCO2 419.0
ขั้นตอนที่ 5
เปิดไฟล์ Documents > Arduino > libraries > MQ135-master > MQ135.cpp
แก้ไขสมการคำนวณตัวต้านทานเป็นดังด้านล่าง
float MQ135::getResistance() { int val = analogRead(_pin); return ((1023./(float)val) - 1.)*RLOAD; }
ขั้นตอนที่ 6
ให้อัพโหลดตัวอย่างโปรแกรมข้างล่าง เท่านี้เราจะได้ค่า CO2 เป็นหน่วย ppm มาแล้วครับ
#include <Arduino.h>
#include "MQ135.h"
void setup()
{
Serial.begin(9600);
delay(1000);
Serial.println("===PARAMS===");
Serial.print("RLOAD = ");Serial.println(RLOAD);
Serial.print("RZERO = ");Serial.println(RZERO);
Serial.print("ATMOCO2 = ");Serial.println(ATMOCO2);
Serial.println("===========");
}
void loop()
{
MQ135 gasSensor = MQ135(A0); // Attach sensor to pin A0
float ppm = gasSensor.getPPM();
Serial.print("ADC = ");
Serial.println(analogRead(A0));
Serial.print("RZERO = ");
Serial.println(gasSensor.getRZero());
Serial.print("CO2 ~ ");
Serial.print(ppm);
Serial.println(" ppm");
delay(1000);
}
แต่ !!! อย่าลืมว่าในอากาศประกอบไปด้วยแก๊สหลายชนิด เราไม่อาจทราบได้จริง ๆ ว่า ณเวลานั้นเรากำลังวัดแก๊สอะไรอยู่กันแน่ ค่าที่ออกมาก็จะเป็นค่าผสมกันระหว่างแก๊สเหล่านั้น ทำให้ผลผิดเพี้ยนไปเลยก็ได้ รวมไปถึงค่าตัวแปรที่ Library ใช้มาคำนวณ ก็อิงจากสถานการณ์ที่คงที่เช่น ความชื้น อุณหภูมิ ซึ่งข้อมูลเหล่านี้ไม่เคยคงที่ในสถานการณ์จริง ๆ ดังนั้นค่าที่ได้ควรใช้เป็นค่า relative กับแก๊ส clean air จะดีที่สุด ไม่ควรไปเรียกว่ามันคือ CO2 กี่ ppm ถ้าเราไม่ได้ทราบว่าแก๊สที่เรากำลังวัดมีแต่ CO2 ที่ตอบสนองกับตัวเซนเซอร์จริง ๆ (3)
ธนบดี บุหลันศรีชาติ
ModuleMore.com
Reference
(2) https://www.co2levels.org/
(3) https://emariete.com/en/meter-co2-sensor-mq-135/