Štvorkanálový voltmeter s analógovým zobrazením

Zápisník experimentátora

V tomto článku sa pokúsime vylepšiť návrh štvorkanálového voltmetra s výstupom na displeji Nokia 5110. Voltmeter bude schopný merať štyri kanály a výsledok bude zobrazovať na displeji v podobe analógového posuvníka. Rozsah merania bude 0 - 5 V.

Zapojenie sa nijako nelíši od predchádzajúceho, budeme vylepšovať iba program. Namiesto štyroch trojmiestnych čísel budeme zobrazovať iba dvojmiestne čísla, odstránime z displeja informácie, ktoré až tak nepotrebujeme a zameriame sa na vykreslenie meraného napätia pomocou analógovej stupnice. Takéto zobrazenie vám veľmi názorne zobrazí napätie, ktoré sa napríklad v čase dynamicky mení.

Č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

Pretože sa podstata merania nijako nemení, nebudem sa v tomto texte venovať všeobecnému popisu kódu. Ten si môžete prečítať v predchádzajúcom článku. Zameriam sa tu iba na vykresľovaciu funkciu, ktorá zobrazuje vodorovnú posuvnú lištu.

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

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

V predchádzajúcej verzii programu boli všetky štyri merané hodnoty roztiahnuté na celú šírku displeja. Pretože tam potrebujeme nejako dostať graf, všetky texty sú zredukované na minimálnu šírku. Displej má 84 bodov na šírku, čo nám dáva 34 bodov pre vykreslenie textu a zvyšných 50 bodov poslúži akurát na zobrazenie grafu napätia 0-5 V.

Graf sa skladá z dvoch častí. V hornej je vykreslená mierka. Každý celý volt je vykreslený ako dlhšia čiarka, medzi nimi je kratšia čiarka každých 0,2 V. O výpočet toho, kedy sa jedná o dlhšiu alebo kratšiu čiarku sa stará nenápadná podmienka (j%10==0 ? 18 : 17). Jazyk C++ umožňuje aj takto priamo v kóde príkazu niečo rozhodnúť. Kód znamená to, že ak je modulo 10 premennej j rovné 0, bude dlhšia čiarka. Cyklus ide od 0 do 50, čiže pri každej hodnote 0, 10, 20, 30, 40 alebo 50 bude podmienka splnená.

Druhá časť grafu je samotný ukazovateľ aktuálneho napätia. Kvôli lepšej čitateľnosti je kreslený ako čiara hrubá 3 body. Teoreticky mohol byť kód ukazovateľa urobený cez cyklus, vyzeralo by to krajšie.

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(8,8*i+16);
    dtostrf(data[i].value, 4, 2, buffer);
    display.print(buffer);

    // analog part
    const int START=32;
    for(int j=0;j<=50;j+=2) {
      display.drawLine(START+j,8*i+16,START+j,8*i+(j%10==0 ? 18 : 17),BLACK);
      }
    display.drawLine(START,8*i+20,START+data[i].value*10,8*i+20,BLACK);
    display.drawLine(START,8*i+21,START+data[i].value*10,8*i+21,BLACK);
    display.drawLine(START,8*i+22,START+data[i].value*10,8*i+22,BLACK);
  }
  display.display();
}

Zdrojový kód

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

Video

Vo videu je vidno ukážku merania napätia na pripojenom potenciometri.


18.07.2016


Menu