Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

OLED displeje

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Celeron



Založen: Apr 02, 2011
Příspěvky: 17663
Bydliště: Nový Bydžov

PříspěvekZaslal: pá únor 17 2023, 16:23    Předmět: OLED displeje Citovat

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. Smile

_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3280

PříspěvekZaslal: pá únor 17 2023, 16:49    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17663
Bydliště: Nový Bydžov

PříspěvekZaslal: pá únor 17 2023, 18:11    Předmět: Citovat

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 ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17663
Bydliště: Nový Bydžov

PříspěvekZaslal: pá únor 17 2023, 18:38    Předmět: Citovat

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. Very Happy
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
 

_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3280

PříspěvekZaslal: pá únor 17 2023, 18:41    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 33840
Bydliště: Bratislava

PříspěvekZaslal: pá únor 17 2023, 18:55    Předmět: Citovat

(s)printf vie predsa medzery na zaciatok pridavat automaticky, staci medzi "%" a "d" pridat cislo. Napr. "%5d".
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17663
Bydliště: Nový Bydžov

PříspěvekZaslal: pá únor 17 2023, 19:15    Předmět: Citovat

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 ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17663
Bydliště: Nový Bydžov

PříspěvekZaslal: pá únor 17 2023, 19:47    Předmět: Citovat

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á.



stovky.jpg
 Komentář:
 Velikost:  296.87 kB
 Zobrazeno:  50 krát

stovky.jpg



tisíce.jpg
 Komentář:
 Velikost:  294.6 kB
 Zobrazeno:  48 krát

tisíce.jpg



desetitisíce.jpg
 Komentář:
 Velikost:  282.03 kB
 Zobrazeno:  55 krát

desetitisíce.jpg



_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MiloPS3



Založen: Aug 07, 2010
Příspěvky: 262

PříspěvekZaslal: so únor 18 2023, 9:42    Předmět: Citovat

Celeron napsal(a):

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 Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17663
Bydliště: Nový Bydžov

PříspěvekZaslal: so únor 18 2023, 15:53    Předmět: Citovat

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 ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.19 sekund