Home Âm nhạc Kết nối Arduino với cảm biến lưu lượng nước | Học Điện Tử

Kết nối Arduino với cảm biến lưu lượng nước | Học Điện Tử

0
Kết nối Arduino với cảm biến lưu lượng nước | Học Điện Tử

Kết nối Arduino với cảm biến lưu lượng nước

Làm thế nào để bạn đo thể tích của một chất lỏng? Có một vài cách để làm điều đó. Chúng ta có thể xác định bằng cách xác định mức chất lỏng trong một thùng chứa với cảm biến mức nước. Đối với các phép đo mức nước, một cảm biến siêu âm là đã đủ. Tuy nhiên chúng ta có 1 cách khác là sử dụng đồng hồ đo lưu lượng nước.

Cảm biến lưu lượng:

Cảm biến lưu lượng có nhiều dạng. Dưới đây là các loại cảm biến lưu lượng phổ biến trong môi trường công nghiệp:

  • Anemometer
  • Electromagnetic
  • Fluid dynamic
  • Inferential
  • Mass flowmeter
  • Obstruction type
  • Positive-displacement flow meters
  • Ultrasonic

Trong bài viết này, chúng ta sẽ sử dụng thiết bị hoạt động dựa trên hiệu ứng hall, cảm biến lưu lượng kiểu điện từ (Electromagnetic).

Hiệu ứng Hall, nói chung, là sự hiện diện của điện áp ngang trên một dây dẫn mang dòng điện với từ trường gần đó. Một điện áp tồn tại bởi vì từ trường có xu hướng đẩy hoặc kéo các điện tích (tùy thuộc vào cực tính của từ trường) sang một bên của dây dẫn. Nếu một bên của dây dẫn âm hơn so với bên kia, thì sự khác biệt điện năng tồn tại và do đó điện áp phát sinh.

Hiệu ứng hall được mô tả qua video dưới đây:

Một cảm biến Hall sử dụng nguyên tắc này để phát hiện sự hiện diện của một từ trường. Cảm biến Hall tạo ra một điện áp tỷ lệ thuận với cường độ của từ trường gần đó. Những cảm biến giống như transistor bình thường:

Kết nối cảm biến lưu lượng với Arduino

Chúng ta kết nối cảm biến lưu lượng với Arduino thông qua 3 chân: VCC, GND và OUT. Lưu ý: Dòng chảy đi qua cảm biến lưu lượng tốt nhất là theo phương thẳng đứng với chiều từ trên xuống.

Trong bài này chúng ta sử dụng cảm biến như hình bên dưới với các thông số như sau:

Điện áp làm việc 5 – 24V Dòng tối đa 15 mA(DC 5V) Trọng lượng 25 g Khoảng đo 1 ~ 5L/min Nhiệt độ nước cho phép < 120°C Độ ẩm môi trường làm việc 35%~90%RH Áp suất nước cho phép < 0.35Mpa

Tần số tín hiệu đầu ra: F=98xQ (L/Phút) (sai số 2%)

Trong đó:

Q: Lưu lượng nước F: Tần số tín hiệu đầu ra (Hz) 98: Hằng số VD: 1L/phút nước sẽ có công thức : 1×98×60 = 5880 xung/phút

Phạm vi lưu lượng nước mà cảm biến này có thể phát hiện là từ 0,3 lít mỗi phút đến 6 lít mỗi phút. Ta có thể biết 1 lít nước mất khoảng 5880 xung. Con số này sẽ hữu ích trong việc xây dựng đồng hồ đo lưu lượng nước Arduino.

Vì cảm biến lưu lượng tạo ra xung mỗi khi nam châm thẳng hàng với cảm biến hall, chúng ta có thể sử dụng xung này làm bộ kích hoạt ngắt. Chúng ta gắn chân OUT của cảm biến lưu lượng nước vào chân 2 của Arduino là chân ngắt 0.

Sau đó, chúng ta sẽ biết tổng lượng nước chảy qua cảm biến bằng cách chia tổng số xung nhận được cho 5880.

volatile double waterVolume;

void setup() { mobitool.netn(9600); //baudrate waterVolume = 0; attachInterrupt(0, pulseHigh, RISING); //DIGITAL Pin 2: Interrupt 0 } void loop() { mobitool.nett(“Total Water Volume:”); mobitool.nett(waterVolume); mobitool.nettln(” L”); delay(500); }

void pulseHigh() //measure the quantity of square wave { waterVolume += 1.0 / 5880.0; }

Khi chúng ta upload code lên Arduino, lưu lượng nước sẽ được hiển thị trên cổng Serial.

Hiển thị tốc độ dòng chảy

Chúng ta biết rằng 1 lít nước mất 5880 xung. Tất cả những gì chúng ta cần làm là xác định khoảng thời gian giữa các xung bằng hàm millis(). Tốc độ dòng chảy sẽ được tính theo công thức:

Do đó ta có đoạn code dưới đây:

volatile double waterVolume; volatile double waterFlowRate = 0.0; volatile int previousTime = 0; boolean isTriggered = false; double pulseWidth = 0.0;

void setup() { mobitool.netn(9600); //baudrate waterVolume = 0; attachInterrupt(0, pulseHigh, RISING); //DIGITAL Pin 2: Interrupt 0 } void loop() { mobitool.nett(“Total Water Volume:”); mobitool.nett(waterVolume); mobitool.nettln(” L”); mobitool.nett(“Flow Rate:”); if(isTriggered){ mobitool.nett(waterFlowRate); isTriggered = false; }else{ mobitool.nett(“0.0″); } mobitool.nettln(” L/min”); delay(500); }

void pulseHigh() //measure the quantity of square wave { isTriggered = true; waterVolume += 1.0 / 5880.0; attachInterrupt(0, pulseLow, FALLING); previousTime = millis(); }

void pulseLow() { pulseWidth = millis()-previousTime; waterFlowRate = (1000.0/5880.0) / pulseWidth; }

Giải thích code:

Chúng ta có thời gian của xung đầu tiên trong hàm interrupt đầu tiên

void pulseHigh() //measure the quantity of square wave { isTriggered = true; waterVolume += 1.0 / 5880.0; attachInterrupt(0, pulseLow, FALLING); previousTime = millis(); }

trong hàm interrupt này chúng ta thêm vào interrupt thứ 2 để bắt cạnh xuống của xung:

void pulseLow() { pulseWidth = millis()-previousTime; waterFlowRate = (1000.0/5880.0) / pulseWidth; }

Trong hàm interrupt thứ 2 ta xác định được khoảng thời gian giữa các xung và tính toán được tốc độ dòng chảy. Ta cần thêm cờ (isTriggered) để xác định tốc độ là 0 nếu như không có xung đi vào chân ngắt của Arduino.

Nếu bạn có câu hỏi vui lòng theo dõi chúng tôi tại fanpage: mobitool.net/abcArduino/

Xem thêm các bài hướng dẫn khác tại: mobitool.net/category/module-arduino-va-thu-vien/

Xem thêm các bài tự học tại: mobitool.net/category/tu-hoc-arduino/

Rate this post