Ottimizzazione Display

ciao di nuovo a tutti,

per far posto a tutta la parte delle stringhe classiche per la connessione alla esp, se rende necessario anche dare una bella ottimizzata anche alla parte della stampa su display che pesa ben il 13% della memoria totale del codice e il 4% di memoria RAM... ho ridotto al minimo le info da stampare a display, ma spero si possa fare meglio....

inoltre sposterò i caratteri fissi nel setup senza doverli ristampare ogni volta, ma non so se c'è un modo per risparmiare spazio soprattutto...

si accettano consigli!!! :slight_smile:

ps: è talmente lungo che nemmeno entra nel post.... :confused:

display.txt (10.7 KB)

quello che hai postato è una parte del programma...quindi difficile dare suggerimenti per migliorarlo.
quello che posso dire è che sulle singole lettere invece di usare i doppi apici usa i singoli...cioè da

      lcd.print("W");

a

      lcd.print('W');

qualcosa dovrebbe fare

Conosci il metodo che al solito Serial.print("Benvenuto") puoi utilizzare la forma Serial.print(F("Benvenuto")).
In questo modo la stringa va ad occupare la memoria riservata al codice e non alla Ram.

ORSO2001:
quello che hai postato è una parte del programma...quindi difficile dare suggerimenti per migliorarlo.
quello che posso dire è che sulle singole lettere invece di usare i doppi apici usa i singoli...cioè da

      lcd.print("W");

a

      lcd.print('W');

qualcosa dovrebbe fare

grazie non sapevo di questa cosa. è già qualcosa...

in rete però ho letto che non è corretto usare i singoli apici ma va usato il doppio... mi spiegate la differenza?

il modo con cui pulisco il display prima di riscriverci sopra, è il modo migliore secondo voi?

grazie

con i singoli apici definisci una variabile di tipo char; con i doppi apici definisci una stringa costante...dipende sempre da cosa devi fare...però in questo caso, quando usi un solo carattere, penso sia meglio usare i char.

in aggiunta...essendo due cose diverse (char e constant string) sicuramente vengono invocati due metodi diversi della .print()...magari anche i due metodi diversi occupano memoria diversa.

Per quanto mi è dato di sapere i doppi apici si usano per definire una stringa che ha come terminatore uno zero finale ("\000"), quasi sempre sotto inteso in quanto sarà il compilatore ad aggiungerlo.
Una stringa di fatto è un array di char e per manipolarla si utilizzano le funzioni .

Il singolo apice, utilizzato per delimitare un singolo carattere, serve più come rappresentazione numerica, del tipo:

int a = 65; // valore ASCII del carattere 'A'
int a = 0x41;
int a = 'A';

if (a == 'A') .......; //viene eseguita quando a=65

switch (a) {
case 'A':
//viene eseguita quando a=65
break;
}

Si potrebbe dire che doppio o singolo sono due metodologie di utilizzo a se stanti.

Tante righe per poco:

    if (valorestatopioggia < 9) {

      lcd.setCursor(1, 1);

      lcd.print(valorestatopioggia);

      lcd.setCursor(2, 1);

      campovuoto();

    }
    else {

      lcd.setCursor(1, 1);

      lcd.print(valorestatopioggia);
    }

Non è la stessa cosa fare?

    lcd.setCursor(1, 1);

    lcd.print(valorestatopioggia);
    if (valorestatopioggia < 9) {
      lcd.setCursor(2, 1);
      campovuoto();

    }

stessa cosa per if (Rotations < 9) if (Tpercepita8 < 10.00) if (WindSpeed < 10.00)

cacchio grazie!!!

  button = Ing_avv && ing_sen && ing_mar && ing_cand && ing_olio;
  if (button == LOW) {           //se tutte e 5  sono vere 1

Button puo essere una variabile locale bool. 1 byte risparmiato!!
P.S. te e pippero1979 state facendo la stessa cosa!! Strano!! Come è possibile?

 Ing_avv && ing_sen && ing_mar && ing_cand && ing_olio;

cosa vuol dire sta roba?

P.S. te e pippero1979 state facendo la stessa cosa!! Strano!! Come è possibile?

chi è pippero? boh... anche lui con display da sistemare?

Va bene che stiamo chiusi dentro casa, ma se facevi un file .zip con tutto il programma mi risparmiavi di dovermi copiare tutte le variabili dai messaggi d'errore... :slight_smile:

Comunque, vedo che usando variabili byte sono 2750 byte(8%) di flash e 57 byte (2%) di RAM, usando gli apici singoli per i caratteri singoli.

Scrivendo un po' diversamente il codice, rendendolo anche più compatto, è possibile vedere che c'erano degli lcd.setCursor ripetuti nell'else. Mi sembra, però, che il compilatore sia abbastanza furbo da notarli e metterli prima dell'if, perché mi sembra che l'occupazione di memoria non sia diminuita! :slight_smile: Mi sa che converte anche i doppi apici in apici singoli...

sketch_mar21a.zip (2.36 KB)

P.S. te e pippero1979 state facendo la stessa cosa!! Strano!! Come è possibile?

sono io che sono strano, ho confuso due post!!!

Mi spieghi che cosa fa questo?

  lcd.write(4);

eccolo Datman, lo trovi in allegato.

cmq con la tua parte di display passo da:

mio

Lo sketch usa 19966 byte (64%) dello spazio disponibile per i programmi. Il massimo è 30720 byte.
Le variabili globali usano 666 byte (32%) di memoria dinamica, lasciando altri 1382 byte liberi per le variabili locali. Il massimo è 2048 byte.

tuo

Lo sketch usa 19902 byte (64%) dello spazio disponibile per i programmi. Il massimo è 30720 byte.
Le variabili globali usano 650 byte (31%) di memoria dinamica, lasciando altri 1398 byte liberi per le variabili locali. Il massimo è 2048 byte.

codice.txt (57 KB)

lcd.write(4); è un carattere personalizzato, anche se non vedo i createChar nel setup.
Certo che con tutte quelle righe vuote non si finisce più di scorrere!

Datman:
lcd.write(4); è un carattere personalizzato, anche se non vedo i createChar nel setup.
Certo che con tutte quelle righe vuote non si finisce più di scorrere!

non sono nel setup, li messi subito dopo la dichiarazione delle variabili

byte frecciasu_1[8] = {

  B00100,

  B01110,

  B11111,

  B00100,

  B00100,

  B00100,

  B00100,

  B00100,

};

// CARATTERE SPECIALE FRECCIA IN GIU’

byte frecciagiu_2 [8] = {

  B00100,

  B00100,

  B00100,

  B00100,

  B00100,

  B11111,

  B01110,

  B00100,

};

// CARATTERE SPECIALE Tenda aperta

byte Taperta_1A[8] = {

  B11111,

  B11111,

  B00000,

  B00000,

  B01110,

  B10001,

  B11111,

  B10001,

};

byte Tchiusa_1A[8] = {

  B11111,

  B11111,

  B11111,

  B10001,

  B10111,

  B10111,

  B10001,

  B11111,

};

// CARATTERE SPECIALE GOCCIA

byte GOCCIA_1[8] = {

  B00000,

  B00100,

  B00100,

  B01110,

  B11111,

  B11111,

  B11111,

  B01110,

};

anche se non vedo i createChar nel setup

Confermo che non ci sono.

non sono nel setup

CreateChar

sono direttamente nel loop... mi sembra di capire che è sbagliato metterli li...

ad esmepio:

lcd.createChar(3, GOCCIA_1); si trova subito dopo millis per l'aggiornamento del display

 if ((millis() - t1) > 1000) {

    t1 = millis;

    lcd.createChar(3, GOCCIA_1);

    lcd.setCursor(0, 1);

    lcd.write(3);

Non devi farlo ogni volta, a meno che siano più di otto: in tal caso, alcuni devi alternarli secondo le necessità.

ok grazie... il fatto di riscriverlo ogni volta immagino abbia un impatto sulla RAM... ?