lnquy065 gửi vào
- 37966 lượt xem
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.
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.
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
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
Đâ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); }