OLED displeje

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

OLED displeje

#1 Příspěvek od Celeron »

Bastlím tady modelářskej otáčkoměr na benzínovej dvoutakt, kterej bude v palubovce většího letadla. Jako podružnou funkci bude měřit napětí baterie zapalování. Je to na displeji OLED I₂C 0,91" s řadičem SSD1306 128 x 32 pixlů. Zatím to tlačí Arduino, až to bude hotový, tak minimální konfigurace ATmega 328 SMD.
Mám to ubaslený, maká jak má, ale na displeji je nepatrná estetická "vada".
Vadí mi, že u otáček, který se pohybují od cca 300/min do cca 11000/min se přes výpis knihovny U8GLIB nastavuje pozice pixelu a od něho je výpis čísla doprava, takže při malých otáčkých je za číslem velká mezera před vypsaným textem RPM.
Potřeboval bych, aby byly řády otáček stále na stejným místě. Koukal jsem do knihovny U8GLIB jestli neumí výpis doleva od nastavenýho pixelu a asi nic.
Nenapadá Vás někoho, co s tím dělat? Převádět číslo na pětiznakovej retězec a rotovat ho dokud bude na pátý pozici mezerník? Není na to ve Wiringu už nějakej hotovej příkaz?
Díky všem praktickým programistům. :)
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#2 Příspěvek od Cowley »

Pokud bude číslo menší jak 1000, posuň počátek tisku hodnoty otáček o plus 2x (v poměru k pixelům zvolené šířky písma )
Pokud bude menší jak 10000, posuň počátek tisku hodnoty otáček o +1x

Pokud je číslice široká např. 8px přidej při <1000 +17px
A při <10000 +9px

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#3 Příspěvek od Celeron »

To by asi taky u dvou řádů šlo, možná jednodušejc, než s tím řetězcem. Díky.
Akorát mi přijde dost blbý řešit to samý třeba u zobrazení čísel 0-9999999.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#4 Příspěvek od Celeron »

Tak jsem to zmatlal přes string. Nejdříve převod float otáček (RPM_1) na string, což není úplně jednoduchý. Pak se zjistí kolik má string platných znaků (strlen(cislo)), odečte se od maximálního počtu zobrazených řádů. No a nakonec se to vynásobí počtem pixlů jak je širokej jeden znak a od toho místa se zapíše na OLED displej. Je to univerzální na řádů kolik chci.
Nojo, já se snad dokonce skrz ten Wiring na starý kolena prokoušu. :D

Kód: Vybrat vše

 // převod float otáček na string "cislo" bez desetin
 // klasická funkce sprintf vracela chybně znak ? (otazník)
 //(opsáno z http://yaab-arduino.blogspot.com/2015/12/how-to-sprintf-float-with-arduino.html)
  sprintf(cislo,"%d", (int)RPM_1, (int)(RPM_1*100)%100);

  pozice = radu - strlen(cislo); //počet řádů otáček (5) - počet znaků ve stringu
  ...
  ...
 Oled.setPrintPos((pozice * sirka),14);   // šířka znaku je 9 pixelů
  // výpis textu na zadanou souřadnici
  Oled.print(cislo);              // otáčky
 
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#5 Příspěvek od Cowley »

Ještě je v knihovně funkce size_t.

Přes ní lze zjistit jak bude tisk široký a dá se pro něj zvolit odpočet o .px vlevo.

Používá se, když chceš mít něco (co nevíš jak bude dlouhé) vykreslené na střed.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#6 Příspěvek od rnbw »

(s)printf vie predsa medzery na zaciatok pridavat automaticky, staci medzi "%" a "d" pridat cislo. Napr. "%5d".

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#7 Příspěvek od Celeron »

To mě nechodí. V manuálu je popis:
Syntax - size_t var = val;
Parametry - var: název proměnné, val: hodnota, která se má přiřadit této proměnné.

Když dám místo "var" název mýho stringu, tak "val" mi dává stále hodnotu 495.
Když to zadám opačně, tak to nejde zkompilovat.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#8 Příspěvek od Celeron »

rnbw píše:(s)printf vie predsa medzery na zaciatok pridavat automaticky, staci medzi "%" a "d" pridat cislo. Napr. "%5d".
Jo, máš pravdu. Chodí to dobře pokud pošlu výpis na sériovej monitor v IDE prostředí. Ale na OLED displeji to nejde jak má, každý snížení řádu otáček posune číslo o cca 1/5 znaku doleva. Ta knihovna U8GLIB nějak divně zpracovává doplněný mezery před číslem. Vypadá to, že znak mezery nemá jako klasický znaky oddělovací svislý sloupec pixlů a to dělá ten posun doleva.
No nic, to co jsem zmatlal původně chodí jak má.
Přílohy
desetitisíce.jpg
tisíce.jpg
stovky.jpg
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#9 Příspěvek od MiloPS3 »

Celeron píše: Když dám místo "var" název mýho stringu, tak "val" mi dává stále hodnotu 495.
protoze nejspis funkce print prevede promenou na string a pak to vytiskne,tiskne pouze promenou ne string, 495 je prave prvni pozice pameti kde zacina ten string,to bys musel udelat nejak takle

Kód: Vybrat vše

delka = strlen(string);
for(i=0;i<delka;i++) // nebo for(i=0;!(string[i]==0);i++) a nemusis zjistovat delku stringu 
{Oled.print(string[i]);}
pak si muzes overit co to vsechno tiskne a vyradit popripade mezery ...
koukni do ty knihovny jestli tam neni funkce treba drawStr nebo neco podobnyho...
mam pocit ze sem s tim taky bojoval a napsal sem si radsi svoji knihovnu

PS: vsim sem si ze nektery zarizeni taky zarovnavaj text/promeny z leva,konkretne PS5,pri zobrazovani velikosti stahovaneho souboru hodnota poskakuje nakonci, a navic znak treba 1 je opticky uzsi nez 0 ale oni udelaj fond pro jednicku treba 3x8 a pro nulu 5x8, takze je pak rozdil v delce v pixelech :roll:

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#10 Příspěvek od Celeron »

Dík za vysvětlení. V tý knihovně obsažený znakový sady jsou opravdu různý šířky, tedy počtu pixelů. Nakonec je to naprosto zřejmý z toho výpisu napětí na druhým řádku. Desetiná teřka v čísle je výrazně užší než číslice kolem.
A třeba i písmena R a V jsou taky různý šířky a do písmena M se vejdou dokonce dva malý znaky lt na spodním řádku. Takže i číslice mají asi různou šířku.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“