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
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
Založen: Apr 02, 2011 Příspěvky: 18477 Bydliště: Nový Bydžov
Zaslal: pá únor 17 2023, 18:11 Předmět:
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
Založen: Apr 02, 2011 Příspěvky: 18477 Bydliště: Nový Bydžov
Zaslal: pá únor 17 2023, 18:38 Předmět:
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.
kód:
// 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
Založen: Apr 02, 2011 Příspěvky: 18477 Bydliště: Nový Bydžov
Zaslal: pá únor 17 2023, 19:47 Předmět:
rnbw napsal(a):
(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á.
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:
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
Založen: Apr 02, 2011 Příspěvky: 18477 Bydliště: Nový Bydžov
Zaslal: so únor 18 2023, 15:53 Předmět:
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
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.