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.
I još me zanima dali funkcija F kod print/println štedi RAM ili ROM?
RAM.
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.
I još me zanima dali funkcija F kod print/println štedi RAM ili ROM?
RAM.
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.
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.
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.
[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
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...).
Pa i koristim 3231
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.
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.
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)
{
//
}
}
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.
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.
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.
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.
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.
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.
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.
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.
Jos jedna stvar je da u if stavljaj samo zadnje redove funkcija.
Nisam te baš najbolje shvatio.
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.
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.
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.
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.
Pametno, al ak se ne varam, onda to više nije kontantni string jer je u varijabli, tako da mi F funkcija otpada tu.
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).
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;
display.setCursor(SCR_ICONS_X, SCR_ICONS_HB_Y);
display.setTextSize(SCR_ICONS_SIZE);
display.print(F("HB"));
}else{
refreshScreen = true;
display.setCursor(SCR_ICONS_X, SCR_ICONS_HB_Y);
display.setTextSize(SCR_ICONS_SIZE);
display.print(F("HB"));
}
}
void svjetla(bool x){
refreshScreen = true;
display.setCursor(SCR_ICONS_X, SCR_ICONS_HB_Y);
display.setTextSize(SCR_ICONS_SIZE);
if(x){
display.print(F("HB"));
}else{
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.
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.
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.
...
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.
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
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
Š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.
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.
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.
Koliko ti objekti/klase troše resursa?
Sad sam bas pogledao u Visual Studiu i on omogucuje kreiranje klasa u zasebnom file-u, samo moram isprobati dal radi kad uhvatim vremena.
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.
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.
Jesi pokušao u drugom .ino fajlu? I fajlovi ti moraju bit u istom folderu.