This is the first of two logs about the software needed for the SniffingTrinket project. Because I guess that a general Arduino library for the MQ135 might be of use for other projects, I decided to split the software in a dedicated library and a sketch specifically for the SniffingTrinket. So, this is solely about the MQ135 lib, which, btw. you can find in my GitHub.
First, some theory: My interest in those cheap gas sensors was sparked by a video from Ben Krasnow who takes a look at a cheap breathalyzer with a very similar sensor. He links a paper in his blog post that goes into the theory of the operation of these sensors. In short, they consist of a heated piece of tin dioxide (doped with other stuff) that changes resistance as it reacts with the ambient gas (the heat accelerates the chemical reaction). There are several versions of these sensor, sensitive to several gas types. However, no sensor material is sensitive to a single gas only! I did some more research and found in principle two sensor of immediate interest to me: The MQ135 for "air quality" and the MQ811 for CO2. The MQ811 is much more expensive (30$ compared to 3$).
The datasheet claims that the MQ135 is sensitive for CO2, Alkohol, Benzene, NOx, NH3 and the Fig 3 shows the change in resistance depending on the concentration of these gases in the ambient air in ppm (of the total gas volume). It turns out the the general sensitivity is the roughly same for all the gases. This is where you think: Wait a minute! CO2 is the 4th most abundant trace gas in the earths atmosphere with about 400ppm concentration (N2, O2, and Ar are on place 1-3). All of the other gases the sensor detects are much less common than CO2 and luckily so, as they are harmful. This means, in a normal atmosphere the sensor mostly detects CO2 and with the right calibration we can use it as a cheap replacement for the MQ811 (which by the way is also sensitive to other gases). Turns out, somebody already hat a go at this: I will leave you with great explanation of David Gironi for the details, but mostly he just extracts data from the figures in the datasheet, throws some math at the problem and cross-checks the results with a different kind of sensor for CO2.
The Library I have written basically just implements his approach for the Arduino. It's pretty easy to use. Copy it to your Arduino library folder and put
#include "MQ135.h"
MQ135 gasSensor = MQ135(ANALOGPIN);
to your sketch. ANALOGPIN is the ADC input for the sensor readings (refer to the post with the SniffingTrinket schematic for explanation).
Before you can use the sensor, it has to be calibrated. For this, connect the sensor to your circuit and leave it powered on for 12-24 h to burn it in. Then put it into outside air, preferably at 20°C/35% rel. hum. (humidity is not so crucial). Read out the calibration value as such
float rzero = gasSensor.getRZero();
Wait until the value has somewhat settled (30min-1h). Remember, this is an ADC measurement so you might not want to wait some time between reading the sensor and also do some averaging. Once you have determined your RZero, put it into the MQ135.h. Note: Different sensors will likely have different RZero!
#define RZERO 76.63
Congrats, you have calibrated the sensor and can now read the CO2 ppm value in your sketch
float ppm = gasSensor.getPPM();
The library also provides functions to apply the temperature/humidity correction that is shown in Fig 4 of the datasheet, but I do not trust the datasheet there, so this should not be used for the moment.
If you want to know more, look at the code. I tried to make it very readable and self explaining and provided lots of comments. If you do not understand something, ask: I will happily explain it.
นี้เป็นครั้งแรกของแฟ้มบันทึกที่สองเกี่ยวกับซอฟต์แวร์จำเป็นสำหรับโครงการ SniffingTrinket เพราะฉันเดาว่า รีสืบทั่วไปสำหรับ MQ135 อาจจะมีการใช้สำหรับโครงการอื่น ๆ ฉันตัดสินใจแบ่งซอฟต์แวร์ในไลบรารีที่เฉพาะและร่างการโดยเฉพาะสำหรับการ SniffingTrinket ดังนั้น นี้เป็นเพียงเกี่ยวกับการ MQ135 lib ซึ่ง btw คุณสามารถค้นหาใน GitHub ของฉันแรก บางทฤษฎี: ฉันสนใจในเซ็นเซอร์แก๊สราคาถูกที่ถูกจุดประกาย โดยวิดีโอจาก Ben Krasnow ซึ่งจะดูที่ breathalyzer ราคาประหยัดกับเซนเซอร์มากเหมือน กัน เขาเชื่อมโยงข้อมูลในลงบล็อกที่เข้าสู่ทฤษฎีของการทำงานของเซนเซอร์เหล่านี้ ในระยะสั้น พวกเขาประกอบด้วยชิ้นอุ่นของไดออกไซด์ดีบุก (doped ด้วยสิ่งอื่น ๆ) ที่เปลี่ยนแปลงความต้านทานจะทำปฏิกิริยากับก๊าซล้อม (ความร้อนช่วยเร่งปฏิกิริยาเคมี) มีหลายรุ่นของเซนเซอร์เหล่านี้ ความไวต่อก๊าซชนิดต่าง ๆ อย่างไรก็ตาม วัสดุไม่เซ็นเซอร์มีความไวต่อก๊าซเดียวเท่านั้น ฉันไม่ได้งานวิจัยบางอย่าง และพบในเซ็นเซอร์หลักสองทันทีสนใจฉัน: เดอะ MQ135 "อากาศคุณภาพ" และ MQ811 สำหรับ CO2 MQ811 มีราคาแพงมาก (30$ เทียบกับ 3$)แผ่นข้อมูลอ้างว่า MQ135 ที่เป็นสำหรับ CO2, Alkohol เบนซีน โรงแรมน็อกซ์ NH3 และ 3 ฟิกแสดงการเปลี่ยนแปลงในความต้านทานขึ้นอยู่กับความเข้มข้นของก๊าซนี้ในอากาศแวดล้อมใน ppm (ของปริมาณก๊าซทั้งหมด) ดังปรากฎว่าไวทั่วไปอยู่ประมาณเดียวกันสำหรับก๊าซทั้งหมด นี่คือที่คุณคิดว่า: รอสักครู่ CO2 เป็นก๊าซติดตามมากที่สุด 4 ในบรรยากาศอักษรของโลกประมาณ 400 ppm ความเข้มข้น (N2, O2 และ Ar อยู่ 1-3) ของก๊าซอื่น ๆ เซนเซอร์ตรวจพบอยู่ทั่วไปมากน้อย กว่า CO2 และโชคดีมาก พวกเขาเป็นอันตราย นี้หมายความว่า ในบรรยากาศปกติ เซนเซอร์ส่วนใหญ่ตรวจพบ CO2 และ ด้วยการปรับเทียบที่เหมาะสม เราสามารถใช้แทนราคาถูก MQ811 (ซึ่ง โดยวิธีเป็นความไวต่อก๊าซอื่น ๆ) เปิด ใครสักคนแล้วหาดใหญ่ไปที่: ฉันจะทำให้คุณ มีคำอธิบายที่ดีของ David Gironi สำหรับรายละเอียด แต่ส่วนใหญ่เขาเพียงแยกข้อมูลจากตัวเลขในแผ่นข้อมูล พ่นคณิตศาสตร์บางที่ปัญหา และขนตรวจสอบผลลัพธ์ ด้วยเซนเซอร์ชนิดอื่นสำหรับ CO2รีเพราะมีเขียนเครื่องมือโดยทั่วไปเพียงวิธีการของเขาสำหรับการสืบ สวยใช้งานง่ายได้ คัดลอกไปยังโฟลเดอร์ไลบรารีสืบ และใส่#include "MQ135.h"MQ135 gasSensor = MQ135(ANALOGPIN)การร่างของคุณ ANALOGPIN เป็นอินพุต ADC สำหรับอ่านเซ็นเซอร์ (ถึงลงด้วยการ SniffingTrinket แผนผังตัวอย่างการอธิบาย)Before you can use the sensor, it has to be calibrated. For this, connect the sensor to your circuit and leave it powered on for 12-24 h to burn it in. Then put it into outside air, preferably at 20°C/35% rel. hum. (humidity is not so crucial). Read out the calibration value as suchfloat rzero = gasSensor.getRZero();Wait until the value has somewhat settled (30min-1h). Remember, this is an ADC measurement so you might not want to wait some time between reading the sensor and also do some averaging. Once you have determined your RZero, put it into the MQ135.h. Note: Different sensors will likely have different RZero!#define RZERO 76.63Congrats, you have calibrated the sensor and can now read the CO2 ppm value in your sketchfloat ppm = gasSensor.getPPM();The library also provides functions to apply the temperature/humidity correction that is shown in Fig 4 of the datasheet, but I do not trust the datasheet there, so this should not be used for the moment.If you want to know more, look at the code. I tried to make it very readable and self explaining and provided lots of comments. If you do not understand something, ask: I will happily explain it.
การแปล กรุณารอสักครู่..