Arduino - projekti, ideje, savjeti, problemi izdvojena tema

poruka: 1.365
|
čitano: 442.348
|
moderatori: DrNasty, pirat, XXX-Man, Lazarus Long, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
Ova tema je sadržajno povezana sa sljedećim temama: Uvod u elektrotehniku (istosmjerna struja)
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Koristim DS3231 modul za datum i vrijeme. Sad me zanima kako da provjerim dali je dani datum ispravan? Tipa da upišem 31.2.2017., kako da provjerim to?

Jako bitno. 

 

Dex.pwn kaže...

I još me zanima dali funkcija F kod print/println štedi RAM ili ROM?

RAM.



14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Zašto kažeš da je jako bitno? Misliš da će modul ispravit sam to?

Btw ovo sa štednjom. Dali on taj string iz RAMa prebaci u ROM? Imam manjak ROMa a RAMa oko nekih 20%, pa da napravim balans neki.

Poruka je uređivana zadnji put pet 1.9.2017 0:11 (Dex.pwn).
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Zašto kažeš da je jako bitno? Misliš da će modul ispravit sam to?

Ak je netko toliko tupav da upiše nemogući datum, onda nit ne zaslužuju da ima ispravan datum. 

 

Dex.pwn kaže...

Btw ovo sa štednjom. Dali on taj string iz RAMa prebaci u ROM? Imam manjak ROMa a RAMa oko nekih 20%, pa da napravim balans neki.

Da ti možda nisi zamijenio ROM i RAM? Jer F radi upravo obratno od ovog što si napisao - učitava string iz ROM-a prema potrebi, a ne da je stalno u RAM-u.

14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

[Stino - Start building "Putno računalo za bicikl"...]
Sketch uses 29,906 bytes (97.4%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,553 bytes (75.8%) of dynamic memory, leaving 495 bytes for local variables. Maximum is 2,048 bytes.
[Stino - Done building "Putno računalo za bicikl" in 0.1s.]

 

 

Svaki kontantni string je u F funkciji

 

Al da, mislio sam da neke kontantne stringove držim u RAMu, i oslobodim ROma

17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Svaki kontantni string je u F funkciji

 

Al da, mislio sam da neke kontantne stringove držim u RAMu, i oslobodim ROma

Dosad si već trebao shvatiti da je nakon uključenja Arduina (ili računala) RAM prazan, a sve ono što bude u RAM-u mora se odnekud učitati - iz BIOS-a, ROM-a, hard diska...

 

Ako imaš premalo ROM-a, možeš koristiti EEPROM recimo iz RTC-a (BTW taj RTC koji koristiš je smeće - kupi si DS3231). Ili koristi pločicu s većim ROM-om. Ili optimiziraj program (sreži sve nepotrebne, pogotovo dugačke stringove, sav kod koji ponavljaš prebaci u funkcije...).

14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Pa i koristim 3231

17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Pa i koristim 3231

LOL, Da, ne znam kako sam došao do ovog - pretraživao na eBayu pa pomiješao nešto. Uglavnom, ja sam prvo nabavio tog, poslije onog drugog jer je bio manji i praktičniji (još uvijek ga koristim u akvariju jer mi ga se nije dalo mijenjati), no dosta je neprecizan i nisam siguran da puni bateriju uopće ili kako treba.

15 godina
offline
Arduino - projekti, ideje, savjeti, problemi

Vjerojatno ti String library pojede puno resursa. Imao sam taj problem na Atmegi8.

Bolje je koristiti char array, a stringove manipulirati funkcijama definiranim u string.h headeru.

Na primjer strncmp, memset, memcpy, strcat i tako dalje. Binary se smanjio za 20-ak % nakon toga.

Moj PC  
1 0 hvala 1
14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Hvala.

Nego da vas pitam, dal je bolje imati više funkcija, ili jednu funkciju za sve?

Mislim da funkcije s kojima mijenjam neke stvari na ekranu.

 

Eo primjer

 

void svjetla() {} // FUNKCIJA KOJA POSTAVLJA DIO ZA SVJETLA NA EKRANU

void svjetlabrisi() {} // FUNKCIJA KOJA UKLANJA DIO ZA SVJETLA NA EKRANU

 

Ili

 

void ekran(uint8_t dio)

{

   switch(dio)

   {

      //

   }

}

 

15 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Hvala.

Nego da vas pitam, dal je bolje imati više funkcija, ili jednu funkciju za sve?

Mislim da funkcije s kojima mijenjam neke stvari na ekranu.

 

Eo primjer

 

void svjetla() {} // FUNKCIJA KOJA POSTAVLJA DIO ZA SVJETLA NA EKRANU

void svjetlabrisi() {} // FUNKCIJA KOJA UKLANJA DIO ZA SVJETLA NA EKRANU

Ovaj primjer za ukljucivanje i iskljucivanje ikonice za svjetla ili kako god vec imas oznaceno je po meni bolje:

void svjetla(bool x){

  if(x){

   //ukljuci

  }else{

   //iskljuci

  }

}

 

EDIT:

saljes true za ukljuciti, false za iskljuciti.

Poruka je uređivana zadnji put pet 1.9.2017 2:03 (CroNk3r).
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Nego da vas pitam, dal je bolje imati više funkcija, ili jednu funkciju za sve?

Mislim da funkcije s kojima mijenjam neke stvari na ekranu. 

Radi preglednosti daleko je bolje imati više funkcija, pogotovo ako te funkcije nemaju argumente - tad mislim da je i kompajlirani program identičan. Ako imaj argumente, onda je stvar malo kompliciranija zbog stavljanja argumenata na stog (stack), ali ako se ne pretjeruje, nema ni tada problema.

 

Osobno koristim funkcije gdje god mogu - i za organizaciju (za preglednost), i za isti/slični kod. Recimo kako ljudi znaju koristiti switcheve - često umjesto toga mogu napisati funkciju kojoj će argument biti ono što bi inače bilo u switchu pa u konačnici em dobijem manji kod, em je program pregledniji i manje je šanse za greške.

14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...
Dex.pwn kaže...

Hvala.

Nego da vas pitam, dal je bolje imati više funkcija, ili jednu funkciju za sve?

Mislim da funkcije s kojima mijenjam neke stvari na ekranu.

 

Eo primjer

 

void svjetla() {} // FUNKCIJA KOJA POSTAVLJA DIO ZA SVJETLA NA EKRANU

void svjetlabrisi() {} // FUNKCIJA KOJA UKLANJA DIO ZA SVJETLA NA EKRANU

Ovaj primjer za ukljucivanje i iskljucivanje ikonice za svjetla ili kako god vec imas oznaceno je po meni bolje:

void svjetla(bool x){

  if(x){

   //ukljuci

  }else{

   //iskljuci

  }

}

 

EDIT:

saljes true za ukljuciti, false za iskljuciti.

 

mbaksa kaže...
Dex.pwn kaže...

Nego da vas pitam, dal je bolje imati više funkcija, ili jednu funkciju za sve?

Mislim da funkcije s kojima mijenjam neke stvari na ekranu. 

Radi preglednosti daleko je bolje imati više funkcija, pogotovo ako te funkcije nemaju argumente - tad mislim da je i kompajlirani program identičan. Ako imaj argumente, onda je stvar malo kompliciranija zbog stavljanja argumenata na stog (stack), ali ako se ne pretjeruje, nema ni tada problema.

 

Osobno koristim funkcije gdje god mogu - i za organizaciju (za preglednost), i za isti/slični kod. Recimo kako ljudi znaju koristiti switcheve - često umjesto toga mogu napisati funkciju kojoj će argument biti ono što bi inače bilo u switchu pa u konačnici em dobijem manji kod, em je program pregledniji i manje je šanse za greške.

 

 

Imao bi jedan parametar, i on bi govorio koji dio ekrana se treba ažurirati, tj. za čega(svjetla, ovo ono..).

A sad, kako je @CroNk3r napisao, to bi samo prepolovilo broj funkcija.

Ovako bi imao samo jednu za ažuriranje ekrana(ne mislim sve funkcije stavljati u jednu :D)

 

Btw. netko mi je davno spomenuo neki Arduino koji je isti kao Nano(dimenzije i pinovi) ali ima više ROMa i RAMa.

Mislim da je o Pro radi, al nisam siguran.

Poruka je uređivana zadnji put pet 1.9.2017 2:18 (Dex.pwn).
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
A sad, kako je @CroNk3r napisao, to bi samo prepolovilo broj funkcija.

Ovako bi imao samo jednu za ažuriranje ekrana(ne mislim sve funkcije stavljati u jednu :D)

Sad kad dalje pišeš mislim da nisam dobro shvatio tvoje pitanje. CroNk3r ti je dao dobar primjer - tu vjerojatno nema smisla to cijepati na dvije funkcije.

15 godina
offline
Arduino - projekti, ideje, savjeti, problemi

Ja preferiram koristiti cim vise booleana jer ne trose tolko memorije, a i jednostavni su za koristenje u if-ovima.

Sta se tice ekrana, tesko je reci kako je najbolje posto i ekran koristis modularno(barem ja tako pretpostavljam) i onda je ovo najjednostavnije.

Kad malo bolje razmislim, ja bi imao globalne booleane tipa:

bool svjetla

bool zmigavci

bool ...

bool ...

za svaki modul i onda imas updateScreen();

u kojem samo provjeravas dal oces taj dio upaljen ili ugasen.

 

Tesko je sad napamet kad nisam radio na kodu i neznam detalje.

Poruka je uređivana zadnji put pet 1.9.2017 2:29 (CroNk3r).
Moj PC  
1 0 hvala 0
14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Evo jednog primjera.

Da ne duljim više.

Ugl. kao u primjeru, tako bi sve funkcije koje rade nešto na ekranu spojio u jednu.

https://pastebin.com/wKByz5Lw

15 godina
offline
Arduino - projekti, ideje, savjeti, problemi

Evo sad kad vidim, najbolje ti je ovo s true i false za svaki dio ekrana koristiti.

Jos jedna stvar je da u if stavljaj samo zadnje redove funkcija.

Moj PC  
0 0 hvala 0
14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...

Jos jedna stvar je da u if stavljaj samo zadnje redove funkcija.

 

 

Nisam te baš najbolje shvatio.

17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...

Ja preferiram koristiti cim vise booleana jer ne trose tolko memorije, a i jednostavni su za koristenje u if-ovima.

bool ti je inače 8-bitni na Arduinu, znači isto kao byte i char. Realno gledajući kad bi 8 bool vrijednosti zapakirao u jedan byte, to bi bila zgodna ušteda - 1 bajt umjesto 8.

 

Jedan dio ljudi učestalo radi iste greške kod Arduina jer nisu svjesni da su int-ovi 16-bitni i da bi za hrpu toga umjesto njih mogli koristiti byteove (recimo za pinove) ili charove ako im trebaju i negativne vrijednosti.

 

CroNk3r kaže...

Kad malo bolje razmislim, ja bi imao globalne booleane tipa:

Da, za to bi bilo logično da se koriste globalne varijable jer moraju biti stalno zapamćene, te bi ih ionako koristile brojne funkcije.

 

17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Evo jednog primjera.

Da ne duljim više.

Ugl. kao u primjeru, tako bi sve funkcije koje rade nešto na ekranu spojio u jednu.

https://pastebin.com/wKByz5Lw

A zašto ti umjesto tog bućkuriša ne bi imao nešto poput ovog?

 

Glavna poanta funkcija je da pozoveš funkciju s drugim argumentima umjesto da više puta pišeš skoro isti kod. To ti u tom svom kodu nisi napravio.

14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Pametno, al ak se ne varam, onda to više nije kontantni string jer je u varijabli, tako da mi F funkcija otpada tu.

 

17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Pametno, al ak se ne varam, onda to više nije kontantni string jer je u varijabli, tako da mi F funkcija otpada tu.

Je li ti stvarno bitno tih 9 bajtova RAM-a? Možeš staviti display.print(F("  ")); pa će onda tekst za te dvije ikone biti velik "čak" 6 bajta. A ispisat će se iz RAM-a umjesto da se prvo ide kopirat iz ROM-a u RAM pa tek onda ispisivat. Funkciju F ima smisla koristiti kod duljih stringova ili kad si na knap s RAM-om da brojiš svaki bajt (ali onda ti je cijeli program zajeb jer postoji šansa da će ti biti nestabilan).

 

Poruka je uređivana zadnji put pet 1.9.2017 3:44 (mbaksa).
13 godina
neaktivan
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Ako imaš puno bool varijabli i znaš se koristit bitovima i radit s njima , koristi byte ako ti triba 8 varijabli ili int za 16 .... Svaki bit u byte varijabli ili nekoj drugog tipa koristis umjesto bool varijable, malo je kompliciranije ali uštediš ...
Moj PC  
1 0 hvala 0
15 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
CroNk3r kaže...

Jos jedna stvar je da u if stavljaj samo zadnje redove funkcija

Nisam te baš najbolje shvatio.

Htio sam reci da ne napravis ovo:

void svjetla(bool x){

  if(x){

   refreshScreen = true;

  1.    display.setCursor(SCR_ICONS_X, SCR_ICONS_HB_Y);

  2.    display.setTextSize(SCR_ICONS_SIZE);

  3.    display.print(F("HB"));

  }else{

   refreshScreen = true;

  1.    display.setCursor(SCR_ICONS_X, SCR_ICONS_HB_Y);

  2.    display.setTextSize(SCR_ICONS_SIZE);

  3.    display.print(F("HB"));

  }

}

 

  1. nego:

void svjetla(bool x){

   refreshScreen = true;

  1.    display.setCursor(SCR_ICONS_X, SCR_ICONS_HB_Y);

  2.    display.setTextSize(SCR_ICONS_SIZE);

  3. if(x){

  4.    display.print(F("HB"));

  }else{

  1.    display.print(F("HB"));

  }

}

 

Jer jako puno puta sam vidio da netko samo prekopira cijele funkcije u if i uopce ne razmislja da je sve osim jedne linije koda isto.

 

EDIT:

Zanemari ove brojeve, ni sam neznam zasto su tu...

Inace od mbaksa  je bolje rjesenje.

I ovo za bool nisam znao da je 8.

iako ima smisla posto je procesor 8bitni

 

Inace kad se ima resursa na raspolaganju je zgodno koristiti ovako(pregledno i lako za implementirati):

 

void updateDisplay(int[] x, int[] y, boolean[] z, String[] msg){

  for(int i; i<z.length; i++){

    if(z[i]){

     //postavljanje koodrinata na x-y osi

     //ispis msg

    }

  }

}

Jedino sto je nazalost arduino malo preslab za takav nacin programiranja, ali kad se za PC programira puno je lakse.

 

Poruka je uređivana zadnji put pet 1.9.2017 11:01 (CroNk3r).
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...
Inace od mbaksa  je bolje rjesenje.

Još bolje rješenje bi bilo korištenje klasa (pa da onda ima jedno polje objekata umjesto nekoliko polja pojedinačnih podataka), ali ga nisam htio zasipati još i tim.  Ali evo recimo primjer. Puno elegantnije, zar ne? Tu se moglo otići još i malo dalje pa da se vrijednosti inicijaliziraju konstruktorom, da se koristi polje pokazivača i/ili pokazivači općenito itd.

 

CroNk3r kaže...
I ovo za bool nisam znao da je 8.

iako ima smisla posto je procesor 8bitni

Ne zbog toga, nego zbog toga što je najmanja jedinica koju možeš iščitati iz RAM-a i zapisati u RAM 1 bajt, dakle 8 bitova.

 

Neki kompajleri inače imaju optimizacije kojima pakiraju boolove u veće strukture - ako se dobro sjećam, Turbo Pascal je to radio. Mislim da sam jednom gledao radi li to Arduinov kompajler, no nije to i nije radio - za svaki bool je povećana upotreba memorije za 1 bajt.

 

CroNk3r kaže...
Inace kad se ima resursa na raspolaganju je zgodno koristiti ovako(pregledno i lako za implementirati):

...

Jedino sto je nazalost arduino malo preslab za takav nacin programiranja, ali kad se za PC programira puno je lakse. 

Što kod koji si napisao prenosi? U osnovi samo referencu na prvo polje? Onda Arduino nije preslab za to. A kad bi na stack stavljao cijela polja, onda bi čovjek mogao ručno to slati kao reference ili koristiti pokazivače pa opet ne bi bilo problema.  Ja osobno se nikad nisam navikao na to jer sam dosta rano, još u Turbo Pascalu, prešao na OOP, pa takvo slanje polja kao argumenata doživljavam lošom programerskom praksom. To se tako možda moralo raditi u vrijeme C-a, ali sad smo već trebali dovoljno odmaći od toga - danas većina modernih programskih jezika podržava OOP.

15 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi
mbaksa kaže...

Još bolje rješenje bi bilo korištenje klasa (pa da onda ima jedno polje objekata umjesto nekoliko polja pojedinačnih podataka), ali ga nisam htio zasipati još i tim.  Ali evo recimo primjer. Puno elegantnije, zar ne? Tu se moglo otići još i malo dalje pa da se vrijednosti inicijaliziraju konstruktorom, da se koristi polje pokazivača i/ili pokazivači općenito itd.

 Da, klase su najelegantnije rjesenje, ali ih nisam koristio u Arduinu jos jer ne svidaju mi se u C++ -u

mbaksa kaže...

Ne zbog toga, nego zbog toga što je najmanja jedinica koju možeš iščitati iz RAM-a i zapisati u RAM 1 bajt, dakle 8 bitova.

Da, ali ono sto ocu reci je da procesor cita stalno cijeli bajt iz memorije zbog svoje arhitekture(cita 8 bita) posto su mu takvi registri, 16 bitni cita 2 byte  itd.

Naravno ima i nekih iznimka, ali vecina arhitektura je takva. Jedino jos postoje nacini da procesor zapise u jedan registar vise booleana, ali to je ocito kompliciranje na ovako jednostavnim procesorima

mbaksa kaže...

Što kod koji si napisao prenosi? U osnovi samo referencu na prvo polje? Onda Arduino nije preslab za to. A kad bi na stack stavljao cijela polja, onda bi čovjek mogao ručno to slati kao reference ili koristiti pokazivače pa opet ne bi bilo problema.  Ja osobno se nikad nisam navikao na to jer sam dosta rano, još u Turbo Pascalu, prešao na OOP, pa takvo slanje polja kao argumenata doživljavam lošom programerskom praksom. To se tako možda moralo raditi u vrijeme C-a, ali sad smo već trebali dovoljno odmaći od toga - danas većina modernih programskih jezika podržava OOP.

Ma ovo je java kod kad sam vec zaboravio kako je tocno u c++.

Znaci saljem polja u potprogram koji ih onda cita po redu i ovisno o booleanu pise na ekran ili ne.

Jedino sto sam morao na pocetak potprograma staviti da izbrise sve ikonice.

 

Znam da je OOP bolji pristup, ali kod arduina me zivcira da nema svaka klasa svoji file i zbog toga mi je sve nepregledno.

Poruka je uređivana zadnji put pet 1.9.2017 13:56 (CroNk3r).
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...
Da, klase su najelegantnije rjesenje, ali ih nisam koristio u Arduinu jos jer ne svidaju mi se u C++ -u

Slažem se da su malo zeznute u C++-u, ali... Bolje i takve, nego bez njih. Jednostavno je drugačija logika programiranja - OOP mi daleko bolje paše, ma kakav god bio. Daš objektima atribute, definiraš im metode i onda se oni sami međusobno razgovaraju i rade. 

 

CroNk3r kaže...
Znam da je OOP bolji pristup, ali kod arduina me zivcira da nema svaka klasa svoji file i zbog toga mi je sve nepregledno.

Je, to je malo traljavo izvedeno. Al opet, ako pišeš veliki program onda si klasu staviš u biblioteku, a ako pišeš mali program nije ti je problem imati u izvornom kodu samog programa. Tak da... Nije idealno, ali je doable.

14 godina
odjavljen
offline
Arduino - projekti, ideje, savjeti, problemi

Koliko ti objekti/klase troše resursa?

 
0 0 hvala 0
15 godina
offline
Arduino - projekti, ideje, savjeti, problemi

Sad sam bas pogledao u Visual Studiu i on omogucuje kreiranje klasa u zasebnom file-u, samo moram isprobati dal radi kad uhvatim vremena.

Moj PC  
0 0 hvala 0
17 godina
moderator
online
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Koliko ti objekti/klase troše resursa?

Probaš.  Dok su tako statički deklarirani moguće je da nikakve razlike niti nema. A ako i ima, minimalna je. A prednosti za daljnje održavanje programa su velike.

 

CroNk3r kaže...

Sad sam bas pogledao u Visual Studiu i on omogucuje kreiranje klasa u zasebnom file-u, samo moram isprobati dal radi kad uhvatim vremena.

Probao sam u Arduino IDE-u izvući klasu u odvojene fajlove, ali mi ne uspijeva. Kaže "error: previous definition of 'class Icon3'", a ta klasa definirana samo i isključivo u .h fajlu. Bezveze.

14 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Jesi pokušao u drugom .ino fajlu? I fajlovi ti moraju bit u istom folderu.

Ova tema je sadržajno povezana sa sljedećim temama: Uvod u elektrotehniku (istosmjerna struja)
Nova poruka
E-mail:
Lozinka:
 
vrh stranice