enrico24:
ho controllato tutti i collegamenti, cambiato i PIN di Arduino (un Mega), provato a cambiare scheda ma senza alcun risultato: non mi da il decimo valore, in pratica sulla seriale "vedo" la 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', ''i' ma NON la 'n'.
Dunque, intanto non è chiaro (perché non lo hai spiegato) come mai gli array abbiano dimensioni diverse, se poi usi l'indice di sequenziale[] trovato per indicizzare significato[].
Di fatto però, esaminando il codice, immagino che tu voglia vedere la 'i' quando nessun pulsante risulta premuto (in questo caso la variabile i varrà SIZESEQ cioè 10 ossia l'undicesimo elemento di significato[]).
Il codice dovrebbe mostrare l'ultimo elemento dell'array (la 'i') ogni secondo quando nessun pin è selezionato. Perché parli della 'n' quando il problema è forse la 'i'?
Detto questo, diciamo che comunque il codice non mi convince per due ragioni:
-
tu hai quel delay(1000) quindi il controllo dei pin lo una volta al secondo, e se non premi nulla dovresti ricevere sulla seriale una 'i' ogni secondo, è questo che vuoi che faccia?
-
il controllo dei pin lo fai con:
if (digitalRead (sequenziale[i]) == 0)
Intanto è meglio in genere usare LOW o HIGH per evidenziare la cosa, quindi:
if (digitalRead (sequenziale[i]) == LOW)
Ma dato che quindi per te è premuto quando è 0 ossia LOW, significa che i pin sono in pullup? Ossia confermi di averli collegati con una resistenza in pullup?
Quando si parla di un progetto, è sempre bene postare, oltre al codice, anche lo schema (o almeno una descrizione completa dei collegamenti). Per dire, quello cos'è un selettore/commutatore? Come lo hai connesso?
Quindi secondo me se vuoi avere i pin in configurazione pullup, questo codice ti funziona meglio (ed evita le resistenze di pullup esterne):
// Sequenziale
#define SIZESEQ 10 //Il numero di posizioni presenti
const byte sequenziale [SIZESEQ] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40}; //I pin a cui sono collegati
const char significato [SIZESEQ + 1] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'n', 'i'}; //L'insieme dei valori da trasmettere
void setup() {
for (byte i = 0; i < SIZESEQ ; i++)
pinMode(sequenziale[i], INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// controlla la posizione dell'interruttore sequenziale
byte i;
for (i = 0; i < SIZESEQ; i++)//I va da 0 a 9
{
if (digitalRead(sequenziale[i]) == LOW)
break;//Ma si ferma se sento pulsante
}
Serial.println (significato[i]);
delay(1000);
}
PS: a me quel codice funziona come atteso, ossia l'elemento in più dell'array significato[] lo vedo quando nessun pin è premuto...