博客專欄

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

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

        發布人:電子資料庫 時間:2023-02-24 來源:工程師 發布文章

        流速和容積有助于判斷進入或通過特定容器的液體量。對于某些過程自動化應用來說,這個簡單的流體測量任務對項目的成功至關重要,如果不能正確完成,可能會使整個過程陷入困境。這就是為什么在今天的教程中,我認為看看這個漂亮的水流量傳感器會很酷YF-S201,以及在基于Arduino的項目中的使用。

        YF-S201水流量傳感器由一個針輪傳感器組成,該傳感器測量通過它的液體量。

        image.png

        YFS201

        該傳感器利用電磁學原理,當液體流過傳感器時,流動作用會影響傳感器中渦輪的散熱片,導致車輪打滑。渦輪的軸與霍爾效應傳感器相連,因此每次旋轉都會產生一個脈沖,通過微控制器監測該脈沖,傳感器可用于確定通過它的流體體積。

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

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

        所需組件

        生成此項目需要以下組件:

        1. YF-S201水流傳感器

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

        3. 16×2液晶顯示屏

        4. 跨接導線

        5. 試驗板

        6. 電源組或電池組

        示意圖

        按下圖所示連接部件:

        image.png


        示意圖

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

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

        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

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

        在繼續下一節之前,請仔細檢查連接,確保一切正常。

        代碼

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

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

        安裝了庫之后,我們開始為項目編寫Arduino草圖。

        像往常一樣,我會檢查代碼并解釋其中的部分內容。

        代碼從包含液晶庫開始:

        #include <LiquidCrystal.h>

        接下來是一些變量的聲明,這些變量將用于以后存儲數據,并創建一個液晶庫實例。

        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);

        接下來,我們創建流量()功能。此函數在檢測到中斷時調用,它將增加作為流量指示的流量計數器。

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

        接下來,我們編寫無效設置()功能。我們通過初始化串行通信來啟動該功能,以便訪問串行監視器以進行調試。

        Serial.begin(9600);

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

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

        接下來,我們初始化LCD并顯示一些單詞,以創建類似于移動應用程序中的啟動屏幕的效果。

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

        我們通過調用millis()函數來跟蹤從流量開始的時間,作為特定時間范圍內流量的度量。

         currentTime = millis();   cloopTime = currentTime;
        }

        接下來,我們編寫無效循環()功能

        循環首先比較自上一個循環以來經過的時間。然后,通過中斷操作獲得的流量頻率除以時間(以分鐘為單位),該值顯示為流量。該值也會加到現有體積(vol)上,并顯示為通過傳感器的液體總體積。

        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");
            }

        如果在整個過程中沒有觸發中斷,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");
            }
           }
        }

        循環繼續,價值增加,直到項目斷電。

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

        #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");
            }
           }
        }
        演示

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

        image.png

        圖像來源:circuitdigest.com

        用任何對你來說容易的方法連接一些管道,然后讓一些水通過流量傳感器。你應該看到流量顯示在屏幕上,隨著水流強度的變化而變化,你還應該看到隨著更多的水流,體積也會增加。
        如果在那一刻你周圍沒有水管,你可以向傳感器吹入一些空氣。你應該聽到轉子旋轉的聲音,LCD上的數值應該會增加。

        流量/體積計量是一些工業甚至個別消費者過程中非常重要的一部分。它不僅可以監控消耗量,還可以監控儀表供應量,我相信智能水表和自動液體分配器等應用程序應該能讓您深入了解如何將這個看似基礎的項目轉變成一個令人驚嘆的超級有用的產品。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 電路 傳感器

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 区。| 阳江市| 筠连县| 德惠市| 张家川| 惠东县| 鹿泉市| 福鼎市| 外汇| 绥中县| 上思县| 伊通| 高雄县| 清苑县| 河津市| 平谷区| 教育| 玛多县| 阿拉尔市| 吉木乃县| 仁寿县| 肇庆市| 阿城市| 庆云县| 克什克腾旗| 北安市| 马龙县| 金溪县| 三江| 湖口县| 宁南县| 安图县| 东方市| 密云县| 南漳县| 上思县| 大英县| 张掖市| 太仆寺旗| 绵竹市| 西充县|