-
-
-
Tổng tiền thanh toán:
-
Sử dụng cảm biến bụi Sharp gp2y10
09/10/2018
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ếp và sử 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
- 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);
- }
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.
- #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);
- }