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…