(01-01-2021, 23:33)Marecki napisał(a): Witam serdecznie i chcę poprosić o pomoc w poprawieniu kodu, jestem bardzo początkującym programistą Arduino i prawdę mówiąc to mój pierwszy projekt który piszę używając przykładów z internetu. Przez co kod jest mało optymalny i niestety doszedłem do ściany bo skończyło się miejsce w pamięci . Niestety na tym etapie nie umiem sobie z tym poradzić samodzielnie. Jeśli więc ktoś mógłby zerknąć na moje dzieło, byłbym bardzo wdzięczny.
Chciałbym aby ten program działał na Arduino UNO.
na początek użyj w Serial.print i lcd.print makro F !!! Zastąp wszędzie (ale tylko te gdzie jest tekst w cudzysłowiu " ", nie gdzie zmienne !!! chodzi o to :
zamiast tak : Serial.println("Writing headers to csv.txt");
z makrem : Serial.println(F("Writing headers to csv.txt"));
podobnie tutaj: lcd.print("no SD card");
z makrem tak: lcd.print(F("no SD card"));
oszczędzisz sporo bajtów pamięci RAM, Dołączam mój kod który demonstruje użycie pamięci programu (PROGMEM) oraz funkcja do monitorowanie wolego RAMU. Jeśli zrobisz sobie tak komunikaty, w pamięci programu nie w RAM to na taką ilość tego co masz w kodzie wyjdzie z 500bajtów, dostęp jest utrudniony ale przykład dobrze ilustruje. New() i delete() możesz sobie na początek darować, po prostu twórz statycznie bufor i do niego kopiuj.
PROGMEM, NEW & DELETE
Kod:
// --- funkcja wyświetla ilość wolnej pamięci dynamicznej RAM -----------------------------------------
void freeRAM()
{
extern int __heap_start, *__brkval;
int v;
Serial.print(F("Wolna pamiec [bajty] : "));
Serial.println( (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval) );
}
// --- komunikaty zapisane w pamieci programu --- definiujemy jako const char [] PROGMEM ----------
const char msg_00 [] PROGMEM = "Nie mozna pozyskac tej wiadomosci! Nie istnieje.";
const char msg_01 [] PROGMEM = "Hello, twoje Arduino zostalo uruchomione";
const char msg_02 [] PROGMEM = "Komunikaty ktore widzisz zostaly zdefiniowane z pamieci programu";
const char msg_03 [] PROGMEM = "Dzieki takiemu rozwiazaniu w RAM masz wiecej wolnej pamieci";
const char msg_04 [] PROGMEM = "Dostep do tych napisow trzeba wydobyc z pamieci programu";
const char msg_05 [] PROGMEM = "Nie jest to trudne, a oszczednosci olbrzymie";
// --- tablica ulatwiajaca wybor odpowiedniego komunikatu ----------------------------------------
const char * const wiadomosc [] PROGMEM = { msg_00, msg_01, msg_02, msg_03, msg_04, msg_05 };
// --- funkcja wyciągająca napis z tablic msg_xx -------------------------------------------------
void EkstrakcjaWiadomosci(byte nr_wiadomosci)
{
// musimy sprawdzic czy nr_wiadomości do wyłuskania z pamięci RAM nie jest
// już poza tablica wiadomosc [] - zabezpieczamy się przed błędem :-)
if( nr_wiadomosci >= sizeof (wiadomosc) / 2 )
{
char *bufor = new char [ strlen_P( pgm_read_word (& wiadomosc[0] ) ) ]; // dynamiczny przydział pamięci bufora
strcpy_P ( bufor, (char*) pgm_read_word (& wiadomosc[0] )); // kopiujemy z pamięci msg: error do bufor
TypeWriter( bufor, 50 ); // drukujemy komunikak błędu na ekran
freeRAM(); // wolna pamięć - bufor jeszcze istnieje
delete bufor; // kasujemy bufor z pamięci
freeRAM(); // wolna pamięć - bufor już nie istnieje
}
// numer wiadomości do wyświetlenia jest w tablicy (zmienna musi mieć wartość 1,2,3,4,5)
// wiadomosc nr. 0 to nasz komunikat o błędzie, oczywiście dostęp do niej przez podanie 0
else
{
char *bufor = new char [ strlen_P( pgm_read_word (& wiadomosc[nr_wiadomosci] ) ) ];
strcpy_P ( bufor, (char*) pgm_read_word (& wiadomosc[nr_wiadomosci] ));
TypeWriter(bufor, 50);
freeRAM(); // wolna pamięć - bufor isnieje w RAM
delete bufor; // kasujemy bufor z pamięci
freeRAM(); // wolna pamięć - bufor już nie istnieje
}
}
// --- Serial Type Writer by PowerTGS -------------------------------------------------------------
// jako wejście otrzymuje adres tablicy znaków [] i czas opóźnienia wyświetlenia jednego znaku
void TypeWriter(const String & message, unsigned int wait)
{
for(const char c : message)
{
Serial.write(c);
delay(wait);
}
Serial.write("\n");
}
// --- SETUP ------------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
EkstrakcjaWiadomosci(1);
EkstrakcjaWiadomosci(2);
EkstrakcjaWiadomosci(3);
EkstrakcjaWiadomosci(4);
EkstrakcjaWiadomosci(5);
EkstrakcjaWiadomosci(6); // wiadomosc 6 nie istnieje, sprawdzmy co się stanie
}
void loop()
{
// put your main code here, to run repeatedly:
}