PROGMEM e anomalie nello sketch

Ciao a tutti,
avrei bisogno di un aiuto per comprendere meglio l'utilizzo del modificatore PROGMEM.
Il mio progetto è uno slider fotografico: 2 stepper per gestire gli assi, un servo, un display LCD e Arduino UNO.
Per risparmiare spazio, ho deciso di salvare tutti i testi che utilizzo per il display con il PROGMEM;
da qui iniziano i dolori!
I testi funzionano alla grande, mentre il resto dello sketch si comporta in maniera anomala fallendo condizioni o richiamando valori errati delle variabili.
Vi riporto un esempio.
Premessa:

  • Per gestire lo scorrimento del menu utilizzo la routine "impostaMenu" che di fatto, in base al menu visualizzato imposta il numero di pagine visualizzabili. Questa routine viene chiamata ESCLUSIVAMENTE quando sono nel menu e sto scegliendo le varie opzioni.

  • Quando avvio il ciclo automatico, in base alle impostazioni dello slider calcolo la velocità di rotazione dell'asse A (speedA) e stampo a video il suo valore.

Come potete vedere in questa schermata il valore di speedA è correttamente calcolato (-2.62)

Ma... Se commento il comando Serial.print nella routine "impostaMenu", allora il calcolo della velocità è completamente errato (0.0)

Questo tipo di problemi lo riscontro tutte le volte che utilizzo il PROGMEM, quindi inizio a pensare che sia il modo in cui scrivo il vero problema.
Qualcuno sa darmi informazioni a riguardo?
Grazie a tutti

displayLCD.ino (5,4 KB)
movimenti.ino (11,4 KB)
setting.ino (15,2 KB)
slider.ino (6,4 KB)

Intanto, dalle slides che vedo, ti dico che sarebbe meglio usare un IDE standard e stabile (1.8.16) e NON una versione beta che ha ancora un sacco di bugs (la 2 è in beta e ... ci vorranno anni prima che raggiunga il livello delle attuali releases).

Detto questo, ti lascio un documento da studiare bene che ti chiarirà un po' l'uso di progmem : Progmem.pdf (182.5 KB)

Guglielmo

Ciao Gugliemo e grazie per la risposta.
Anch'io avevo il dubbio sull'ide 2.0 e ho provato a compilarlo e caricarlo con la ide 1.8 ma il risultato non cambia. Domani leggerò il documento che mi hai condiviso.
Grazie e buona serata

Ciao Guglielmo, ho letto il pdf che mi hai girato, davvero interessante! Devo leggere meglio la libreria per capire davvero le sue potenzialità :blush:
Tornando ai comportamenti anomali dello sketch, un utente sul gruppo Facebook mi ha fatto notare questa funzione richiamata ogni volta che carico un testo


void scriviSuLCD(byte riga, const char *line) // ruotine per la stampa dei testi sul display LCD
{
  char buffer[16]; // buffer di appoggio per i testi
  strcpy_P(buffer,line);
  lcd.setCursor(0,riga); // imposto la posizione del cursore
  lcd.print(buffer); // stampo su LCD il testo
}

Mi ha consigliato di modificare la dimensione di buffer da 16 a 17.
Il problema è sparito e tutto sembra funzionare correttamente.
Vorrei però una tua opinione a riguardo in modo da essere più sicuro e non dover testare il codice ogni volta che scrivo 3 righe

Tutte le stringhe che hai definito all'inizio sono da 16 caratteri "utili". Però devi prevedere lo spazio per il terminatore che quindi diventa il 17° carattere.

Grazie del contributo :blush:
Non sai quanto fosse diventato stressante scrivere il codice :sweat_smile: