www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Pohitritev kode in LCD zaslon
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
borzon
Član
Član



Pridružen-a: Čet 17 Sep 2015 23:14
Prispevkov: 150
Aktiv.: 1.44
Kraj: Postojna

PrispevekObjavljeno: Ned Avg 23, 2020 7:19 pm    Naslov sporočila:  Pohitritev kode in LCD zaslon Odgovori s citatom

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();
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Ned Avg 23, 2020 8:02 pm    Naslov sporočila:   Odgovori s citatom

Lahko probaš skrajšat čas med prikazovanjem?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
borzon
Član
Član



Pridružen-a: Čet 17 Sep 2015 23:14
Prispevkov: 150
Aktiv.: 1.44
Kraj: Postojna

PrispevekObjavljeno: Ned Avg 23, 2020 8:55 pm    Naslov sporočila:   Odgovori s citatom

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?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Ned Avg 23, 2020 9:00 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
borzon
Član
Član



Pridružen-a: Čet 17 Sep 2015 23:14
Prispevkov: 150
Aktiv.: 1.44
Kraj: Postojna

PrispevekObjavljeno: Ned Avg 23, 2020 9:22 pm    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Ned Avg 23, 2020 9:56 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
borzon
Član
Član



Pridružen-a: Čet 17 Sep 2015 23:14
Prispevkov: 150
Aktiv.: 1.44
Kraj: Postojna

PrispevekObjavljeno: Ned Avg 23, 2020 10:57 pm    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rafaellsi
Član
Član



Pridružen-a: Ned 11 Sep 2011 18:54
Prispevkov: 477
Aktiv.: 3.12
Kraj: Radovljica

PrispevekObjavljeno: Ned Avg 23, 2020 11:29 pm    Naslov sporočila:   Odgovori s citatom

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š ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Ned Avg 23, 2020 11:38 pm    Naslov sporočila:   Odgovori s citatom

borzon je napisal/a:
.....Mogoče kdo ve ali obstaja kakšen večji LCD za Arduino kot je 20x4.
Seveda obstaja.
_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.11

PrispevekObjavljeno: Pon Avg 24, 2020 6:17 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor


Nazadnje urejal/a igo Pon Avg 24, 2020 6:54 pm; skupaj popravljeno 3 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
polkic
Član
Član



Pridružen-a: Pon 04 Dec 2017 20:27
Prispevkov: 68
Aktiv.: 0.88

PrispevekObjavljeno: Pon Avg 24, 2020 6:34 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljen,
tudi jaz bi svetoval, da se ne izpisuje vsak cikel ampak občasno.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Pon Avg 24, 2020 8:03 pm    Naslov sporočila:   Odgovori s citatom

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

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Avg 25, 2020 8:15 am    Naslov sporočila:   Odgovori s citatom

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...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Tor Avg 25, 2020 9:22 am    Naslov sporočila:   Odgovori s citatom

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.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Tor Avg 25, 2020 9:35 am    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group