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.

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

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.

Schéma zapojení Arduino průtokoměru 1-30 l/min

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

FB tw

Další podobné články