www.elektronik.si
Pohitritev kode in LCD zaslon
Pojdi na stran 1, 2  Naslednja  :||:
www.elektronik.si -> Arduino sekcija

Avtor: borzonKraj: Postojna PrispevekObjavljeno: Ned Avg 23, 2020 7:19 pm    Naslov sporočila:  Pohitritev kode in LCD zaslon
----------------------------------------------------------------------------
Pozdravljeni

Imam neko kodo v kateri se na koncu kode nahaja izpis podatkov na LCD zaslon, kjer je v " void loop(void) " nahaja tudi ukaz delay(3000), zaradi česar se celotno delovanje programa bistveno upočasni.
Zanima me ali obstaja kaka opcija, da bi lahko pohitril delovanje celotnega programa.
Na spletu sem nekaj prebiral, da bi se dalo to nekako pohitriti tako, da daš izpis na LCD zaslon v neko funkcijo ki tece neodvisno od glavne void funkcije ...

hvala za pomoč


Koda:

  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print("Ime 1= "); lcd.print(sensor_1, 0);
  lcd.setCursor (0, 1);
  lcd.print("Ime 2= "); lcd.print(sensor_2, 0);
  lcd.setCursor (0, 2);
  lcd.print("Ime 3= "); lcd.print(sensor_3, 0)
 
  delay (2000);
  lcd.clear();

  lcd.setCursor (0, 0);
  lcd.print("Ime 4= "); lcd.print(sensor_4, 0);
  lcd.setCursor (0, 1);
  lcd.print("Ime 5= "); lcd.print(sensor_5, 0);
  lcd.setCursor (0, 2);
  lcd.print("Ime 6= "); lcd.print(sensor_6, 0)
 
  delay (2000);
  lcd.clear();

Avtor: Peter123Kraj: Lj. PrispevekObjavljeno: Ned Avg 23, 2020 8:02 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Lahko probaš skrajšat čas med prikazovanjem?

Avtor: borzonKraj: Postojna PrispevekObjavljeno: Ned Avg 23, 2020 8:55 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdravljen Peter,

To na žalost ne pride v poštev, saj v nasprotnem uporabnik ne bi mogel brati iz LCD zaslona, ker bi se podatki prehitro spreminjali.

Pozna kdo kako drugo opcijo?

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Ned Avg 23, 2020 9:00 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Iz priložene kode se ne vidi zakaj je potreben delay(3000).
Delay(2000) v priloženi kodi pa je potreben, če hočeš prebrat vrednosti šestih (2×3) senzorjev.
Vprašanje je, kako hitro se spreminjajo vrednosti senzorjev oz.
kateri senzorji so uporabljeni in kateri(kakšen, grafični ali karakter) LCD je uporabljen.
V glavnem kar nekaj neznank za nek konkreten odgovor.

Avtor: borzonKraj: Postojna PrispevekObjavljeno: Ned Avg 23, 2020 9:22 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdravljen Jaka57,

Razumem, da se iz prilozene kode ne vidi vsega potrebnega, ampak nisem zelel, da bi lepil celotno kodo tukaj ker bi je bilo preveč.

Z LCD prikazovalnikom sem želel, da uporabnik oziroma dotična oseba lahko v "miru" (času 2 sekund) prebere iz LCD zaslona vrednosti iz LCD-ja, nakar se lcd zaslon pobriše in se na njem prikazejo vrednosti drugih senzorjev. Za ogled teh vrednosti ima uporabnik spet čas 2 sekundi za pregled in nato se LCD zaslon pobriše in se zavrti void loop..
Uporabljeni so senzorji za temperaturo, osvetljenost in hallow senzor za obodno hitrost.
kot LCD zaslon je uporlabljen klasicni 20x4 z I2C.

Mogoče kdo od tukaj prisotnih pozna kako opcijo, da bi bilo prikaovanje na LCDju neodvisno od loop zanke oziroma, da čas prikazovanja ne bi bil vključen v hitrost odvijanja void zanke.

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Ned Avg 23, 2020 9:56 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ali na 20x4 LCD ne spraviš napise in vrednosti za vseh šest senzorjev naenkrat?
Če bi lahko to naredil, se lahko znebiš 2x delay(2000) in izpisuješ samo vrednosti posameznega senzorja, če se le ta spremeni.
Kateri MCU oz. Arduino ploščo uporabljaš?
Tudi če narediš funkcijo za izpis boš le to klical iz void loop, kar pomeni, da boš zopet naletel na tiste delay(2000).

In še vedno ni jasno zakaj delay(3000).
Nič ne bi bilo narobe, če bi celotno kodo prilepil ali vsaj void loop.

Avtor: borzonKraj: Postojna PrispevekObjavljeno: Ned Avg 23, 2020 10:57 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdravljeni,

Uporabljam Arduino Mega 2560 R3 skupaj z LCD 20x4 in I2C.
Ne na žalost ne spravim zapisa vseh senzorjev na LCD zaslon, če bi bi bila tezava v trenutku rešena.
Delay(3000) ne potrebujem oziroma sem se pri tem napačno izrazil. Potrebujem samo oziroma le 2x delay(2000).

Mogoče kdo ve ali obstaja kakšen večji LCD za Arduino kot je 20x4.

Avtor: rafaellsiKraj: Radovljica PrispevekObjavljeno: Ned Avg 23, 2020 11:29 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Zakaj pa ne bi dal izpisa v neko "if" zanko? Če je od zadnjega pretekel željen čas, izpišeš nove vrenosti, drugače pa izpis preskočiš ...

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Ned Avg 23, 2020 11:38 pm    Naslov sporočila:  
----------------------------------------------------------------------------
borzon je napisal/a:
.....Mogoče kdo ve ali obstaja kakšen večji LCD za Arduino kot je 20x4.
Seveda obstaja.

Avtor: igo PrispevekObjavljeno: Pon Avg 24, 2020 6:17 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Koda:

unsigned long MiliNovX;
unsigned long MiliNovS;
unsigned long MiliZdaj;
byte NovX;
byte NovS;

...
Če te moti, da bo ob zagonu programa prvič vseh 6 senzorjev izpisalo 0, v Setupu dodaj
  NovX = 10;
da 3 sekunde ne bo izpisalo ničesar
ali pa izvedeš 2., 3., 5. in 6. meritev.

void loop()
{
  MiliZdaj = millis();


  if(MiliZdaj > MiliNovS)
  {
    NovS++; // Sproži meritev novega senzorja in pripravi za ...
    MiliNovX = MiliZdaj + 1000; // ... naslednjo meritev čez 1 sekundo

    switch(NovS)
    {
      case 1: {izmeri S1; break}

      case 2: {izmeri S2; break}

      case 3: {izmeri S3; break}

      case 4: {izmeri S5; break}

      case 5: {izmeri S5; break}

      case 6: {izmeri S6; NovS=0; break}

      default : {NovS=0}
    }
  }

  if(MiliZdaj > MiliNovX)
  {
    NovX++; // Sproži nov izpis in pripravi za ...
    MiliNovX = MiliZdaj + 3000; // ... naslednji izpis čez 3 sekunde

    if(NovX == 1)
    {
      izpiše senzorje 1,2,3
      NovX = 2;
    }
    if(NovX > 2) // da ne pobegne preko 3
    {
      izpiše senzorje 4,5,6
      NovX = 0;
    }
  }
...
} // void loop()

//gornja koda bo izmenoma vsake 3 sekunde prikazovala po 3 senzorje

// tudi meritve se lahko izvajajo redkeje in ne vse hkrati

// lahko narediš z if ali s case ali kako drugače.


To je primer za izpis vsake 3 sekunde in meritev vsako sekundo.


p.s.:
Če kliknem na Predogled, se vnosno polje in polje za Predogled izpraznita. Če oddam neposredno s Pošlji, pa lahko oddam.


Nazadnje urejal/a igo Pon Avg 24, 2020 6:54 pm; skupaj popravljeno 3 krat

Avtor: polkic PrispevekObjavljeno: Pon Avg 24, 2020 6:34 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdravljen,
tudi jaz bi svetoval, da se ne izpisuje vsak cikel ampak občasno.

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Pon Avg 24, 2020 8:03 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Saj, vsaj jaz, ponavadi napišemo program, da se vrednost senzorja izpiše le ob spremembi.
Z uporabo LCDja z več stolpci se bo rešil tega problema,
saj bodo imena senzorjev stalno na zaslonu, izpiše pa se samo spremenjena vrednost senzorja(jev).
Pri njemu je ravno to problem, da se prvi set vrednosti izpiše, nato čaka dve sekundi in v tem času ne naredi nič in nato izpiše nasledji set vrednost, zopet čaka dve sekundi,.........

Avtor: lojzek PrispevekObjavljeno: Tor Avg 25, 2020 8:15 am    Naslov sporočila:  
----------------------------------------------------------------------------
Ena od variant - najbolj praktična - je uporaba timerja in prekinitev. v prekinitveni rutini gledaš, če je preteklo dovolj časa (omenjene 3s) za spremembo izpisa na LCD.

Vmes ima Arduino povsem dovolj časa početi kaj drugega koristnega, ne pa da čaka na mestu...

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Tor Avg 25, 2020 9:22 am    Naslov sporočila:  
----------------------------------------------------------------------------
lojzek je napisal/a:
...... v prekinitveni rutini gledaš, če je preteklo dovolj časa (omenjene 3s)

Če imaš prekinitev vsake 3s, ni potrebno nič gledat ali je preteklo 3s!
Vendar pri uporabi timer interupt, če se prav spomnim, ne delujejo nekatere funkcije, ki so vezane na enega od časovnikov.

Avtor: Peter123Kraj: Lj. PrispevekObjavljeno: Tor Avg 25, 2020 9:35 am    Naslov sporočila:  
----------------------------------------------------------------------------
Sam za osveževanje napisov na LCDjih in podobno uporabljam navaden števec, ki šteje gor ali dol (načeloma je vseeno).
Štetje imam izvedeno v interuptu v smislu i++, tako dosežem ponovljivost in zelo kratek čas v samem interuptu.
V glavni zanji pa imam nekaj podobnega:
void nterrupt
{
i++;
}

if (i > 50)
{
izpis na LCD;
i=0;
}
Znak če je večji je pomemben, ker se lahko dejansko zgodi da se ukaz preskoči.

Za neke periodične zadeve, ki niso časovno kritične je zadeva super

Pozabil povedati, da je potrebna še nastavitev interupta. Sam ga nastavim tako da se proži čim manjkrat, kar v večini primerov še vedno zagotavlja točnost boljšo od 0,1s.

Stran 1 od 2

Powered by phpBB © 2001,2002 phpBB Group