Měření a zobrazení na displayi

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Měření a zobrazení na displayi

Příspěvek od unyhhox » 19 bře 2018, 11:27

Dobrý den,

pracuji na školním projektu, jehož cílem je vytvoření mobilní fotovoltaické elektrárny. Součástí má být i display, který bude zobrazovat všechny relevantní hodnoty. Zvolil jsem LCD display 128x64, konkrétně tento https://www.aliexpress.com/item/128-64- ... 0.0.LSoV46. Jelikož jsem naprostý začátečník ve světě arduina, tak jsem se X hodin brodil kódama na internetu, abych uvedl do provozu alespon měření jednotlivých článků baterie. Můj problém je takový, že se mi špatně zobrazují čísla při obnově. Některé pixely, jako kdyby se sekly, nezkaktualizovaly se, takže když je dejme tomu 3,21 a pak to skočí na 3,20 tak na druhém desetinném místě je paskvil, který je slátaninou 1 a 0. Při další obnově se to opraví a nebo taky ne. Dělá to poměrně často u všech čísel. Mám podezření, že jsem možná použil špatný kód pro vypsání analogovych hodnot ze sensoru na display. Níže příkládám svůj kód.

Kód: Vybrat vše

#include "U8glib.h"

// nastavení propojovacích pinů
#define EN 13
#define RW 12
#define RS 11

// inicializace OLED displeje z knihovny U8glib
U8GLIB_ST7920_128X64_1X lcd(EN, RW, RS);

void setup(void) {
  // nastavení bílé barvy pro výpis
if ( lcd.getMode() == U8G_MODE_R3G3B2 ) {
lcd.setColorIndex(255);
  }
  // nastavení maximální intenzity svitu
elseif ( lcd.getMode() == U8G_MODE_GRAY2BIT ) {
lcd.setColorIndex(3);
  }
  // nastavení viditelnosti pixelů
elseif ( lcd.getMode() == U8G_MODE_BW ) {
lcd.setColorIndex(1);
  }
  // pro otočení displeje o 180 stupňů
  // stačí odkomentovat řádek níže
  // lcd.setRot180();
}

void loop(void) {
// pictureloop
lcd.firstPage();
do {
draw();
} while( lcd.nextPage() );

// rebuildthepictureaftersomedelay
delay(5000);
}
void draw(void) {
  // graphiccommands to redrawthecompletescreenshouldbeplacedhere
int sensorValue1 = analogRead(A0);
float voltage1 = sensorValue1 *0.9787234042553191*(5.0 / 1023.0);
int sensorValue2 = analogRead(A1);
float voltage2 = sensorValue2 *0.7614457831325301*(5.0 / 1023.0);
int sensorValue3 = analogRead(A2);
float voltage3 = sensorValue3 *0.7994987468671679*(5.0 / 1023.0);
int sensorValue4 = analogRead(A3);
float voltage4 = sensorValue4 *0.7705314009661836*(5.0 / 1023.0);
floattotal = voltage1+voltage2+voltage3+voltage4;
lcd.setFont(u8g_font_5x7);
lcd.setPrintPos(42, 10); 
lcd.print(voltage1);
lcd.setPrintPos(70, 10);
lcd.print("V");
lcd.setPrintPos(0, 10);
lcd.print("Cell(1)=");

lcd.setPrintPos(42, 20); 
lcd.print(voltage2);
lcd.setPrintPos(70, 20);
lcd.print("V");
lcd.setPrintPos(0, 20);
lcd.print("Cell(2)=");

lcd.setPrintPos(42, 30); 
lcd.print(voltage3);
lcd.setPrintPos(70, 30);
lcd.print("V");
lcd.setPrintPos(0, 30);
lcd.print("Cell(3)=");

lcd.setPrintPos(42, 40); 
lcd.print(voltage4);
lcd.setPrintPos(70, 40);
lcd.print("V");
lcd.setPrintPos(0, 40);
lcd.print("Cell(4)=");

lcd.setPrintPos(42, 50); 
lcd.print(total);
lcd.setPrintPos(70, 50);
lcd.print("V");
lcd.setPrintPos(0, 50);
lcd.print("Battery=");
  }
Dále bych ocenil rady, příklady kódů, jak vytvořit menu, či jen přepínání obrazovek na displayi 128x64, který by byl ovládán 1x4 tlačítkovým boardem (viz. https://www.aliexpress.com/item/1x4-4-K ... 0.0.LSoV46). Uvědomil jsem si, že jsem vybral display, ke kterému toho na internetu není moc (nebo neumím hledat). Chci mít několik obrazovek, kde na prvni bude úvodní obrázek schématu a ke každé části bude hodnota výkonu, který je dodáván, nebo odebírán, na druhé obrazovce hodnoty baterie, na třetí regulátoru atp. Jsem ztracen, please help! :D

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od ohruska » 19 bře 2018, 12:12

Zdravím.
To bude asi tím, že je to grafický display a jednotlivé fonty nezabírají stejnou šířku.
Stejné to bude pokud budeš zobrazovat i záporné hodnoty.
Je třeba přepsat staré pole prázdným obdélníkem, aby se stará hodnota stala neviditelnou a potom teprve vepsat novou hodnotu.
Ota

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od unyhhox » 19 bře 2018, 12:40

Asi chápu, co máš na mysli. Jak toho dosáhnout? nějaký kód, který by při každém loopu vymazal data pixelů X * Y , aby další opakování se zapisovalo do čistých pixelů? laicky řečeno ..

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od ohruska » 19 bře 2018, 12:47

Jo.
Někdy by mělo stačit zapsat prázdný řetězec. Třeba lcd.print(" "); Ale je třeba vyzkoušet kolik prázdných znaků zadat. Ale toto nemusí vždy fungovat.

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od unyhhox » 19 bře 2018, 12:53

Dobře, díky. Hned, jak budu mít možnost, tak to vyzkouším. A co se týče mého druhého dotazu týkajícího se menu a tlačítek .. to by jsi mi dokázal poradit, nebo mě někam odkázat? Hádám, že pro každý display (16x2,20x4,128x64) se menu tvoří jinak ne? nebo můžu z menu vytvořeném na např 4x20 vycházet při vytváření na 128x64? Vidím jeden zásadní problém, a to je ten, že každý ten display ma svou knihovnu a při vytváření kódů se na tu knihovnu odkazují, takže nevím, jak přebrat menu z 4x20 na 128x64 :/

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od ohruska » 19 bře 2018, 13:09

Ono to menu není tak jednoduché.
Spíš je třeba si udělat obrazovky a co na nich chceš zobrazovat.
Já třeba pro více hodnot zobrazuji periodicky data na dvou až třech obrazovkách a pro informaci mi to stačí.
Pokud budeš chtít použít tlačítka, tak by bylo rozumné na 1 ukázat menu 1,2,3 a tlačítky 1 až 3 zvolit obrazovku 1,2 nebo 3.

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od unyhhox » 19 bře 2018, 13:16

Periodicky zobrazující se mi nehodí. Potřebuji zobrazení stavu baterii, co tece z a do regulátoru a pak stav výstupů. Tzn stačily by 3 obrazovky na tyto věci a jedna obrazovka uvodní s tím prehledovym schematem. Mám 4 tlačítka, takže by se to dalo ovládat 1-obrazovka 1 atd, ale nemám nejmenší tušení, jak toho dosáhnout.

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od ohruska » 19 bře 2018, 13:28

Asi nejjednodušší je použít

Kód: Vybrat vše

switch (var) {
  case label1:
    // statements
    break;
  case label2:
    // statements
    break;
  default:
    // statements
}
Zmáčknutím tlačítka změníš proměnnou var na 1,2, atd.

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od unyhhox » 19 bře 2018, 13:35

tenhle kód už jsem někde viděl no. Jak ale arduino pozná, o jaké tlačítko se jedná? Viděl jsem případy, kdy lidi přiřazují tlačítkům nějaké hodnoty, jako kdyby to byla hodntoa signálu.. něco ve smyslu, pokud <760, tak to bude talčítko 1. Netuším, kde ta čísla brali.

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Měření a zobrazení na displayi

Příspěvek od ohruska » 19 bře 2018, 13:44

Úplně stačí přiřadit proměnné hodnotu 1,2,3 atd.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti