Stránka 1 z 2
Předání polí funkci.
Napsal: 27 dub 2018, 09:06
od rejze69
Zdravím. Ve svém projektu jsem si potřeboval zjednodušit ovládání lcd a taky ušetřit místo ve flash a tak jsem to napsal takhle.
Volání funkce:
Kód: Vybrat vše
byte col[]={2,6,0,15,0};// pole sloupcu LCD
byte row[]={0,1,3,3,2};// pole radku LCD
String val[]={"Dnes je " +((String)dny[Clock.getDoW()]),txtDatumCas,"pradlo","dalsi",
(String)((float)pressure /100) + " Bar "};// pole hodnot LCD
Display(5, col, row, val);// volame fci obsluhy displeje dle zadanych parametru
Tělo funkce:
Kód: Vybrat vše
//----Funkce obsluhy displeje--------------------------------------
// pb pocet zobrazovanych bloku
// setCursor: co[] znak na radku, ro[] radek displeje
// va[] zobrazovane hodnoty
void Display(byte pb, byte co[], byte ro[], String va[]) {
for(int i = 0; i < pb; i++) {
LCD.setCursor(co[i],ro[i]);
LCD.print(va[i]);
}
}
Chtěl jsem se zeptat,jestli jde naplnit funkci ta pole,aniž bych musel před voláním deklarovat omocná pole.
Díky za případnou radu.
Re: Předání polí funkci.
Napsal: 27 dub 2018, 10:23
od AstroMiK
Jestli máš volno v EEPROM, tak by možná šlo něco ušetřit zápisem těch souřadnic někam do EEPROM (například od adresy 0).
Nejdřív by se vytvořil jednoduchý zapisovací program, který by jen jednou při spuštění zapsal data do EEPROM.
Kód: Vybrat vše
void setup(void)
{
delay(10000); // 10 sekund pauza po zapnutí napájení
EEPROM.write(0,2); // sloupce
EEPROM.write(1,6);
EEPROM.write(2,0);
EEPROM.write(3,15);
EEPROM.write(4,0);
EEPROM.write(5,0); // řádky
EEPROM.write(6,1);
EEPROM.write(7,3);
EEPROM.write(8,3);
EEPROM.write(9,2);
}
Pak by se se tenhle program přepsal tím tvým velkým programem (hodnoty v EEPROM by ale zůstaly).
A při zobrazovaní na displeji by se pak ty souřadnice braly z EEPROM.
Kód: Vybrat vše
void Display(byte pb, String va[]) {
for(int i = 0; i < pb; i++) {
LCD.setCursor(EEPROM.read(i),EEPROM.read(i+5));
LCD.print(va[i]);
}
Kód se zkrátí, protože odpadne deklarace polí se souřadnicemi, zmenší se počet předávaných parametrů do funkce "Display()", ale na druhou stranu se zase trochu prodlouží o práci se čtením z EEPROM.
Re: Předání polí funkci.
Napsal: 27 dub 2018, 13:41
od rejze69
Díky za odpověď. Těch obrazovek bude víc a nebudou stejný, takže bych musel uložit hodnoty pro všechny případy. To už by bylo nepřehledný a ztratilo by to univerzalnost. Vlastně i takhle mi to při jedný obrazovce na který jsem to zkoušel ušetřilo 2% flash. Moc tomu zatim nerozumim,tak jsem chtěl vědět jestli to nejde ještě zjednodušit.
Re: Předání polí funkci.
Napsal: 27 dub 2018, 16:48
od gilhad
Prosim te, potrebujes usetrit FLASH (cili pamet pro program, radove 32KB), nebo RAM (cili pamet pro data radove 2KB) - v tom druhem pripade doporucuju dat vsechna konstantni data (texty, cisla ...) do PROGMEM (protoze tam tam jsou i ted, jen je program pri spusteni prekopiruje vsechny do RAM. Kdyz je das do PROGMEM, tak je pak tahas podle potreby odtamtud a usetris tak spoustu vzacne RAM, pritom to neda ani moc prace).
https://www.arduino.cc/reference/en/lan ... s/progmem/
Re: Předání polí funkci.
Napsal: 27 dub 2018, 18:35
od rejze69
Se SRAM je to zatim dobrý. Ale paměť programu mám spotřebováno přes 30% a ještě mi toho dost chybí. Proto jsem začal rovnou hledat úspory. Zrovna ta knihovna lcd mi přišla náročná a těch menu a nastaveni ještě pár bude. PROGMEM mám určitě v hledáčku, ale vyvažovat začnu až podle toho, která paměť bude docházet rychleji. Jsem úplný začátečník, takže odhad co bude mám nulový. Vytvářím zavlažovací počítač a čidla budou 2x vlhkost půdy, tlak vody, dešťový senzor a teploměr. Když to půjde, tak ještě průtokoměr a hladinu vody ve studně. Výstup na 3-4 zavlažovací okruhy, spínání čerpadla a nouzový ventil, který v případě nečekaného mrazu, nebo nějaké chyby vypustí vodu zpátky do studny. Takový je plán a výzva a teď to dokázat.

Re: Předání polí funkci.
Napsal: 27 dub 2018, 22:20
od AstroMiK
Se zaplěnými 30 % paměti pro program bych byl úplně v klidu.
Knihovny už máš zavedené a samotný kód pak už tak rychle nepřibývá.
Já si pamatuju, když jsem šetřil opravdu každý bajt, tak se mi vyplatilo třeba místo příkazů
delay(50), které se v kódu několikrát opakovaly, zabalit to do samostatné funkce bez předávaných parametrů:
A když už budeš opravdu v konci, tak máš ještě další rezervu 2kB v bootloaderu, který můžeš smazat a nahrát program do Arduina přes ISP programátor.
Re: Předání polí funkci.
Napsal: 29 dub 2018, 13:05
od gilhad
Mam zabrano prez 29K FLASH a zatim jsem v klidu. Dokud se to do flash vejde, netreba resit uspory (obzvlaste ne na ukor EEPROM, ktera je mala a ma omezeny pocet zapisu), protoze behem provadeni programu se uz do flash nezapisuje a tak ti nedojde misto. Az narazim na limit, tak projdu trochu debugovaci vystupy, zbytecne vyhazim (uz odladeny kod), dlouhe trochu zkratim a zase bude mista dost.
"Predcasna optimalizace je korenem vseho zla"
Re: Předání polí funkci.
Napsal: 30 dub 2018, 14:21
od rejze69
Díky za uklidnění. Teď se tim postupně prokousávám a už to tak nepřibývá. Teď jsem ještě zkoušel různé timery místo millis, kvůli přetečení, ale ty jednoduchý, který jdou používat na místě millis hází chybu už při deklaraci a ty skožitější zas vyžadují přepsat všechno znova. Kupř. zjevně dobrý tasker od pana Stehlíka. Jak moc hrozí chyba z přetečení pokud millis používám na časování procesů do 1000 millis?
Re: Předání polí funkci.
Napsal: 01 kvě 2018, 08:44
od gilhad
Zkus tento, ten s pretecenim pocita (a tedy preteceni nehrozi, pokud je planovany interval mensi nez nejakych 49.7 dni, bez ohledu na to, zda millis samotne behem nej pretecou)
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
millis pretecou jednou za asi dni, pokud bys planoval takhle dlouhe a delsi intervaly, tak to musis resit rozdelenim na nekolik (tedy napr. v cyklu).
https://www.arduino.cc/reference/en/lan ... ignedlong/
unsigned long je 4,294,967,295 (2^32 - 1) milisekund, takze presneji si tech limitnich 49 dni a 17 hodin muzes spocist i sam

Re: Předání polí funkci.
Napsal: 01 kvě 2018, 15:31
od rejze69
O tom limitu 49 dni vím, jen přemýšlím co nastane, když se i ten sekundový cyklus trefí do toho přetečení. Delší intervaly budu plánovat podle RTC. Bohužel ten vychvalovaný DS3231 mne zklamal a za týden se mi předešel o 5 minut. Teď zvažuju jestli koupit ještě jeden kousek, nebo tu odchylku SW kompenzovat.