博客專欄

EEPW首頁(yè) > 博客 > 「電路DIY」使用ARDUINO和流量傳感器測(cè)量水流量和體積

「電路DIY」使用ARDUINO和流量傳感器測(cè)量水流量和體積

發(fā)布人:電子資料庫(kù) 時(shí)間:2023-02-24 來(lái)源:工程師 發(fā)布文章

流速和容積有助于判斷進(jìn)入或通過(guò)特定容器的液體量。對(duì)于某些過(guò)程自動(dòng)化應(yīng)用來(lái)說(shuō),這個(gè)簡(jiǎn)單的流體測(cè)量任務(wù)對(duì)項(xiàng)目的成功至關(guān)重要,如果不能正確完成,可能會(huì)使整個(gè)過(guò)程陷入困境。這就是為什么在今天的教程中,我認(rèn)為看看這個(gè)漂亮的水流量傳感器會(huì)很酷YF-S201,以及在基于Arduino的項(xiàng)目中的使用。

YF-S201水流量傳感器由一個(gè)針輪傳感器組成,該傳感器測(cè)量通過(guò)它的液體量。

image.png

YFS201

該傳感器利用電磁學(xué)原理,當(dāng)液體流過(guò)傳感器時(shí),流動(dòng)作用會(huì)影響傳感器中渦輪的散熱片,導(dǎo)致車輪打滑。渦輪的軸與霍爾效應(yīng)傳感器相連,因此每次旋轉(zhuǎn)都會(huì)產(chǎn)生一個(gè)脈沖,通過(guò)微控制器監(jiān)測(cè)該脈沖,傳感器可用于確定通過(guò)它的流體體積。

作為今天的微控制器,我們將使用微控制器. Uno將用于計(jì)算一段時(shí)間內(nèi)檢測(cè)到的脈沖數(shù),并使用脈沖總數(shù)計(jì)算流速(以升/小時(shí)為單位)和通過(guò)它的流體總體積。結(jié)果,流量和體積,將顯示在一個(gè)16×2液晶顯示屏上,以便向用戶提供視覺(jué)反饋。如果16×2 LCD不可用,您可以通過(guò)Arduino串行監(jiān)視器查看數(shù)據(jù)。

在本文章的最后,您將了解如何在Arduino中使用YF-S201流量傳感器。

所需組件

生成此項(xiàng)目需要以下組件:

  1. YF-S201水流傳感器

  2. Arduino UNO(或任何其他兼容板)

  3. 16×2液晶顯示屏

  4. 跨接導(dǎo)線

  5. 試驗(yàn)板

  6. 電源組或電池組

示意圖

按下圖所示連接部件:

image.png


示意圖

為了方便讀取傳感器和計(jì)算流量,本發(fā)明的中斷特性Atmega328p在Ardunio上,使用YF-S201連接到Uno的一個(gè)中斷啟用的IO(在本例中為插腳D2)。另一方面,LCD以4位模式連接到Arduino。為了節(jié)省連接時(shí)間,您還可以決定使用支持I2C的16×2 LCD顯示器。為此,您只需將4根導(dǎo)線從顯示器連接到Arduino。但是,它需要對(duì)代碼進(jìn)行一些修改,所以在做出決定之前,請(qǐng)確保您可以處理它。

下面提供了一個(gè)連接的分解圖,顯示了組件是如何連接的,針腳對(duì)針腳;

YF-S201 – Arduino Uno

VCC(red wire) - 5VGND(Black wire) - GNDSignal(Yellow wire) - A0

液晶顯示器–Arduino Uno

Vss - GNDVdd - 5VV0 - (Connect to middle point of potentiometer)RS - D12RW- GNDE - D11D7 - D9D6 - D3D5 - D4D4 - D5LED+ - 5VLED - GND

為了更好地理解液晶顯示器的連接,你可以看看我們之前寫(xiě)的這篇教程16×2液晶顯示器與Arduino接口董事會(huì)

在繼續(xù)下一節(jié)之前,請(qǐng)仔細(xì)檢查連接,確保一切正常。

代碼

草圖背后的想法很簡(jiǎn)單:監(jiān)視YF-S201檢測(cè)霍爾傳感器何時(shí)觸發(fā)(檢測(cè)到流量),并增加一個(gè)變量以顯示增加的流入量。然而,為了高效準(zhǔn)確地做到這一點(diǎn),我們將使用Arduino的中斷特性,這樣每當(dāng)霍爾傳感器檢測(cè)到旋轉(zhuǎn)磁鐵時(shí),Arduino就會(huì)觸發(fā)并注冊(cè)上升沿中斷。然后,在特定時(shí)間內(nèi)觸發(fā)的總中斷數(shù)用于生成流量和流經(jīng)流量計(jì)的液體總體積。

由于流的確定非常直接,因此本教程中我們將使用的唯一庫(kù)是Arduino液晶庫(kù). 該庫(kù)包含的功能使16×2液晶顯示器與Arduino接口變得容易。該庫(kù)包含在Arduino IDE中,但如果沒(méi)有,則可以通過(guò)Arduino IDE庫(kù)管理器進(jìn)行安裝。

安裝了庫(kù)之后,我們開(kāi)始為項(xiàng)目編寫(xiě)Arduino草圖。

像往常一樣,我會(huì)檢查代碼并解釋其中的部分內(nèi)容。

代碼從包含液晶庫(kù)開(kāi)始:

#include <LiquidCrystal.h>

接下來(lái)是一些變量的聲明,這些變量將用于以后存儲(chǔ)數(shù)據(jù),并創(chuàng)建一個(gè)液晶庫(kù)實(shí)例。

volatile int flow_frequency; // Measures flow sensor pulsesfloat vol = 0.0,l_minute;unsigned char flowsensor = 2; // Sensor Inputunsigned long currentTime;unsigned long cloopTime;LiquidCrystal lcd(12, 11, 5, 4, 3, 9);

接下來(lái),我們創(chuàng)建流量()功能。此函數(shù)在檢測(cè)到中斷時(shí)調(diào)用,它將增加作為流量指示的流量計(jì)數(shù)器。

void flow () // Interrupt function{
   flow_frequency++;
}

接下來(lái),我們編寫(xiě)無(wú)效設(shè)置()功能。我們通過(guò)初始化串行通信來(lái)啟動(dòng)該功能,以便訪問(wèn)串行監(jiān)視器以進(jìn)行調(diào)試。

Serial.begin(9600);

接下來(lái),我們將流量傳感器信號(hào)管腳所連接的Arduino管腳聲明為輸入管腳。我們把大頭針拉上去 "Igh"建立一個(gè) Faxing邊緣中斷流量()我們先前創(chuàng)建的回調(diào)函數(shù)。

pinMode(flowsensor, INPUT);digitalWrite(flowsensor, HIGH); // Optional Internal Pull-UpattachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt

接下來(lái),我們初始化LCD并顯示一些單詞,以創(chuàng)建類似于移動(dòng)應(yīng)用程序中的啟動(dòng)屏幕的效果。

lcd.begin(16, 2);lcd.clear();lcd.setCursor(0,0);lcd.print("Arduino Flow Meter");lcd.setCursor(0,1);lcd.print("v1.0");

我們通過(guò)調(diào)用millis()函數(shù)來(lái)跟蹤從流量開(kāi)始的時(shí)間,作為特定時(shí)間范圍內(nèi)流量的度量。

 currentTime = millis();   cloopTime = currentTime;
}

接下來(lái),我們編寫(xiě)無(wú)效循環(huán)()功能

循環(huán)首先比較自上一個(gè)循環(huán)以來(lái)經(jīng)過(guò)的時(shí)間。然后,通過(guò)中斷操作獲得的流量頻率除以時(shí)間(以分鐘為單位),該值顯示為流量。該值也會(huì)加到現(xiàn)有體積(vol)上,并顯示為通過(guò)傳感器的液體總體積。

void loop ()
{
   currentTime = millis();   // Every second, calculate and print litres/hour
   if(currentTime >= (cloopTime + 1000))
   {
    cloopTime = currentTime; // Updates cloopTime
    if(flow_frequency != 0){      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
      l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print(l_minute);
      lcd.print(" L/M");
      l_minute = l_minute/60;
      lcd.setCursor(0,1);
      vol = vol +l_minute;
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
      flow_frequency = 0; // Reset Counter
      Serial.print(l_minute, DEC); // Print litres/hour
      Serial.println(" L/Sec");
    }

如果在整個(gè)過(guò)程中沒(méi)有觸發(fā)中斷,LCD上顯示零。

   else {      Serial.println(" flow rate = 0 ");      lcd.clear();      lcd.setCursor(0,0);      lcd.print("Rate: ");      lcd.print( flow_frequency );      lcd.print(" L/M");      lcd.setCursor(0,1);      lcd.print("Vol:");      lcd.print(vol);      lcd.print(" L");
    }
   }
}

循環(huán)繼續(xù),價(jià)值增加,直到項(xiàng)目斷電。

完整的草圖如下所示,并附在下載部分下。

#include <LiquidCrystal.h>float vol = 0.0,l_minute;unsigned char flowsensor = 2; // Sensor Inputunsigned long currentTime;unsigned long cloopTime;LiquidCrystal lcd(12, 11, 5, 4, 3, 9);void flow () // Interrupt function to increment flow{
   flow_frequency++;
}void setup(){
   Serial.begin(9600);
   pinMode(flowsensor, INPUT);
   digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
   attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
   
   lcd.begin(16, 2);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Arduino FlowMeter");
   lcd.setCursor(0,1);
   lcd.print("v1.0");
   currentTime = millis();
   cloopTime = currentTime;
}void loop (){
   currentTime = millis();   // Every second, calculate and print litres/hour
   if(currentTime >= (cloopTime + 1000))
   {
    cloopTime = currentTime; // Updates cloopTime
    if(flow_frequency != 0)
    {
      
       l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print(l_minute);
      lcd.print(" L/M");
      l_minute = l_minute/60;
      lcd.setCursor(0,1);
      vol = vol +l_minute;
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
      flow_frequency = 0; // Reset Counter
      Serial.print(l_minute, DEC); // Print litres/hour
      Serial.println(" L/Sec");
    }    else {
      Serial.println(" flow rate = 0 ");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print( flow_frequency );
      lcd.print(" L/M");
      lcd.setCursor(0,1);
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
    }
   }
}
演示

檢查一下你的關(guān)系,確保一切正常。完成此操作并完成代碼后,將硬件連接到計(jì)算機(jī)并將代碼上載到Arduino板。如果成功,您將看到顯示如下圖所示。

image.png

圖像來(lái)源:circuitdigest.com

用任何對(duì)你來(lái)說(shuō)容易的方法連接一些管道,然后讓一些水通過(guò)流量傳感器。你應(yīng)該看到流量顯示在屏幕上,隨著水流強(qiáng)度的變化而變化,你還應(yīng)該看到隨著更多的水流過(guò),體積也會(huì)增加。
如果在那一刻你周圍沒(méi)有水管,你可以向傳感器吹入一些空氣。你應(yīng)該聽(tīng)到轉(zhuǎn)子旋轉(zhuǎn)的聲音,LCD上的數(shù)值應(yīng)該會(huì)增加。

流量/體積計(jì)量是一些工業(yè)甚至個(gè)別消費(fèi)者過(guò)程中非常重要的一部分。它不僅可以監(jiān)控消耗量,還可以監(jiān)控儀表供應(yīng)量,我相信智能水表和自動(dòng)液體分配器等應(yīng)用程序應(yīng)該能讓您深入了解如何將這個(gè)看似基礎(chǔ)的項(xiàng)目轉(zhuǎn)變成一個(gè)令人驚嘆的超級(jí)有用的產(chǎn)品。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: 電路 傳感器

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉