Sử dụng cảm biến bụi Sharp gp2y10

Mô tả dự án: 

Chào các bạn. Hiện nay có rất nhiều dự án cũng như đề tài làm về môi trường, nhưng đa số dừng lại ở mức đo nhiệt độ, độ ẩm,... Dạo gần đây ở Việt Nam các shop đã nhập cảm biến bụi trong không khí về, tuy khá trễ so với các nước nhưng ít nhất chúng ta có cái mới để vọc. Bài này viết sẽ hướng dẫn các bạn đọc giá trị cảm biến qua hai cách đó là dùng code trực tiếp và sử dụng thư viện.

Giới thiệu

Chào các bạn. Hiện nay có rất nhiều dự án cũng như đề tài làm về môi trường, nhưng đa số dừng lại ở mức đo nhiệt độ, độ ẩm,... Dạo gần đây ở Việt Nam các shop đã nhập cảm biến bụi trong không khí về, tuy khá trễ so với các nước nhưng ít nhất chúng ta có cái mới để vọc. Bài này viết sẽ hướng dẫn các bạn đọc giá trị cảm biến qua hai cách đó là dùng code trực tiếp và sử dụng thư viện.

Chuẩn bị

Nối mạch

SharpGP2Y10

Cấu tạo

Trước khi code chúng ta nên tìm hiểu sơ qua về cấu tạo của cảm biến này.

Kết quả hình ảnh cho sharp dust sensor arduino

Kết quả hình ảnh cho sharp dust sensor working

Các bạn có thể thấy nó gồm 03 phần chính:

  • IR LED
  • Phototransistor
  • Amplifier

Nguyên lý hoạt động

Ở đây ta thấy sẽ có 02 bộ phận dùng để truyền và nhận hồng ngoại (IR LED và Phototransistor). 02 bộ phận này được đặt chệch gốc với nhau. Khi có bụi bay vào, tia hồng ngoại từ IR LED sẽ bị dội vào Phototransistor, lúc này điện áp từ phototransistor sẽ được đưa đến mạch khuếch đại (Amplifier) và xuất ra chân Vo.

Phương pháp lấy mẫu

Kết quả hình ảnh cho sharp dust sensor working pulse

Phương pháp đo

Theo datasheet, một lần đo của cảm biến sẽ mất khoảng 10ms để đo. Trong 10ms sẽ có:

  • 0.32ms: Trong khoảng thời gian này, IR LED sẽ được bật lên va chúng ta tiến hành đọc giá trị. Tuy nhiên, chỉ được phép đọc giá trị sau 0.28ms. Vậy những việc chúng ta cần làm trong 0.32ms này đó là:
    • Bật IR LED.
    • Delay 0.28ms.
    • Tắt IR LED.
    • Delay 0.04ms.
  • 9.680ms: Thời gian này cảm biến sẽ không làm gì cả. Vì thế ta chỉ cần delay 9.680ms.

Phương pháp tính kết quả

Tài liệu mô tả cho biết, ta có thể tìm được nồng độ bụi trong không khí bằng quy đổi như sau: 0.5V / 0.1mg/m3.

Nhưng khi sử dụng các chân Analog của Arduino đọc thì điện áp sẽ được chuyển thành giá trị digital (0-1023). Vì vậy chúng ta cần tìm giá trị vol của mỗi mức digital bằng cách đơn giản như sau

vpd = vRef / 1024

Trong đó :

  • vpd: Giá trị điện áp tương ứng với 1 giá trị digital.

  • vRef: Giá trị điện áp cấp cho cảm biến (5.0 hoặc 3.3).

Sau khi đã có vpd, ta chỉ cần nhân với giá trị ADC đọc từ chân Vo của cảm biến là có thể tính ra được điện áp

Vậy là sau khi có điện áp, ta có thể dễ dàng tính ra được nồng bộ bụi trong không khí: dustDensity = (Vo*vpd)/0.5

Kết quả hình ảnh cho dust sensor dust density vs voltage

Tuy nhiên, bằng những phép kiểm thử thực tế, người ta thấy rằng giá trị này không đúng như thực tế. Giá trị đo được không trùng với bảng tham chiếu mà nhà sản xuất đưa ra. Vì vậy người ta dùng phương pháp Linear equation để tìm ra được phương trình cho phép tham chiếu kết quả gần đúng như nhà sản xuất đưa ra.

dustDensity = 0.17 * (Vo * Vpd) - 0.1

Đây là kết quả cuối cùng chúng ta cần tìm!

Lập trình

Tính trực tiếp

int measurePin = A0;
int ledPower = 2;

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);
}

void loop(){
  digitalWrite(ledPower,LOW); // Bật IR LED
  delayMicroseconds(samplingTime);  //Delay 0.28ms
  voMeasured = analogRead(measurePin); // Đọc giá trị ADC V0
  delayMicroseconds(deltaTime); //Delay 0.04ms
  digitalWrite(ledPower,HIGH); // Tắt LED
  delayMicroseconds(sleepTime); //Delay 9.68ms

  // Tính điện áp từ giá trị ADC
  calcVoltage = voMeasured * (5.0 / 1024); //Điệp áp Vcc của cảm biến (5.0 hoặc 3.3)

  // Linear Equation http://www.howmuchsnow.com/arduino/airquality/
  // Chris Nafis (c) 2012
  dustDensity = 0.17 * calcVoltage - 0.1;


  Serial.print("Raw Signal Value (0-1023): ");
  Serial.print(voMeasured);
  Serial.print(" - Voltage: ");
  Serial.print(calcVoltage);
  Serial.print(" - Dust Density: ");
  Serial.println(dustDensity);
  delay(1000);
}

Sử dụng thư viện

Trong những dự án lớn, việc lập trình trên một file duy nhất sẽ khiến code trở nên khó đọc, khó bảo trì và nâng cấp. Vì thế mình đã viết ra thư viện nho nhỏ hỗ trợ cảm biến này, qua đó sẽ giúp code trong chương trình chính trở nên ngắn gọn dễ đọc hơn.

Link thư viện: https://github.com/lnquy065/OpticalDustSensorLibrary

#include "SharpGP2Y10.h"

//DUST Sensor
int voPin = A0;
int ledPin = 2;
float dustDensity = 0;

SharpGP2Y10 dustSensor(voPin, ledPin);

void setup() {
    Serial.begin(9600);

}

void loop() {
    dustDensity = dustSensor.getDustDensity();
    Serial.println(dustDensity);
    delay(1000);
}
lên
11 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: 
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results