Char array su lcd

Ciao a tutti

Devo scrivere su lcd le note musicali in corrispondenza a una variabile numerica. Ho due alternative:

  • usare un array di tipo char bidimensionale di 5 caratteri (Do , Do# , ..., Sol#) per 12 nomi (7 note e relative alterazioni).
  • usare uno switch/case con i 12 nomi.

Nel secondo caso è elementare; se volessi, invece, usare l'array, quale è il modo corretto per visualizzare un elemento dell'array char?

Grazie
Gianluca

Finalmente ho ritrovato una vecchia discussione. Mi conviene, però, lo switch, perché lo uso anche per definire le frequenze.

Non so se ho ben capito la cosa... Ma tu in ingresso cosa hai? Un indice intero (da 0 a 11) della nota? Perché in tal caso la risposta è banale:

char nota[12][5] = { 
  "Do  ", "Do# ", "Re  ", "Re# ", "Mi  ", "Fa  ",
  "Sol ", "Sol#", "La  ", "La# ", "Si  "
};
...
  lcd.print(nota[i]):

(nota gli spazi, per poter cancellare i precedenti caratteri).

E' questo che intendevi?

Sì! :o È esattamente come avevo scritto!
Sono terrorizzato dagli array di char, perciò non credevo che fosse banale... :slight_smile:
Si complica un po' volendo usare PROGMEM, vero?

Datman:
Si complica un po' volendo usare PROGMEM, vero?

Visto che la sto usando nel mio progetto corrente, mi trovi preparato... spero :slight_smile:

const PROGMEM char nota_0[] = "Do  ";
const PROGMEM char nota_1[] = "Do# ";
const PROGMEM char nota_2[] = "Re  ";
const PROGMEM char nota_3[] = "Re# ";

const char * const nota[] PROGMEM = {
  nota_0,
  nota_1,
  nota_2,
  nota_3
};

void setup() {
  Serial.begin(9600);
  for (byte i = 0; i <4; i++ ){
    char buffer_nota[5];
    //copia il contenuto dell'area di memoria flash nell'array buffer_nota
    strcpy_P(buffer_nota, (char*)pgm_read_word(&(nota[i])));
    Serial.print("=> "); Serial.println(buffer_nota);    
  }
}

//ottieni
//=> Do  
//=> Do# 
//=> Re  
//=> Re#

Per i dettagli ti allego un documento ricevuto dal solito spacciatore :slight_smile: e naturalmente il link al reference del avr/pgmspace.h

Federico

Progmem.pdf (182 KB)

Grazie, Federico! Adesso sto andando avanti con il lavoro (è un doppio generatore, con modulo GPS per fornire frequenze campione da 0 a 16MHz e DDS per fornire segnali sinusoidali da 0 a 55MHz a impostazione cifra per cifra tramite encoder, incremento a passo variabile, terzi di ottava in banda audio, note musicali da Do 0 a Do 11 e sweep tra frequenze arbitrarie tra 0 a 55MHz lineare o logaritmico), ma lo leggerò volentieri. :slight_smile:

Datman:
Adesso sto andando avanti con il lavoro...

Non ho capito una mazza, ma ti credo :slight_smile: :smiley: ;D

Federico

E' un apparecchietto con un modulo GPS che genera segnali a onda quadra di frequenza molto precisa e un modulo DDS che genera segnali sinusoidali a bassissima distorsione.

Cerca in rete perché ricordo di aver letto che il segnale del GPS è preciso sul lungo periodo ma sul corto ci sono ogni dei jitter.

Sì, grazie. Mi sono già documentato. Se volessi la massima precisione, per circa 80€ potrei acquistare un apparecchietto già fatto con il PLL, ma per verificare e tarare un frequenzimetro ogni tanto ho visto che va benissimo così com'è, anche per il Racal Nanoseconds counter 1991, che misura i millesimi di Hertz... :slight_smile:
Piuttosto, per avere poco jitter bisogna impostare il modulo GPS per frequenze sottomultiple di 48MHz, che è l'oscillatore interno, altrimenti per ottenere la frequenza richiesta ogni tanto toglie un impulso.