Zapojenie snímača prietoku vody YF-S201 s Arduinom a LCD displejom

Zapojenie snímača prietoku vody YF-S201 s Arduinom a LCD displejom
Elektrolab Pridal  Elektrolab
  232 zobrazení
3
 5
Arduino a príbuzné platformy
   

Voda sa využíva v v každom prostredí, či už sa jedná o domáce, alebo komerčné prostredia. Aby bolo možné efektívne sledovať, koľko vody sa dodáva a spotrebuje a aby sa vodou zbytočne neplytvalo, musí sa merať jej prietok. Na predajných stránkach Aliexpress sa dá nájsť jednoduchý snímač prietoku s označením YF-S201, ktorý v spojení s platformou Arduino dokáže merať a vyhodnocovať prietok vody pomocou lacného prietokového snímača. Tento snímač prietoku sa umiestňuje do prívodu vody alebo do potrubia, aby sa meralo, koľko a ako rýchlo sa cez ne voda pohybuje. V tomto stručnom návode prepojíme snímač prietoku vody YF-S201 s Arduinom na meranie prietoku.

Princíp merania

Na meranie prietoku vody potrebujeme počítať výstupné impulzy snímača. Na detekciu impulzov môžeme použiť prerušovacie piny Arduina. Napríklad vždy, keď sa na výstupnom pine vyskytne impulz, výstupný signál prejde z aktívneho nízkeho do aktívneho vysokého stavu, čo je známe aj ako kladná alebo nábežná hrana impulzu, Tieto nábežné hrany môžeme počítať pomocou jedného z pinov prerušenia Arduina. Arduino poskytuje dva externé prerušovacie piny, ako sú digitálne I/O piny 2 a 3. Jeden z pinov prerušenia môžeme naprogramovať tak, aby sa vždy, keď nastane nárastová hrana, spustilo prerušenie. Preto môžeme vytvoriť premennú čítača, ktorá sa bude zvyšovať o jednotku vždy, keď sa spustí prerušenie. Môžeme spustiť časovač na jednu sekundu a počítať udalosti prerušenia počas jednej sekundy. Tým získame počet impulzov generovaných snímačom prietoku vody za jednu sekundu.

Vlastnosti YF-S201

  • Frekvencia (Hz) = (7,5 x Q), kde Q = L / Min ± 3%
  • Impulzov na liter: 450.
  • Životnosť: minimálne 300 000 cyklov.
  • Napájacie napätie : 5 až 24 V
  • Prevádzková teplota: ≤ 80ºC
  • Prevádzková teplota kvapaliny: ≤ 120ºC
  • Maximálny tlak vody: ≤ 1,75 MPa
  • Rozsah merania prietoku vody je 1-30 l/min
  • Každý impulz približne zodpovedá 2,25 ml

Kód na meranie objemu vody v litroch

V tomto kóde sme merali objem vody prechádzajúcej cez senzor. Ako bolo uvedené vyššie, približná rýchlosť priechodu vody na jeden impulz je 0,00225. Vynásobením tohto čísla počtom impulzov získame objem vody v litroch. Počítanie počtu impulzov sa uskutočnilo pomocou prerušenia. Nahrajte nasledujúci kód do vášho Arduina.

/*YF- S201 water Flow sensor code for Arduino */
const int Output_Pin = 2;

volatile int Pulse_Count;
unsigned int Liter_per_hour;
unsigned long Current_Time, Loop_Time;

void setup()
{
   pinMode(Output_Pin, INPUT);
   Serial.begin(9600);
   attachInterrupt(0, Detect_Rising_Edge, RISING);

   Current_Time = millis();
   Loop_Time = Current_Time;
}

void loop ()
{
   Current_Time = millis();
   if(Current_Time >= (Loop_Time + 1000))
   {
      Loop_Time = Current_Time;
      Liter_per_hour = (Pulse_Count * 60 / 7.5);
      Pulse_Count = 0;
      Serial.print(Liter_per_hour, DEC);
      Serial.println(" Liter/hour");
   }
}
void Detect_Rising_Edge ()
{
   Pulse_Count++;
}

Teraz skopírujte uvedený kód do prostredia Arduino IDE a nahrajte ho na dosku Arduino. Potom otvorte sériový monitor a nastavte prenosovú rýchlosť na 9600. Na sériovom monitore uvidíte namerané hodnoty, ako je znázornené nižšie:

Táto časť kódu pre Arduino je zrozumiteľná okrem časti výpočtu prietoku vody v tomto riadku:

Liter_per_hour = (Pulse_Count * 60 / 7.5)

Ako vieme, tak premenná pulse_count obsahuje počet impulzov za jednu sekundu, ktoré generuje výstupný pin snímača prietoku vody. Hodnotu Pulse_Count vynásobíme číslom 60, aby sme toto meranie prepočítali na jednu minútu. Pretože vieme, že v jednej minúte je 60 sekúnd. Otázkou však je, odkiaľ pochádza táto hodnota 7,5 a prečo sme Liter_per_hour vydelili touto hodnotou.

Podľa technického listu snímača prietoku vody YF-S201 možno frekvenciu výstupných impulzov vypočítať pomocou tejto rovnice:

Pulse frequency = 7.5 x flow rate

Uvedenú rovnicu možno zapísať aj takto:

flow rate = Pulse frequency / 7.5

Impulzná frekvencia je počet impulzov za jednu minútu. Z toho vyplýva:

Liter_per_hour (flow rate) = (Pulse_Count * 60 / 7.5)

 

Vysvetlenie princípu

Snímač na meranie prietoku vody YF-S201 je dodávaný s udávaným prietokom 1-30 litrov/min. Snímač sa umiestňuje do vodovodného potrubia a obsahuje snímač, ktorý meria, koľko kvapaliny ním prešlo. Je v ňom integrovaný magnetický snímač s Hallovým efektom, ktorý pri každej otáčke vydáva elektrický impulz.

Vysvetlenie princípu funkcie merania prietoku pomocou prietokového snímača YF-S201

Sériový monitor v softvéri Arduino zobrazuje nameraný prietok vody v litroch za hodinu ako výsledok spustenia uvedeného kódu pre snímač prietoku vody.

Senzor prietoku vody s Arduinom a LCD displejom

V tejto časti si ukážeme, ako zobraziť nameranú hodnotu prietoku vody na 16×2 LCD displeji. Teraz vytvorte spojenia s Arduinom, senzorom prietoku vody a LCD displejom 16×2 podľa tejto schémy.

 

16X2 LCD Arduino
D4 – D7 9, 10, 11, 12
E 7
RS 4
VEE POT (stredný vývod)
VSS Zem
VDD +5V
D+ +5V
D- Zem

 

Pripojenia so systémom Arduino a snímačom prietoku vody

Arduino Senzor prietoku vody
D2 Signal Output
5V VCC
Zem Zem

 

Kód

/*YF- S201 water Flow sensor code for Arduino */
#include
<LiquidCrystal.h>
LiquidCrystal lcd(4, 7, 9, 10, 11, 12);
const int Output_Pin = 2;

volatile int Pulse_Count;
unsigned int Liter_per_hour;
unsigned long Current_Time, Loop_Time;

void setup()
{
    pinMode(Output_Pin, INPUT);
    Serial.begin(9600);
    attachInterrupt(0, Detect_Rising_Edge, FALLING);

    Current_Time = millis();
    Loop_Time = Current_Time;
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Water Flow Meter");
    lcd.setCursor(0,1);
    lcd.print("ElektroLab");
}

void loop ()
{
    Current_Time = millis();
    if(Current_Time >= (Loop_Time + 1000))
    {
      Loop_Time = Current_Time;
      Liter_per_hour = (Pulse_Count * 60 / 7.5);
      if(Pulse_Count != 0){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print(Liter_per_hour);
      lcd.print(" L/M");
      Pulse_Count = 0;
      Serial.print(Liter_per_hour, DEC);
      Serial.println(" Liter/hour");
      }
    else {
      Serial.println(" flow rate = 0 ");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print( Liter_per_hour );
      lcd.print(" L/M");
    }
   }

}
void Detect_Rising_Edge ()
{
   Pulse_Count++;
}

Ako funguje kód

Zahrnutie hlavičkových súborov a deklarovanie premenných V prvej časti kódu pre Arduino a senzor prietoku vody zahrnieme hlavičkové súbory a vykonáme deklaráciu premenných. Prvou časťou kódu je zahrnutie hlavičkových súborov pre knižnicu tekutých kryštálov a deklarácia premenných na uloženie času a počtu výstupných impulzov snímača prietoku vody.

#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 7, 9, 10, 11, 12);
const int Output_Pin = 2;

volatile int Pulse_Count;
unsigned int Liter_per_hour;
unsigned long Current_Time, Loop_Time;

Výstupný napäťový signál snímača prietoku vody je pripojený k digitálnemu pinu D2, ktorý bude nakonfigurovaný na zachytávanie prerušenia so stúpajúcou hranou. Na druhej strane sú D4, D7, D9, D10, D11 a D12 pripojené k 16×2 LCD pinom.

Detect_Rising_Edge() ISR

Premenná Pulse_Count++ sa používa na uloženie počtu impulzov. Funkcia Detect_Rising_Edge() je funkcia prerušenia, ktorá sa používa na počítanie impulzov generovaných Hallovým senzorom. Keď sa na pine D2 zaznamená prerušenie, zavolá sa rutina Detect_Rising_Edge() a počet impulzov sa v premennej Pulse_Count zvýši o jednotku.

void Detect_Rising_Edge ()
{
   Pulse_Count++;
}
}

Nastavenie Inicializácia knižníc

Ako je zvykom pri Arduino skečoch, inicializáciu a konfiguračné nastavenia vykonáme vo vnútri funkcie setup. Najprv nastavíme piny D2 ako digitálne vstupné piny pomocou funkcie pinMode(). Potom pripojíme prerušenie 0 s digitálnym pinom D2 a tiež odovzdáme adresu funkcie spätného volania (Detect_Rising_Edge), ktorá sa vykoná vždy, keď nastane prerušenie v dôsledku nábežnej hrany na pine D2.

Funkcia attachinterrupt je zodpovedná za kontrolu impulzov. Hneď ako sa zistí impulz, attachinterrupt zavolá podprogram a spočíta impulzy v premennej flow_frequency. Premenné Current_Time a Loop_Timet sa používajú na sledovanie času a na zabezpečenie toho, aby sa kód vykonával každú sekundu, na výpočet objemu a prietoku.

pinMode(Output_Pin, INPUT);
   Serial.begin(9600);
   attachInterrupt(0, Detect_Rising_Edge, RISING);

   Current_Time = millis();
   Loop_Time = Current_Time;
   lcd.begin(16, 2);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Water Flow Meter");
   lcd.setCursor(0,1);
   lcd.print("ElektroLab");
}

Hlavná slučka

Void loop určí prietok počítaním frekvencií alebo impulzov každú sekundu. Podľa technického listu sa frekvencia vypočíta vynásobením prietoku číslom 7,5. Tento kód však meria impulzy alebo frekvencie, takže prietok môžeme zistiť vydelením frekvencie číslom 7,5. Prietok ďalej vydelíme, aby sme dostali odpoveď v litroch za sekundu. Prietok je uložený v obj. a bude sa zobrazovať na LCD displeji. Počítadlo impulzov, t. j. premenná flow_frequncy, sa vynuluje pre ďalšie merania a výpočty.

Current_Time = millis();
   if(Current_Time >= (Loop_Time + 1000))
  {
      Loop_Time = Current_Time;
      Liter_per_hour = (Pulse_Count * 60 / 7.5);
      if(Pulse_Count != 0){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print(Liter_per_hour);
      lcd.print(" L/M");
      Pulse_Count = 0;
      Serial.print(Liter_per_hour, DEC);
      Serial.println(" Liter/hour");
 }

Podmienka "Else"

Ak sa nezistí žiadny impulz, prerušenie sa nevyvolá a tok kódu prejde do cyklu else. V dôsledku toho sa na LCD displeji zobrazí nula, čo znamená, že v danom čase nebol zaznamenaný žiadny prietok vody.

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

Nahrajte kód na Arduino. Tento kód funguje aj bez použitia LCD displeja, ktorý slúži na vizaulizáciu prietoku. Všimnite si, že ak cez snímač vody neprúdi žiadna voda "Rate: 0 L/M a obj: 0,0 L" sa zobrazí na obrazovke, ako aj na sériovom monitore. Zabezpečte, aby cez snímač tieklo trochu vody. V dôsledku prietoku sa vytvorí  impulz. Tento impulz spustí funkciu prerušenia, ktorú mikrokontrolér použije na výpočet objemu a prietoku a zobrazí sa na sériovom monitore, ako aj na LCD displeji. Po vykonaní MCU vynuluje počítadlo a je pripravený na ďalšie výpočty.

Nákupný zoznam

Snímač prietoku vody YF-S201 - Klikni (Aliexpress)

Arduino Uno - klikni (Aliexpress)

Máte aj vy zaujímavú konštrukciu?

Máte aj vy zaujímavú konštrukciu a chceli by ste sa o ňu podeliť s viac ako 360.000 čitateľmi? Tak neváhajte a dajte nám vedieť, radi ju uverejníme a to vrátane obrazových a video príloh. Rovnako uvítame aj autorov teoretických článkov, či autorov zaujímavých videí z oblasti elektroniky / elektrotechniky.

Kontaktujte nás!


Páčil sa Vám článok? Pridajte k nemu hodnotenie, alebo podporte jeho autora.
 

       

Komentáre k článku

Karel Král pred 6 mesiacmi

Díky za článek, s Arduinem se seznamují, tak se hodí. Mám otázku: Není nějaký problém s přesností výpočtu sekundy v loop? Když se od dostane k podmínce za 1100 mSec, porad to počítáte jako 1 sec.
Druhá otázka, co se stane s impulzy z preruseni mezi vypoctem casu a vynulovanim počtu impulzu? Nemůže být v tech pár řádcích vzniknout race condition, kde se impulz ztrati?

Karel Král pred 6 mesiacmi

Děkuji za reakci.

Elektrolab pred 6 mesiacmi

Zdravím vás Karel a ďakujem za otázky.
1. Presnosť druhého výpočtu v slučke:V kóde sa výpočet vykonáva každú sekundu (počítané pomocou if (Current_Time >= (Loop_Time + 1000))). Ak máte obavy z presnosti tohto výpočtu, môžete ho vylepšiť tým, že budete sledovať čas v milisekundách namiesto sekúnd. Tým získate presnejšie údaje. Môžete zmeniť 1000 na 100, aby sa výpočet vykonával každých 100 ms, ale pamätajte, že to bude mať vplyv na spotrebu energie. Záleží na vašich požiadavkách na presnosť a efektivitu.

Elektrolab pred 6 mesiacmi

2. Impulzy z prerušenia:
Existuje určité riziko pretečenia v rámci prerušenia medzi výpočtom času a vynulovaním počtu impulzov. Ak je frekvencia impulzov vysoká a môže dôjsť k prerušeniu medzi týmito dvoma riadkami kódu, môže to viesť k chybám vo vašich meraniach. Ide o riziko z pretečenia pretože v Arduino môže prerušenie skočiť kedykoľvek, keď nastane udalosť na pin 2 (kde máte pripojený senzor). Ak sa stane viac impulzov počas spracovania týchto dvoch riadkov, môžete stratiť impulzy.Jedným z možných riešení je zakázať prerušenie počas výpočtu počtu impulzov. To zabezpečí, že sa nepreruší v čase, keď sa počet vynuluje. Tu je ako to urobiť:

Elektrolab pred 6 mesiacmi

void loop ()
{
noInterrupts(); // Zakáže prerušenie
Current_Time = millis();
if (Current_Time >= (Loop_Time + 1000))
{
Loop_Time = Current_Time;
Liter_per_hour = (Pulse_Count * 60 / 7.5);
if (Pulse_Count != 0) {
// Vaše ďalšie kódy pre výpis a resetovanie
}
else {
// Vaše ďalšie kódy pre prípad, keď je počet impulzov 0
}
}
interrupts(); // Znovu povolí prerušenie
}

Týmto spôsobom zakážete prerušenie počas spracovania výpočtu, čím minimalizujete riziko straty impulzov.

Pre komentovanie sa musíte prihlásiť.

Vaša reklama na tomto mieste

Vyhľadajte niečo na našom blogu

PCBWay Promo

ourpcb Promo

PCBWay Promo

ourpcb Promo

PCBWay Promo

ourpcb Promo


Webwiki Button