Hvala, budem to uradio kad napravim još target mod(tj goal mod) jer moram redizajnirati ekran za to.
Arduino - projekti, ideje, savjeti, problemi
- poruka: 1.365
- |
- čitano: 420.908
- |
- moderatori:
DrNasty, pirat, XXX-Man, Lazarus Long, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Jel ima funkcija s kojom mogu datum i vrijeme prebacit u unix?
Evo, optimizirao ja kod, i došao sam na ideju da promijenim malo load i save funkciju koja je imala hrpu koda.
I na kraju sam dobio ove rezultate
"OPTIMIZIRANI"
Sketch uses 27,142 bytes (88.4%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,754 bytes (85.6%) of dynamic memory, leaving 294 bytes for local variables. Maximum is 2,048 bytes.
ORIGINAL
Sketch uses 26,700 bytes (86.9%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,738 bytes (84.9%) of dynamic memory, leaving 310 bytes for local variables. Maximum is 2,048 bytes.
Sad mene zanima dali stvarno arrayi zauzimaju više ROMa i RAMa od običnih "single" varijabli?
Kod koji sam promijenio stavio sam dole.
https://pastebin.com/TiF3Xfx8 - "Optimizirani"
https://pastebin.com/egKpdNDR - Originalni kod
Napravio sam mali test, znači kod: https://pastebin.com/yYcvQntg
U oba slučaja, znači kad se koriste individualne varijable i kad se koristi polje, zauzeće globalnih varijabli je identično - 157 bajtova. I to točno 8 bajtova više nego kad nema ni jedne od tih varijabli ni polja.
A sad, zašto ti imaš razliku? Možda is u poljima koristio veće tipove podataka za neke varijable nego kad si koristio individualne varijable, možda si neke privatne varijable izvukao van iz funkcija pa su one postale globalne. Istraži, usporedi.
uint32_t states[4] = {
1, // STATE_SCREEN_STATUS
0, // STATE_HEADLIGHT
0, // STATE_FOG_LIGHT
0 // STATE_SCREEN_INFO
};
Cemu tu uint, pogotovo jos 32, tu je boolean dovoljan, odnosno byte posto nema razlike u memoriji
Na AVG statsima mozes ustediti memorije na nacin da ih racunas direktno kod ispisa, a ne za svaku imati varijablu(samo total/time).
Nemam bas previse vremena, ali ovo mi je upalo u oko brzinskim pregledom.
Napravio sam mali test, znači kod: https://pastebin.com/yYcvQntg
U oba slučaja, znači kad se koriste individualne varijable i kad se koristi polje, zauzeće globalnih varijabli je identično - 157 bajtova. I to točno 8 bajtova više nego kad nema ni jedne od tih varijabli ni polja.
A sad, zašto ti imaš razliku? Možda is u poljima koristio veće tipove podataka za neke varijable nego kad si koristio individualne varijable, možda si neke privatne varijable izvukao van iz funkcija pa su one postale globalne. Istraži, usporedi.
Nisam dirao druge funkcije.
Malo sam guglao, kažu da array zauzima više jer sadrži pod varijable ili kako da to nazovem već.
uint32_t states[4] = {
1, // STATE_SCREEN_STATUS
0, // STATE_HEADLIGHT
0, // STATE_FOG_LIGHT
0 // STATE_SCREEN_INFO
};
Cemu tu uint, pogotovo jos 32, tu je boolean dovoljan, odnosno byte posto nema razlike u memoriji
Na AVG statsima mozes ustediti memorije na nacin da ih racunas direktno kod ispisa, a ne za svaku imati varijablu(samo total/time).
Nemam bas previse vremena, ali ovo mi je upalo u oko brzinskim pregledom.
Ispravio sam to, i sad je razultat ovakav
Sketch uses 26,414 bytes (86.0%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,742 bytes (85.1%) of dynamic memory, leaving 306 bytes for local variables. Maximum is 2,048 bytes.
Uglavnom, hvala ti na prijavi, nisam vidio da sam slučajno tu upisao 4 bajtu varijablu.
Ova sitna razlika je vjerojatno zato što su neke varijable prije bile 16 bitne a sad su 32 bitne zbog arraya.
Zapravo, još sam se malo igrao haha
Sketch uses 26,214 bytes (85.3%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,738 bytes (84.9%) of dynamic memory, leaving 310 bytes for local variables. Maximum is 2,048 bytes.
Nisi dirao druge funkcije, ali nam nisi dao ni sve bitno za prije/poslije (recimo u prije uopće ne vidimo stanja, odnosno kojeg su tipa), pa je na tebi da istražiž gdje se pogubila memorija.
Ke?
Sketch uses 26,414 bytes (86.0%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,742 bytes (85.1%) of dynamic memory, leaving 306 bytes for local variables. Maximum is 2,048 bytes.
Uglavnom, hvala ti na prijavi, nisam vidio da sam slučajno tu upisao 4 bajtu varijablu.
Ova sitna razlika je vjerojatno zato što su neke varijable prije bile 16 bitne a sad su 32 bitne zbog arraya.
Razlika ti je znači četiri bajta sad. Sam možeš utvrditi na čemu si to izgubio.
Vjerojatno je tako i za C++
https://stackoverflow.com/questions/14337685/php-many-variables-or-one-array
Sad je ovako
Sketch uses 26,214 bytes (85.3%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,738 bytes (84.9%) of dynamic memory, leaving 310 bytes for local variables. Maximum is 2,048 bytes.
Vjerojatno je tako i za C++
https://stackoverflow.com/questions/14337685/php-many-variables-or-one-array
Zašto vjerojatno? Pokazao sam ti kako je.
Jer sam taj link našao prije nego što si stavio taj test.
Uglavnom, kod sam optimizirao dodatno, dodao onda još neke stvari i sad sam pun.
ROMa imam nešto simbolično, a ako RAM pređe 90% krene ekran zezat.
Stoga ako netko zna neku pločicu dimenzija kao Arduino Nano(a da full radi s Arduinovim kodom), i da ima više od 32kB/2kB, neka napiše.
Imam još neke sitnice za optimizirat, no opet nije dovoljno. Odustao sam od jednog dijela zbog kojeg bi trebao napraviti dva dizajna ekrana, no onda bi nastali probleni zbog RAMa.
Jedino što sam vidio a da nije teški overkill je ova pločica
Po dimenzijama je nešto veća od Nanoa, jedini problem je taj što u specifikacijama ne piše dali ima EEPROM i koliko kB-ova
Također ni potrošnja ne piše.
https://store.arduino.cc/genuino-101
Također i ova bi mogla doći u obzir.
Mislim da sam ti to već jednom navodio. Nemaš bezbolnih rješenja:
- umjesto Adafruitovih grafičkih biblioteka koristiti u8g lib
- koristiti Pri Micro (ima pola kilobajta RAM-a više od Nanoa) uz neki port ekspander (ima i verzija Pri Micra su više pinova, poput ove, samo što je bezvezno skupa), ili STM32 pločicu
- dodati goli 328 čip, uz nekoliko popratnih komponenti, koji će ti služiti isključivo za ispis sadržaja na ekran
Mislim da sam ti to već jednom navodio. Nemaš bezbolnih rješenja:
- umjesto Adafruitovih grafičkih biblioteka koristiti u8g lib
- koristiti Pri Micro (ima pola kilobajta RAM-a više od Nanoa) uz neki port ekspander (ima i verzija Pri Micra su više pinova, poput ove, samo što je bezvezno skupa), ili STM32 pločicu
- dodati goli 328 čip, uz nekoliko popratnih komponenti, koji će ti služiti isključivo za ispis sadržaja na ekran
Najviše mi se sviđa opcija s promijenom GFX liba.
No, dal znaš koliko u8g lib koristi manje RAMa od Adafruitovog?
Imam 2000 linija i ne bih želio prebacivati sve na taj lib a da ušteda ne bude značajna.
Najviše mi se sviđa opcija s promijenom GFX liba.
No, dal znaš koliko u8g lib koristi manje RAMa od Adafruitovog?
Imam 2000 linija i ne bih želio prebacivati sve na taj lib a da ušteda ne bude značajna.
Realno 2000 linija koda nije puno, a sad ovisno o strukturi tvojeg programa ovisi kolko ce ti trebati za zamjenu.
Ako je kod dobro strukturiran, to je jako malo posla.
Pod dobra struktura mislim ako nemas puno koda koji se ponavlja.
Jos jedna stvar je da nades zamjensku naredbu ili skup naredbi i onda samo vadis parametre iz starog koda i upisujes u novi.
Ja u slucajevima kad mi je kod neefikasan najcesce idem iz pocetka(jedino u vecim programima prvo lociras koji dio koda je neefikasan), kolko god on imao linija.
U takvim slucajevima jako pomaze dobar IDE s kvalitetnim dopunjavanjem.
Pogledao sam usporedbe na Youtubeu za ta dva liba, jeste Adafruitov sporiji u osvježavanju i koristi viša RAMa i ROMa, al zato ljepše izgleda.
Mislim da ću na kraju ostavit sve kako je.
Vidi što Austrijanci rade - mjere na kojoj udaljenosti automobili zaobilaze bicikliste. To je jedan od senzora koji bi možda i ti mogao dodati...
Vidi što Austrijanci rade - mjere na kojoj udaljenosti automobili zaobilaze bicikliste. To je jedan od senzora koji bi možda i ti mogao dodati...
To mi je već prijatelj predložio, al nema se pinova ni ROMa.
A iskreno i ne znam di bi na ekran stavio tu informaciju
STM32 je pun pinova i memorije, a i procesorske snage.
Mozda uzeti ako ima neki malo veci ekran?
Nisam bas previse radio s OLEDima tako da ne znam dal postoji za prihvatljivu cijenu.
Ako trenutno imas 0.96, postoji 1.3 koji je osjetno veci:(samo je pitanje dal zbog rezolucije mozes smanjiti slova)
https://www.google.hr/search?q=1.3+oled+0.96&tbm=isch&source=iu&ictx=1&fir=xwLnaUk_F5h_zM%253A%252CjxUYB7Sd31f92M%252C_&usg=__8x19eirYQ8OFL4zVK6Rf0TchSwU%3D&sa=X&ved=0ahUKEwjQuYjpqOLXAhWB6qQKHcbdDJgQ9QEIJzAA#imgrc=JK1oVIHeTcGB5M:
a postoji i 2.42 koji je ogroman, ali je i 20ak dolara.
Džabe što je veći ekran kad je ista rezolucija
Misliš na ovu pločicu?
Džabe što je veći ekran kad je ista rezolucija
Misliš na ovu pločicu?
https://www.ebay.com/itm/1pcs-STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-Arduino/201414966215?epid=10003269727&hash=item2ee5447bc7:g:X-oAAOSw6BtVVACk
Da, to je to.
Samo imaj na umu da ce ti trebati prvo jedan dan da si poslozis software i sve sitnice da ta plocica uopce proradi, ali kad proradi onda nema bolje za tu lovu.
Stoga ako netko zna neku pločicu dimenzija kao Arduino Nano(a da full radi s Arduinovim kodom), i da ima više od 32kB/2kB, neka napiše.
Wemos mini sa ESP8266 12E modulom. 32 bitni procesor na 80 Mhz (ili 160 ako kloknes), 4 MB (megabajta) flasha, arduino kompatibilan
i radi na 3.3V kao i sva ostala elektronika, i najbitnije, ima WiFi.
Treba pazit samo sa ebaya, klon koji sam narucio imao je preslabo napajanje pa sam morao dodati linearni regulator na plocicu. Inace sve 5.
5V tolerant je, ali sami čip radi na 3.3.
Malo pinova? Da, šteka na tom polju. Koliko ti GPIOa treba?
Osobno ga uparim sa golom 8Mhz atmegom8/328 gdje je esp mozak i mrežna komunikacija, a atmega mišići.
P.S. Izbaci ekran i šalji podatke na mob
Bok, narucio sam si arduino set za pocetnike, i sad isprobavam razne projekte, i imam jedan problem kojeg neznam riješiti. Naime imam zadatak da recimo ako se na jednom pinu ocita LOW stanje (ulaz), da ona pocne nekakav brojac brojati, recimo do dvije sekunde, i nakon toga ucini par naredbi, kako bi se to izvelo sa funkcijom milis(), ako moze da mi neko objasni. A ako nebude LOW stanje dovoljno dugo za tih 2 sekunde da se ponovo resetira i tako svaki put sve dok LOW nebude " sekunde i tad tekar ispuni ostale naredbe.
Bok, narucio sam si arduino set za pocetnike, i sad isprobavam razne projekte, i imam jedan problem kojeg neznam riješiti. Naime imam zadatak da recimo ako se na jednom pinu ocita LOW stanje (ulaz), da ona pocne nekakav brojac brojati, recimo do dvije sekunde, i nakon toga ucini par naredbi, kako bi se to izvelo sa funkcijom milis(), ako moze da mi neko objasni. A ako nebude LOW stanje dovoljno dugo za tih 2 sekunde da se ponovo resetira i tako svaki put sve dok LOW nebude " sekunde i tad tekar ispuni ostale naredbe.
loop(){
timer=millis():
while(timer-millis()<2000){
timer=millis();
while(button==LOW){
}
}
//ostatak programa, program se izvrsava tek nakon sto pustis tipku
}
loop(){
timer=millis():
while(timer-millis()<2000){
timer=millis();
while(button==LOW){
if(timer-millis()>2000){
break;
}
}
}
//ostatak programa, nastavlja se u trenutku kad je tipka pritisnuta tocno 2 sekunde
}
Hvala zasad, sutra cu valjda probati to pa javim reakcije
Neznam jesam dobro objasnil, znaci ako je low da mi pocne brojat, to znaci da kad je low i on broji i nakon 2 sekunde recimo i dalje je low, da mi nakon toga na neki pin posalje signal, znaci samo ako je na tom ulazu dvije sekunde low, tek tada da ide dalje sa programom
Nisi ti to baš najbolje opisao. Rekao bih da drugi primjer kolege CroNk3ra odgovara onome što si tražio (kad bi se debuggirao). Na tragu tog primjera:
void loop(){
unsigned long timer = millis();
while(millis() - timer < 2000){
if (digitalRead(pinButton)) timer = millis();
}
//ostatak programa, nastavlja se u trenutku kad je tipka pritisnuta tocno 2 sekunde
}
Nisi ti to baš najbolje opisao. Rekao bih da drugi primjer kolege CroNk3ra odgovara onome što si tražio (kad bi se debuggirao). Na tragu tog primjera:
void loop(){
unsigned long timer = millis();
while(millis() - timer < 2000){
if (digitalRead(pinButton)) timer = millis();
}
//ostatak programa, nastavlja se u trenutku kad je tipka pritisnuta tocno 2 sekunde
}
Da mozda sam krivo opisal, ispricavam se. Dakle probat cu još jednom, taj digitalni pin stalno ide iz HIGH u LOW, i sad sam za stanje HIGH postavio uvjet i program radi, eee sad glavnina je ta da pošto on prelazi iz HIGH u LOW stalno, program treba brojati vrijeme tek onda kada LOW stanje ostane, cilj je da se nakon sto LOW stanje ostane duze od 2 sekunde da se nakon toga ispuni daljnja radnja, ostatak programa, znaci prebacuje se svo vrijeme ali tajmer se svaki put resetira jel nije toliko dugo LOW stanje, nakon kaj prestane sa tim prebacivanjem i ostane u LOW, ako je to stanje duze od 2 sekunde tek nakon toga da nastavi program dalje. Jesam sad bio malo jasniji
Znači:
1. Ulaz ti pliva između HIGH i LOW (zašto ne koristiš PULLUP otpornik pa bi ti ulaz bio po defaultu HIGH, kao što se to uobičajeno koristi s gumbima, pa ti ulaz ne bi plivao? znači, kod podešavanja pina u setupu umjesto INPUT staviš INPUT_PULLUP)
2. Kad stisneš gumb, on ulaz spoji na LOW
3. Program provjerava ulaz i ne pušta program dalje sve dok se gumb ne drži pritisnut dvije sekunde.
Jel to to? Moj program upravo to radi. Možda je malo teži za skužiti kako točno radi, ali upravo to radi - ne pušta dalje sve dok netko ne drži gumb pritisnut dvije sekunde.
Znači:
1. Ulaz ti pliva između HIGH i LOW (zašto ne koristiš PULLUP otpornik pa bi ti ulaz bio po defaultu HIGH, kao što se to uobičajeno koristi s gumbima, pa ti ulaz ne bi plivao? znači, kod podešavanja pina u setupu umjesto INPUT staviš INPUT_PULLUP)
2. Kad stisneš gumb, on ulaz spoji na LOW
3. Program provjerava ulaz i ne pušta program dalje sve dok se gumb ne drži pritisnut dvije sekunde.
Jel to to? Moj program upravo to radi. Možda je malo teži za skužiti kako točno radi, ali upravo to radi - ne pušta dalje sve dok netko ne drži gumb pritisnut dvije sekunde.
ne pliva, znam ja za pullup i pulldown otpornike, nije to kaj trazim, opisal sa gore