Štvorkanálový voltmeter s digitálnym zobrazením

Zápisník experimentátora

V tomto článku sa pokúsime navrhnúť štvorkanálový voltmeter s výstupom na displeji Nokia 5110. Voltmeter bude schopný merať štyri kanály a výsledok bude zobrazovať na displeji. Rozsah merania bude 0 - 5 V.

Takýto voltmeter môžeme používať pri experimentoch s Arduinom a častokrát je jeho použitie pohodlnejšie, než používanie klasického multimetra. Použitie sa ale musí riadiť určitými pravidlami. Nemôžete merať na miestach, kde je zdroj napätia s viac ako 10k odporom. Pri takomto odpore by sa totiž pridlho nabíjal interný kondenzátor, ktorý slúži na analógové meranie.

Toto je rozdiel voči bežnému multimetru, ktorý má vstupný odpor v megaohmoch a preto nepotrebuje na meranie silný zdroj prúdu. Ale vo väčšine prípadov vám toto meranie môže stačiť. A pretože naraz odmeriame štyri kanály, vyhneme sa pri jeho používaní neustálemu presúvaniu meracích sond z miesta na miesto.

Čo budeme potrebovať

V nasledovnom zozname nájdete všetky použité súčiastky (odkazy sú na Banggood):

Schéma

Na schéme si môžete pozrieť zapojenie jednotlivých súčiastok. Meria sa na pinoch A0-4, kde som do schémy zakreslil aj konektor P1.

Programovanie

Popis zaujímavých miest v programe. V kóde je vidno použitie štruktúr, priemerovanie analógového merania a jednoduchosť vykresľovania výsledkov vďaka dátam, ktoré sú uložené v štruktúre.

struct VoltmeterData {
  const int channel;
  const char name[3];
  double value;
};

VoltmeterData data[4]={
  {A0,"A0",0.},
  {A1,"A1",0.},
  {A2,"A2",0.},
  {A3,"A3",0.},
};

Štruktúra VoltmeterData slúži na uloženie jedného meraného analógového kanála. Máme tam uložené číslo kanála, text, ktorý nám poslúži na vypisovanie informácie, čo za kanál je práve zobrazený a samotnú nameranú hodnotu napätia. Pretože budeme merať štyri kanály, máme definované pole štruktúr so štyrmi prvkami. Takýmto zápisom v c++ môžeme nastaviť implicitné hodnoty jednotlivých premenných. Hodnotu merania nastavujeme na 0 a tá bude prepísaná pri najbližšom meraní na aktuálne nameranú.

void loop() {
  measure(samples);
  drawVoltmeter();
  delay(200);
}

Meriame 5x za sekundu a aby bolo meranie hladšie, priemerujeme niekoľko nameraných vzoriek pre kanál. Konkrétne v tomto programe sa používa 8 vzoriek.

void measure(const int smp) {
  long d;
  for(int i=0;i<4;i++) {
    d=0;
    for(int x=0;x<smp;x++)
      d+=analogRead(data[i].channel);
    data[i].value= d * vref / 1023.0 / smp;
  }  
}

Samotné meranie s priemerovaním je vo funkcii measure. Priemerovanie sa robí tak, že najprv si do pomocnej premennej spočítame hodnoty všetkých vzoriek a následne ich vydelíme počtom vzoriek. Funkcia analogRead nedodáva priamo napätie, preto je vo funkcii aj prevod z 10 bitového merania na napätie.

void drawVoltmeter() {
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("Voltmeter");
  display.setCursor(0,8);
  display.print("Range: 0-5 V");
  for(int i=0;i<4;i++) {
    display.setCursor(0,8*i+16);
    display.print(data[i].name);

    display.setCursor(30,8*i+16);
    dtostrf(data[i].value, 4, 3, buffer);
    display.print(buffer);
    display.print(" V");
  }
  display.display();
}

Kreslenie nie je nič zložité. Pozrite si priložený obrázok a tu vidíte zdrojový kód, ktorý ho vytvára. Za zmienku stojí funkcia dtostrf, čo je funkcia, ktorá prevedie reálne číslo do podoby reťazca, ktorý môžeme zobraziť na displeji.

Nezapojené vstupy

Ak niektorý z kanálov nepripojíme, ale ostane ako keby plávať vo vzduchu, budeme vidieť aj tak nejaké namerané hodnoty. To preto, lebo Arduino a jeho mikrokontrolér využívajú na analógové meranie interný kondenzátor, ktorý si pred meraním nabijú. Ak je ale vstup nepripojený, stále ostáva v kondenzátore predchádzajúca meraná hodnota, lebo nezapojený vstup nemôže prepraviť nahromadenú energiu ani von, ani dnu.

Zdrojový kód

Zdrojový kód programu nájdete na webe GitHub.

Video

Vo videu je vidno ukážku merania pripojeného potenciometra.


12.07.2016


Menu