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

09/10/2018
su-dung-cam-bien-bui-sharp-gp2y10

Mô tả dự án :
1. Giới thiệu
Xin 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,...Gần đây ở Việt Nam các cửa hàng đã 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 viết  này 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ếpsử dụng thư viện.

 2. Chuẩn bị

  • Arduino

  • Optical Dust Sensor - GP2Y1010AU0F

  • Điện Trở 150Ω 

  • Tụ điện 220uF

3. Nối mạch


4. SharpGP2Y10

4.1 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.

Chúng ta có thể thấy nó gồm 03 bộ phần chính:

  • IR LED
  • Phototransistor
  • Amplifier

 4.2 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


 

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

  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

5. Lập trình
5.1Tính trực tiếp

  1. int measurePin = A0;
  2. int ledPower = 2;
  3.  
  4. int samplingTime = 280;
  5. int deltaTime = 40;
  6. int sleepTime = 9680;
  7.  
  8. float voMeasured = 0;
  9. float calcVoltage = 0;
  10. float dustDensity = 0;
  11.  
  12. void setup(){
  13.   Serial.begin(9600);
  14.   pinMode(ledPower,OUTPUT);
  15. }
  16.  
  17. void loop(){
  18.   digitalWrite(ledPower,LOW); // Bật IR LED
  19.   delayMicroseconds(samplingTime);  //Delay 0.28ms
  20.   voMeasured = analogRead(measurePin); // Đọc giá trị ADC V0
  21.   delayMicroseconds(deltaTime); //Delay 0.04ms
  22.   digitalWrite(ledPower,HIGH); // Tắt LED
  23.   delayMicroseconds(sleepTime); //Delay 9.68ms
  24.  
  25.   // Tính điện áp từ giá trị ADC
  26.   calcVoltage = voMeasured * (5.0 / 1024); //Điệp áp Vcc của cảm biến (5.0 hoặc 3.3)
  27.  
  28.   // Linear Equation http://www.howmuchsnow.com/arduino/airquality/
  29.   // Chris Nafis (c) 2012
  30.   dustDensity = 0.17 * calcVoltage - 0.1;
  31.  
  32.  
  33.   Serial.print("Raw Signal Value (0-1023): ");
  34.   Serial.print(voMeasured);
  35.   Serial.print(" - Voltage: ");
  36.   Serial.print(calcVoltage);
  37.   Serial.print(" - Dust Density: ");
  38.   Serial.println(dustDensity);
  39.   delay(1000);
  40. }

5.2 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 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.

  1. #include "SharpGP2Y10.h"
  2.  
  3. //DUST Sensor
  4. int voPin = A0;
  5. int ledPin = 2;
  6. float dustDensity = 0;
  7.  
  8. SharpGP2Y10 dustSensor(voPin, ledPin);
  9.  
  10. void setup() {
  11.     Serial.begin(9600);
  12.  
  13. }
  14.  
  15. void loop() {
  16.     dustDensity = dustSensor.getDustDensity();
  17.     Serial.println(dustDensity);
  18.     delay(1000);
  19. }
Bình luận
Nội dung này chưa có bình luận, hãy gửi bình luận đầu tiên của bạn.
VIẾT BÌNH LUẬN CỦA BẠN