【雕爺學程式設計】Arduino動手做(88)---水流量感測器模組
37款感測器與執行器的提法,在網路上廣泛流傳,其實Arduino能夠相容的感測器模組肯定是不止這37種的。鑑於本人手頭積累了一些感測器和執行器模組,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這裡準備逐一動手嘗試系列實驗,不管成功(程式走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計)
實驗八十八: 1號霍爾水流量感測器咖啡機直飲機流量監控模組
水流感測器
是指通過對水流量的感應而輸出脈衝訊號或電流、電壓等訊號的水流量感應儀器,這種訊號的輸出和水流量成一定的線性比例,有相應的換算公式和比較曲線,因此可做水控方面的管理和流量計算,在熱力方面配合換能器可測量一段時間介質能量的流失,如熱能表。水流感測器主要和控制晶片、微控制器,甚至PLC配合使用。水流感測器具有流量控制準確,可以迴圈設定動作流量,水流顯示和流量累積計算的作用。
流量
是指單位時間內流經封閉管道或明渠有效截面的流體量,又稱瞬時流量。當流體量以體積表示時稱為體積流量;當流體量以質量表示時稱為質量流量。單位時間內流過某一段管道的流體的體積,稱為該橫截面的體積流量。簡稱為流量,用Q來表示。對在一定通道內流動的流體的流量進行測量統稱為流量計量。流量測量的流體是多樣化的,如測量物件有氣體、液體、混合流體;流體的溫度、壓力、流量均有較大的差異,要求的測量準確度也各不相同。因此,流量測量的任務就是根據測量目的,被測流體的種類、流動狀態、測量場所等測量條件,研究各種相應的測量方法,並保證流量量值的正確傳遞。例如河水流量,河流一秒流過某一個點的立方米數。一般來說越是在下游,流量越大,所以辨別地圖上的河流方向時,一般是從窄到寬。河水流量是指單位時間內,通過河流某一橫截(斷)面的水量,一般用立方米每秒錶示。流量也可以用一個月、一季、一年流出來的總水量表示。流量,從水力學角度講,應該是:單位時間內通過某一過水斷面的水體體積,其常用單位為每秒立方米,多用於河流、湖泊的斷面的進出水量測量,流量的測量方法,從水文站角度講,可分為浮標法、流速儀法、超聲波法等,流速儀法測量精度最高。
水流感測器基本原理1
水流量感測器是利用霍爾元件的霍爾效應來測量磁性物理量。在霍爾元件的正極串入負載電阻,同時通上5V的直流電壓並使電流方向與磁場方向正交。當水通過渦輪開關殼推動磁性轉子轉動時,產生不同磁極的旋轉磁場,切割磁感應線,產生高低脈衝電平。由於霍爾元件的輸出脈衝訊號頻率與磁性轉子的轉速成正比,轉子的轉速又與水流量成正比,根據水流量的大小啟動燃氣熱水器。其脈衝訊號頻率的經驗公式見式(1)。
f=8.1q-3(1)
式中:f—脈衝訊號頻率,H2
q—水流量,L/min
由水流量感測器的反饋訊號通過控制器判斷水流量的值。根據燃氣熱水器機型的不同,選擇最佳的啟動流量,可實現超低壓(0.02MPa以下)啟動。
水流感測器工作原理2
水流感測器主要由銅閥體、水流轉子元件、穩流元件和霍爾元件組成。它裝在熱水器的進水端用於測量進水流量。當水流過轉子元件時,磁性轉子轉動,並且轉速隨著流量成線性變化。霍爾元件輸出相應的脈衝訊號反饋給控制器,由控制器判斷水流量的大小,調節控制比例閥的電流,從而通過比例閥控制燃氣氣量,避免燃氣熱水器在使用過程中出現夏暖冬涼的現象。水流量感測器從根本上解決了壓差式水氣聯動閥啟動水壓高以及翻板式水閥易誤動作出現乾燒等缺點。它具有反映靈敏、壽命長、動作迅速、安全可靠、連線方便利啟動流量超低(1.5L/min)等優點,深受廣大使用者喜愛。
水流轉子元件主要由渦輪開關殼、磁性轉子、制動環組成。使用水流開關方式時,其效能優於機械式壓差盤結構,且尺寸明顯縮校當水流通過渦輪開關殼,推動磁性轉子旋轉,不同磁極靠近霍爾元件時霍爾元件導通,離開時霍爾元件斷開。由此,可測量出轉子轉速。根據實測的水流量、轉子轉速和輸出訊號(電壓)的曲線,便可確定出熱水器的啟動水壓,以及啟動水壓相對應的啟動水流量與轉子的啟動轉速。由控制電路,便可實現當轉子轉速大於啟動轉速時熱水器啟動工作;在轉速小於啟動轉速時,熱水器停止工作。這樣熱水器啟動水壓一般設定在0.01MPa,啟動水流量為3~5L/min(需滿足熱水器標準對最高溫升的限制)。另外,由於水在永磁材料磁場切割下,變成磁化水,水中的含氧量增加,使人洗浴後感覺清爽。制動環的作用是停水時,制止高速旋轉的磁性轉子轉動,終止脈衝訊號輸出。控制器接收不到脈衝訊號,立即控制燃氣比例閥關閥,切斷氣源,防止乾燒。
水流感測器的作用
1、通水通電,防乾燒,有開關訊號輸出的和脈衝訊號輸出的水流量感測器(賽盛爾);
2、線型比例輸出脈衝訊號,與流量成比例關係,從而實現加熱功率的調整,達到恆溫效果,大部分恆熱熱器和燃氣勢水器都採用這種方式,現在一些電勢水龍頭和洗手寶也有的用水流量感測器。
3、水流量感測器從根本上解決了壓差式水氣聯動閥啟動水壓高以及翻板式水閥易誤動作出現乾燒等缺點。它具有反映靈敏、壽命長、動作迅速、安全可靠、連線方便利啟動流量超低(1.5L/min)等優點,深受廣大使用者喜愛。
水流量感測器在運用中要注意的事項
1、當磁性資料或對感測器發生磁力的資料接近感測器時其特徵能夠有所改變。
2、為了防止顆粒、雜物進入感測器在感測器的入水口有必要裝置過濾網。
3、水流量感測器的裝置要避開有較強轟動和搖晃的環境防止影響感測器的丈量精度。
引出線方式:
1 紅IN接正極
2 黃OUT訊號輸出線
3 黑GND接負極
實驗開原始碼
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗八十八: 1號霍爾水流量感測器 直飲機流量監控模組 專案一:串列埠繪圖器顯示測量的波形 */ void setup() { Serial.begin(9600); } void loop() { Serial.println(analogRead(0)); delay(100); }
實驗串列埠繪圖器返回情況
【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計)
實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組
專案二:通過串列埠檢測是否有工作流量
實驗開原始碼
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組 專案二:通過串列埠檢測是否有工作流量 */ int readpin = A0; int incoming = 0; void setup (){ pinMode (readpin, INPUT) ; Serial.begin(9600); } void loop (){ incoming = analogRead(readpin) ; if (incoming > 500) { Serial.println("沒有檢測到"); } if (incoming < 500) { Serial.println("檢測到有流量"); } delay(1000); }
吹氣實驗,串列埠輸出截圖
【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計)
實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組
專案三:使用串列埠讀取水流速感測器的累計脈衝數
實驗接線:Uno D2接流量感測器OUT
實驗開原始碼
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組 專案三:使用串列埠讀取水流速感測器的累計脈衝數 實驗接線:Uno D2接流量感測器OUT */ #define PIN 2 volatile long count = 0;//變數count宣告為volatile型別 void setup() { pinMode(PIN, INPUT); attachInterrupt(0, blinkA, FALLING);//當引腳電平由高電平變為低電平時觸發中斷服務程式 Serial.begin(9600); } void loop() { Serial.print("累計脈衝="); Serial.println(count); delay(1000); } void blinkA() { count++; }
實驗串列埠輸出截圖
實驗場景圖
記錄脈衝的原理是,在轉盤上設定磁感應點,每次磁場穿過感測器時,輸出一個電平訊號:
採用外部中斷函式計數,當感測器被磁鐵觸發,程式中斷,執行計數函式,記錄一次。把每1000毫秒的圈數,再乘以30(雙磁鐵)即為實時的轉速。
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組 專案四:通過外部中斷簡易測量轉速(轉/分鐘) 實驗接線:Uno D2接流量感測器OUT */ const byte interruptPin = 2; const long taketime = 1000; // 每次測量的時間為1000毫秒 unsigned long time; //設定變數 time,計時 float Val = 0; //設定變數 Val,計數 void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(interruptPin), count, FALLING);//觸發訊號必須是變化的,上升或下降皆可 time = millis();//開始計時,time獲得當前系統時間 } void loop() { if (millis() >= time) { Serial.print("轉速= "); Serial.println(Val * 30); //轉換成rpm,單磁鐵觸發解析度為60rpm,2個磁鐵為30rpm time = millis() + taketime;//標記未來的時間點,1000ms後執行if判斷,輸出結果。另,降低重新整理頻率,可以提高解析度 Val = 0;//輸出速度結果後清零,記錄下一秒的觸發次數 } } void count() { Val += 1; }
實驗串列埠輸出
實驗輸出的實時轉速波形
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組 專案五:簡易測速 */ int rpmcount; //一秒鐘旋圈數 int rpm ;//速度(轉/分鐘) unsigned long sj;//執行時間 void setup (){ Serial.begin(9600); attachInterrupt(0, rpm_fun, CHANGE); rpmcount = 0; rpm = 0; sj = 0; } void loop() { if ((millis() - sj) >= 1000) { rpm = rpmcount * 3; rpmcount = rpmcount / 2; Serial.print("秒轉:"); Serial.print(rpmcount); Serial.println("圈"); Serial.print("轉速= "); Serial.print(rpm); Serial.println("轉/分鐘"); Serial.println(""); sj = millis(); rpmcount = 0; rpm = 0; } } void rpm_fun() { rpmcount++; }
串列埠輸出截圖
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗九十一: 1號霍爾水流量感測器 直飲機流量監控模組 專案六:累計脈衝大於等於50則點亮LED燈 實驗接線:Uno D2接流量感測器OUT,LED接D13 */ #define pin 2 #define led 13 volatile long count = 0;//變數count宣告為volatile型別 void setup() { pinMode(pin, INPUT); pinMode(led, OUTPUT); attachInterrupt(0, blinkA, FALLING);//當引腳電平由高電平變為低電平時觸發中斷服務程式 Serial.begin(9600); Serial.println("準備就緒OK"); Serial.println(""); } void loop() { Serial.print("累計脈衝="); Serial.println(count); delay(1000); if (count >= 50) { digitalWrite(led, HIGH); Serial.println("點亮LED燈"); } else digitalWrite(led, LOW); } void blinkA() { count++; }
實驗串列埠返回情況