Chuẩn bị linh kiện
- Arduino Nano
- MQ-135 Sensor
- Dây Jumper
- Màn hình 0.96 inch SPI OLED
- Board cắm
- Điện trở 22KΩ
Màn hình OLED:

Tên chân | Ký hiệu khác | Mô tả |
Gnd | Ground | Ground |
Vdd | Vcc, 5V | Nguồn cung cấp3-5V |
SCK | D0,SCL,CLK | Chân clock cho I2C và SPI |
SDA | D1,MOSI | Chân Data cho I2C và SPI |
RES | RST, RESET | Chân Reset (hữu ích cho SPI) |
DC | A0 | Data Command , sử dụng cho SPI |
CS | Chip Select | Chân chọn màn hình làm Slave khi giao tiếp SPI |
Thông số của màn hình OLED :
- OLED Driver IC: SSD1306
- Độ phân giải: 128 x 64
- Góc nhìn: >160°
- Điện áp đầu vào: 3.3V ~ 6V
- Màu của điểm ảnh: Blue
- Nhiệt độ làm việc: -30°C ~ 70°C
Cảm biến MQ135:


Cảm biến này có thể nhận biết được các chất khí như NH3, Nox, Ancol, Benzen, Khói, gas, CO2…… Đa số khí nó nhận biết đều là khí tạp chất và không có lợi cho sức khỏe nên chính vì vậy người ta gọi nó là cảm biến chất lượng không khí.
- Điện áp nguồn <=24V DC
- Điện áp của heater: 5V AC/DC
- Điện trở tải: Thay đổi được (2kOm -> 47kOm)
- Điện trở heater: 33om
- Công suất tiêu thụ của heater: Nhỏ hơn 800mW
- Nồng độ phát hiện của một số chất: 10 – 300 ppm NH3, 10 – 1000 ppm Benzen, 10 – 300 ppm Alcol
PPM là đơn vị đo mật độ thường dành cho các mật độ TƯƠNG ĐỐI THẤP. Nó thường chỉ tỷ lệ của lượng một chất trong tổng số lượng của hỗn hợp chứa chất đó (Ở đây là hỗn hợp không khí). Ở đây lượng có thể hiểu là khối lượng, thể tích, số hạt (số mol),… Khi dùng cần chỉ rõ lượng là gì. ppm = 1/1 000 000 = 10-6.


Điều chỉnh độ nhạy:
Điện trở RL có vai trò rất quan trọng đến hoạt động của module sensor. Theo datasheet của MQ135 thì RL có thể điều chỉnh từ 10KΩ đến 47KΩ. Bạn sẽ thấy trên mạch module, nhà sản xuất đã hàn điện trở RL ;à 1KΩ (102). Để tập trung đo nồng độ khí CO2 thì bạn nên thay đổi giá trị của RL từ 1 KOhm lên 22 KOhm.

Kết nối MQ135 với Arduino:

Số thứ tự | Màn hình OLED | Arduino Uno |
1 | GND | Ground |
2 | VCC | 5V |
3 | D0 | 10 |
4 | D1 | 9 |
5 | RES | 13 |
6 | DC | 11 |
7 | CS | 12 |
Lập trình
Thư viện: https://github.com/GeorgK/MQ135
Tính điện trở R0 với điều kiện không khi sạch, bạn phải làm nóng cảm biến trong vòng 24h, sau đó đọc giá trị R0 theo code sau trên Arduino, mở cửa sổ Terminal để xem giá trị:
#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);
}
Sau khi lấy được giá trị R0, chúng ta vào Documents > Arduino > libraries > MQ135-master folder , sau đỏ mở file MQ135.h => Thay đổi giá trị RLOAD và RZERO.
///The load resistance on the board #define RLOAD 22.0 ///Calibration resistence at atmospheric CO2 level #define RZERO 5804.99
Tiếp tụ kéo xuống và thay thế giá trị ATMOCO2 với giá trị nồng độ CO2 trong khí quyển là 412.29
///Atmospheric CO2 level for calibration purposes #define ATMOCO2 397.13
Code chính thức cho hệ thống:
Các thưu viện cần dùng:
Adafruit_GFX của tác giả by Adafruit
Adafruit_SSD1306 của tác giả by Adafruit
MQ135.h tại https://github.com/GeorgK/MQ135
Cài đặt tại Sketch => Include Library => Manage Libraries như các thư viện khác trên Arduino.
Khai báo thư viện:
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Thiết lập thông số độ phân giải của màn hình OLED:
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Khai báo các chân giao tiếp của màn hình OLED với Arduino Uno:
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Khai báo chân đọc giá trị điện áp trả về của MQ135:
int sensorIn = A0;
Trong hàm setup(), khai báo baud rate cho Serial Monitor là 9600 và khởi tạo màn hình OLED:
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
Trong hàm loop(), đọc giá trị điện áp từ cảm biến:
val = analogRead(A0);
Serial.print ("raw = ");
Gọi hàm tính toán giá trị nồng độ CO2:
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
Thiết lập cỡ chữ và màu cho chữ trên màn hình OLED:
display.setTextSize(1);
display.setTextColor(WHITE);
Chọn vị trí để hiển thị giá trị nồng độ CO2 lên màn hình OLED:
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
Hiển thị chữ lên màn hình OLED:
display.display();
display.clearDisplay();
Kết quả:

CODE:
/*
* Interfacing MQ135 Gas Senor with Arduino
* Author: Ashish
* Website: www.circuitdigest.com
* Date: 11-11-2020
*/
// The load resistance on the board
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
Tham khảo: https://circuitdigest.com/