Nahodne pixely na OLED

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Nahodne pixely na OLED

Příspěvek od milhauszn » 19 pro 2019, 20:11

Ahoj,
mam Nano s Oled dips. 2 cidla dallas pro mereni rozdilovych teplot.
Pri postupnem pridavani kodu se od verze, kdy pouzivam milis a rozhodnuti zda hlavni ci vedlejsi screen zacly objevovat nahodne pixely vpravo dole na disp, kazde 2 vteriny trochu jinak.
Netusi nekdo proc? Je to ovlivnenim milis a I2C nejak?
Dnes jsem pridal do casti zapisu do grafu tone, pro kratke pipnuti pri zapisu hodnoty, a nahodne pixly se rozsirily az pres pismeno C.
Jelikoz se teprve ucim s Arduinem a programovanim v nem, tak kod neni moc hezky a vim ze i mistem plytvam.
Kod je zde:
https://github.com/milhauszn/Rozdilovy- ... isp_v5.ino

Diky za pripadnou radu, ono to funguje, a bude to stacit, jen me to stve ze nevim proc to tak je.Obrázek

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 19 pro 2019, 20:33

Bez přiloženého kódu je to těžké. S největší pravděpodobností se tam vkládá nějaká nedefinovaná hodnota (neinicializovaná proměnná nebo čtení za hranicí pole).

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od AstroMiK » 19 pro 2019, 20:47

Kód tam je přiložený (v odkazu).

Já bych v první řadě zkusil, jestli tam ty náhodné tečky nepíšeš nechtěně sám pomocí příkazů drawPixel a drawLine.
Mě se třeba často stává, že mi nějaká proměnná v těch výpočtech přeleze přes rozsah, nebo podteče pod nulu a pak se programy chovají podobně.

Takže bych v prvním pokusu zkusil postupně zakomentovávat následující 4 řádky.
Jestli se po zakomentování jedné z nich přestanou pixely objevovat, tak je problém v té matematice.

Kód: Vybrat vše

display.drawPixel(127-i, 32-graf[i]/10, SSD1306_WHITE);
display.drawLine(127-3*i, 43-graf[i]/5 , 127-3*(i+1), 43-graf[i+1]/5, SSD1306_WHITE);
display.drawPixel(8+3*(pos-1), 21, SSD1306_WHITE); //kurzor
display.drawLine(7+3*(pos-1), 20, 9+3*(pos-1), 20, SSD1306_WHITE);

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 19 pro 2019, 21:19

Diky za komentare.
Kod tam opravdu je, bez nej nema smysl posilat dotaz.
Zkusim zakomentovat a.premyslet, nicmene v predchozi verzi jen s hlavni obrazovkou ve smycce to nedelalo, a to jsem tam omylem dostkrat byl za hranici obrazovky (pocitani od nuly do 127 :-) ).
Vzniklo to az pri tom pouziti milis a prekvapilo ze po pridani tone se to zvetsilo.
Kod predchozi verze:
https://github.com/milhauszn/Rozdilovy- ... isp_v2.ino

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 21 pro 2019, 09:10

Omlouvám se, nějak mi nedošlo, že ten odkaz je na Tvůj kód a ne na nějaký vzorový příklad :oops:

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 21 pro 2019, 21:46

Kód: Vybrat vše

 	void vedlobr() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("1:");
  display.print(temp1);
  display.print(" R");
  display.print(round(rozdil*10.0)/10.0,1);
  display.print(" 2:");
  display.print(temp2);
  display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
  display.setCursor(0, 12);
  display.print("c: ");
  display.print(cas_rozdilu[41-pos]/60.0,1);
  display.print(" roz: ");
  display.print(graf[41-pos]/20.0);
Podívej se na poslední a předpředposlední řádek. Poslední možný prvek polí cas_rozdilu[] a graf[] je 40 (deklarováno 41prvků, tj 0..40), ale proměnná pos může mít hodnotu 0. Pak zobrazuješ něco, co je za hranicí pole. Co to je, záleží na tom, jak se kód zrovna přeloží a co je v paměti za tím polem. Když hodnotu upravíš na [40-pos] tak by to mělo už být OK.

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 22 pro 2019, 09:06

Diky za odpoved.
Toho jsem se bal hned pri tvorbe vedlejsi obrazovky, ale pri kompilovani to upozorneni nepise, 0 se ve vedlobr nikdy neobjevi, jelikoz ji volam jen kdyz je pos vic jak 0. Vedlobr je zobrazeni bez chyb, na hlavniobr to stale hazi pixely nahode a pri pouziti tone jich je vic.
Pri psani vedlobr jsem zkusil aj zvetsit pole o jedno, projistotu, ale vse fungovalo stejne, a ted jsem zkusil tyto radky hodit do komentare a nahrat. Pixely nahodne zustaly stale.
Jestli se k tomu dostanu ba delsi cas dnes, zkusit to zkompilovat bez pouziti millis. Ponevadz pri napsani kodu s timto hlidabim casu, to zaclo delat. Aspon si to myslim co si pamatuji.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 22 pro 2019, 13:03

Potenciální problém může být tohle

Kód: Vybrat vše

  if (cas_akt >= cas_predch + 10000) {
    cas_predch = cas_akt;
    cas_rozdilu[40] = cas_akt/1000;
    graf[40] =20* rozdil;
    for (int i =0; i<=39; i=i+1){
      cas_rozdilu[i]=cas_rozdilu[i+1];
      graf[i]=graf[i+1];
      }
    }
V přiřazení graf[40] =20* rozdil; máš vlevo typ int a rozdíl je typu float. Asi ti to při kompilaci dává warning, pokud je máš zapnuté. Nevím, jestli je to na 100% ta chyba, ale zkus si nechat do konzole vypisovat hodnoty pole graf, jestli tam nemáš nějaké hausnumera.

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 22 pro 2019, 20:48

Diky,
pixely se nahodne meni kazde 2 vteriny, hned od prvniho spusteni, jeste pred prvnim pruchodem cyklu.
Ted jsem zkousel ruzne komentovat a spoustet jen kousky, a ano, v tomto bloku to muze delat.
Pokud narazis na integer pole a float hodnotu, tak problem je v tom, v ze se mi nepodarilo udelat pole float hodnot, proste se boot zasekne a arduino nereaguje, nekde jsem videl napsane ze muze byt jakehokolov datatype. Nicmene i pri pouziti (int) tyto nahodne generovane pixely pokracuji.
Je pravda ze funkce tone je umistnena v teto casti kodu a ta rozsirila mnozstvi pixelu. Jen fakt nevim co v te casti dela problem, nebo je to cela cast?
Nevim proc by mel byt problem. Muzu to klidne napsat do dvou podminek v jednom if, kde pri splneni 2 i 10 sec to udela toto. Ale pak by me.zajimalo proc je toto reseni problem?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 22 pro 2019, 22:04

Teď nevim, o jaké funkci tone mluvíš. V tom prvním odkazu není v programu nikde použitá.
Pokud se to děje jen ve funkci hlavniobr()

Kód: Vybrat vše

void hlavniobr() {
  display.setTextSize(2);
  display.clearDisplay(); 
  for (int i = 0; i <=39; i= i+1){                              //kresleni grafu maleho a zobrazeni teplot
    display.drawPixel(127-i, 32-graf[i]/10, SSD1306_WHITE);
může být asi jedinou příčinou ten poslední řádek display.drawPixel(127-i, 32-graf/10, SSD1306_WHITE);
Zkus ho zakomentovat, nebude se vykreslovat graf a sleduj jestli pixely zmizi. Pokud ano, máš nějaký junk v poli graf[]. Pokud tam budou i nadále, tak fakt nevím.

Odpovědět

Kdo je online

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