Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - tutorijali, pitanja, primjeri i projekti
(09-25-2017, 11:08 PM)Makso Wrote: Uspio sam nekako, ali i dalje mi nije jasno kao to radi?

Ispod lcd.prin(a); sam dodao samo lcd.print(" "); i to sada radi kako treba ali nije mi ništa jasno?

Pa zar nije ocigledno? Ispisao si tih "99" i onaj jedan " " (space/blank/prazan karakter ili kako ga već ko zove), ti je obrisao onu nulu na mjestu trece cifre, jer je ispisan preko te nule.

To znaci i da problem nisi rijesio, samo si ga ublazio. Ako nakon 990 ispises npr. 5, dobices na displeju:5 0 jer će biti obrisana druga devetka, ali ne i nula iza nje...

Dakle, kompletnu sirinu koju zauzima broj trebas ispuniti sa ispisom.
Reply
Ako se ne smisli nesto efektnije, jedna od sporijih komandi koja moze da posluzi je standardna C funkcija sprintf().
Da ne objasnjavam sta sve ta funkcija radi, potrazite opis (ima dosta parametara) samo cu ukratko da kazem da ona sluzi za razna "formatiranja" brojeva i stringova.

Ovaj problem sa brojevima moze da se resi izmedju ostalog tako sto se upisuju "vodece nule" (leading zero), tako da na primer broj "123" postane "000123" gde smo rezervisali 6 mesta za prikaz.

Primer dela programa za formatiranje brojeva za LCD bi izgledao ovako:

Code:
#include <stdio.h> //biblioteka, postaviti na pocetku programa
char moj_buffer [40] = ""; //definicija buffera duzine 40 karaktera (40 da bi stao text i za "scroll")
moj_broj = 123; //variabla koja drzi nas podatak

//formatiraj poruku, %06d znaci da ispise broj sa do 6 "leading zero", poravnati sa leve strane broja
//pogledaj dokumentaciju za sprintf() za ostale raspolozive formate
sprintf(moj_buffer, "Pos=%06d mm", moj_broj);

lcd.clear(); //ocisti sve sa LCD, cursor na 0,0
lcd.print(moj_buffer); //ispisi sadrzaj bufera na LCD u prvom redu
//trebalo bi da se pokaze na LCD "Pos=000123 mm"

Sprintf() funkcija moze takodje da prikaze i sa "leading space", dakle umesto nula da ispisuje space (prazan) karakter, moze sa leve strane, moze sa desne, moze svasta zato sam spomenuo da se obavezno pogleda dokumentacija za tu funkciju, svi racunari i sve platforme imaju tu C funkciju, kao i printf(), atoi(), itoa() ... na sve te funkcije ce da natrcite jednog dana ... ako dodjete do REGEXP, e onda ste na nekom semaforu skrenuli pogresno, trebalo je u suprotnu stranu kako god da izaberes : )
Stringovi se koriste samo kada se mora za prikaz u nama citljivom i "naviknutom" nacinu, kada ne mora, recimo za komunikaciju izmedju dva uredjaja uvek je bolje koristiti RAW/HEX format jer ima daleko vise prednosti nego string koji je limitiran sa svojim osobinama. Recimo samo kada se predje na UTF-8 to pravi takav problem da je to ludnica, nije vise jedan karakter jedan byte nego 2, 3, 4 ... sva logika koju imas se razbuca ako to na osnovnom nivou ne odradis kako treba, vazdan problema sa stringovima ...
Reply
(09-25-2017, 11:56 PM)ognjan Wrote:
(09-25-2017, 11:08 PM)Makso Wrote: Uspio sam nekako, ali i dalje mi nije jasno kao to radi?

Ispod lcd.prin(a); sam dodao samo lcd.print(" "); i to sada radi kako treba ali nije mi ništa jasno?

Pa zar nije ocigledno? Ispisao si tih "99" i onaj jedan " " (space/blank/prazan karakter ili kako ga već ko zove), ti je obrisao onu nulu na mjestu trece cifre, jer je ispisan preko te nule.

To znaci i da problem nisi rijesio, samo si ga ublazio. Ako nakon 990 ispises npr. 5, dobices na displeju:5 0 jer će biti obrisana druga devetka, ali ne i nula iza nje...

Dakle, kompletnu sirinu koju zauzima broj trebas ispuniti sa ispisom.

Probao sam sa (" ") jednim pritiskom space-a,i brojanje od 0-32767 i nazad do 0 i sve briše ne ostaju nepotrebni brojevi.
Reply
(09-26-2017, 09:41 AM)Makso Wrote:
(09-25-2017, 11:56 PM)ognjan Wrote:
(09-25-2017, 11:08 PM)Makso Wrote: Uspio sam nekako, ali i dalje mi nije jasno kao to radi?

Ispod lcd.prin(a); sam dodao samo lcd.print(" "); i to sada radi kako treba ali nije mi ništa jasno?

Pa zar nije ocigledno? Ispisao si tih "99" i onaj jedan " " (space/blank/prazan karakter ili kako ga već ko zove), ti je obrisao onu nulu na mjestu trece cifre, jer je ispisan preko te nule.

To znaci i da problem nisi rijesio, samo si ga ublazio. Ako nakon 990 ispises npr. 5, dobices na displeju:5 0 jer će biti obrisana druga devetka, ali ne i nula iza nje...

Dakle, kompletnu sirinu koju zauzima broj trebas ispuniti sa ispisom.

Probao sam sa (" ") jednim pritiskom space-a,i brojanje od 0-32767 i nazad do 0 i sve briše ne ostaju nepotrebni brojevi.

Naravno... a sad uzmi tu istu petlju pa povecavaj i umanjuj brojac po 100 umjesto po 1, pa onda po 1000 ...
Reply
(09-26-2017, 11:07 AM)ognjan Wrote:
(09-26-2017, 09:41 AM)Makso Wrote:
(09-25-2017, 11:56 PM)ognjan Wrote:
(09-25-2017, 11:08 PM)Makso Wrote: Uspio sam nekako, ali i dalje mi nije jasno kao to radi?

Ispod lcd.prin(a); sam dodao samo lcd.print(" "); i to sada radi kako treba ali nije mi ništa jasno?

Pa zar nije ocigledno? Ispisao si tih "99" i onaj jedan " " (space/blank/prazan karakter ili kako ga već ko zove), ti je obrisao onu nulu na mjestu trece cifre, jer je ispisan preko te nule.

To znaci i da problem nisi rijesio, samo si ga ublazio. Ako nakon 990 ispises npr. 5, dobices na displeju:5 0 jer će biti obrisana druga devetka, ali ne i nula iza nje...

Dakle, kompletnu sirinu koju zauzima broj trebas ispuniti sa ispisom.

Probao sam sa (" ") jednim pritiskom space-a,i brojanje od 0-32767 i nazad do 0 i sve briše ne ostaju nepotrebni brojevi.

Naravno... a sad uzmi tu istu petlju pa povecavaj i umanjuj brojac po 100 umjesto po 1, pa onda po 1000 ...

Aha, sad mi je jasnije, ja neću imati potrebu za toliko umanjenje broja, samo po 1.
Reply
Makso,

da bi ti bila jasna konverzija iz decimalnog brojnog sistema u string (niz karaktera), evo ti jednog opisnog programa koji to radi.
Code:
char *DecimalToString(unsigned int Broj, unsigned char Nule)
{
unsigned char KonvertovanBroj[5] = "     ";

KonvertovanBroj[0] = ((Broj % 10000) / 10000) + 0x30;
KonvertovanBroj[1] = ((Broj % 1000) / 1000) + 0x30;
KonvertovanBroj[2] = ((Broj % 1000) / 100) + 0x30;
KonvertovanBroj[3] = ((Broj % 100) / 10) + 0x30;
KonvertovanBroj[4] = (Broj % 10) + 0x30;

if(!Nule)
{  if(KonvertovanBroj[0] == '0')
    {        KonvertorvanBroj[0] = ' ';
              if(KonvertovanBroj[1]) == '0')
              {        KonvertovanBroj[1] = ' ';
                        if(KonvertovanBroj[2] == '0')
                        {        KonvertovanBroj[2] = ' ';
                                  if(KonvertovanBroj[3] == '0')
                                  {        KonvertovanBroj[3] = ' ';}
                         }
              }
    }
}

return KonvertovanBroj;
}

Program koji je prikazan ovde, je samo opisnog karaktera za razumevanje rada konverzije tipova i nije optimalno softversko resenje.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)