Arduino průtokoměr 1-30 l/min

Arduino průtokoměr je vstupní modul pro Arduino, který umožňuje uživateli monitorovat množství proudící kapaliny skrze měřící turbínu. Tento průtokoměr YF-S201 zvládá měřit průtok v rozsahu 1 až 30 litrů za minutu s poměrně dobrou přesností. Naměřené hodnoty mezi 0 až 1 litrem za minutu mohou být méně přesné díky návrhu turbíny, která je navržena právě na vyšší průtoky. Pracovní napětí průtokoměru je v rozsahu 5 až 18 V a maximální proudový odběr je 15 mA (při napětí 5V). Provozní teploty udávané výrobcem jsou pak -25 až +80°C. Pro připojení do oběhového systému je pak na obou přípojkách závit o velikosti ½“. Samotné měření průtoku probíhá detekováním pulzů na výstupním pinu průtokoměru, přičemž charakteristika pulzů je 450 pulzů na litr kapaliny.

Pro úspěšné propojení průtokoměru s Arduino deskou propojíme celkem 3 vodiče. Připojíme červený drát na +5V Arduina, žlutý drát na pin D2 a černý drát na zem. Výstupní pin (žlutý drát) můžeme zapojit i na jiný volný digitální pin s podporou přerušení, ale je nutné tuto volbu provést také na začátku programu. Seznam těchto pinů pro různé Arduino desky si můžete prohlédnout zde.

Ukázkový kód obsahuje na svém začátku nastavení čísla propojovacího pinu a pinu přerušení. Jako další vytvoříme kalibrační konstantu společně s pomocnými proměnnými, do kterých budeme ukládat data v průběhu programu. V podprogramu setup nastavíme komunikaci po sériové lince, směr vstupního pinu a nastavení přerušení. To je v tomto případě nastaveno na zmíněný přerušovací pin, pro aktivaci je nastaven podprogram prictiPulz a detekce je zvolena na sestupnou hranu. Nekonečná smyčka loop je nastavena tak, aby kromě vyhodnocení výsledků byla volná pro další příkazy. Pokud je v počáteční if podmínce detekován rozdíl uloženého a aktuálního času větší než 1 sekunda, tak provedeme všechny výpočty a vytiskneme výsledek. Jako první krok vypneme detekci přerušení, aby nám neovlivňovala naměřené výsledky. Dále vypočteme průtok z přesného rozdílu času, počtu naměřených pulzů a kalibračního faktoru. Poté tento výsledek přepočteme ještě na průtok kapaliny v mililitrech a přičteme aktuálně změřený průtok do proměnné udávající celkový objem. V dalším kroku vytiskneme všechny vypočtené údaje po sériové lince, vynulujeme počítadlo pulzů a uložíme aktuální čas pro další měření. V posledním kroku už jen znovu aktivujeme detekci přerušení a hlavní nekonečná smyčka se opakuje. Pod touto smyčkou se pak nachází ještě podprogram pro obsluhu přerušení, který obsahuje pouze inkrementaci čítače pulzů.

// Arduino průtokoměr YF-S201

// nastavení čísel propojovacích pinů
#define pinPrutokomer 2
#define pinPreruseni 0  // 0 = digitální pin 2
// kalibrační proměnná, u senzoru YF-S201
// je to 4,5 pulzu za vteřinu pro 1 litr za minutu
const float kalibrFaktor = 4.5;
// pomocné proměnné
volatile byte pocetPulzu = 0;
float prutok = 0.0;
unsigned int prutokML = 0;
unsigned long soucetML = 0;
unsigned long staryCas = 0;

void setup() {
  // komunikace po sériové lince rychlostí 9600 baud
  Serial.begin(9600);
  // nastavení směru vstupního pinu
  pinMode(pinPrutokomer, INPUT);
  // nastavení vstupního pinu pro využití přerušení,
  // při detekci přerušení pomocí sestupné hrany (FALLING)
  // bude zavolán podprogram prictiPulz
  attachInterrupt(pinPreruseni, prictiPulz, FALLING);
}
void loop() {
  // místo pro další příkazy
  
  // pokud je rozdíl posledního uloženého času a aktuálního
  // 1 vteřina nebo více, provedeme měření
  if ((millis() - staryCas) > 1000) {
    // vypnutí detekce přerušení po dobu výpočtu a tisku výsledku
    detachInterrupt(pinPreruseni);
    // výpočet průtoku podle počtu pulzů za daný čas
    // se započtením kalibrační konstanty
    prutok = ((1000.0 / (millis() - staryCas)) * pocetPulzu) / kalibrFaktor;
    // výpočet průtoku kapaliny v mililitrech
    prutokML = (prutok / 60) * 1000;
    // přičtení objemu do celkového součtu
    soucetML += prutokML;
    // vytištění všech dostupných informací po sériové lince
    Serial.print("Prutok: ");
    Serial.print(prutok);
    Serial.print(" l/min");
    Serial.print("  Aktualni prutok: ");
    Serial.print(prutokML);
    Serial.print(" ml/sek");
    Serial.print("  Soucet prutoku: ");
    Serial.print(soucetML);
    Serial.println(" ml");
    // nulování počítadla pulzů
    pocetPulzu = 0;
    // uložení aktuálního času pro zahájení dalšího měření
    staryCas = millis();
    // povolení detekce přerušení pro nové měření
    attachInterrupt(pinPreruseni, prictiPulz, FALLING);
  }
}
// podprogram pro obsluhu přerušení
void prictiPulz() {
  // inkrementace čítače pulzů
  pocetPulzu++;
}

Po nahrání ukázkového kódu do Arduino desky s připojeným průtokoměrem dostaneme například tento výsledek:

Prutok: 0.00 l/min  Aktualni prutok: 0 ml/sek  Soucet prutoku: 0 ml
Prutok: 3.77 l/min  Aktualni prutok: 62 ml/sek  Soucet prutoku: 62 ml
Prutok: 3.11 l/min  Aktualni prutok: 51 ml/sek  Soucet prutoku: 113 ml
Prutok: 0.00 l/min  Aktualni prutok: 0 ml/sek  Soucet prutoku: 113 ml

Arduino průtokoměr je zajímavý vstupní modul, s kterým můžeme obohatit Arduino o měřič průtoku kapaliny. Může nalézt uplatnění v různých projektech, jako například měřič spotřeby vody v domácnosti u jednotlivých spotřebičů, měřič objemu pro dávkovač vody a další. Vzhledem ke konstrukci je samozřejmě možné využít tento průtokoměr na měření průtoku jak kapalin, tak i plynů. Jen je nutné počítat s omezeným měřícím rozsahem, který je maximálně 30 litrů za minutu a u hodnot do 1 litru za minutu můžeme dostávat zkreslené výsledky.

 

Seznam použitých komponent:

https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

https://dratek.cz/arduino/831-arduino-prutokomer-1-30l-min-1500635984.html

Další podobné články