Errore di array (??)

Buongiorno a tutti, ho un programmino che mi fa impazzire

// 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

char nr6 = 'i'; 

void setup() {

  for (byte i = 0; i < SIZESEQ ; i++)
  {
    pinMode (sequenziale[i], INPUT);
  }

  Serial.begin(9600);
}

void loop() {
  // controlla la posizione dell'interruttore sequenziale
  byte i;
  for (i = 0; i < SIZESEQ; i++)//I va da 0 a 10
  {
    if (digitalRead (sequenziale[i]) == 0) //
      break;//Ma si ferma se sento pulsante
  }
  nr6 = significato[i];
  Serial.println (significato[i]);
  Serial.println(nr6);
  delay(1000);
}

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'.

L'errore deve essere semplice da trovare x chi ha le basi d'informatica ma io proprio non riesco a trovarlo.

Grazie in anticipo per l'aiuto.

Enrico

for (i = 0; i < SIZESEQ; i++)//I va da 0 a 10

... spero che il commento sia sbagliato e tu ti renda conto che quel FOR va 0 a 9 (se un array ha 10 elementi essi vanno da 0 a 9) :wink:

Guglielmo

Programma confuso
Hai i pin in INPUT non INPUT_PULLUP
Però fai un test per basso e non alto
Che abortisce la scansione...
Edit questa frase è errata
Scansione che fai con una variabile locale di pari nomi ad una globale di diverso tipo, che non usi
Chiarisciti le idee e riscrivi il programma
Ma perché due array di dimensione differente?

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:

  1. 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?

  2. 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...

Ma hai verificato con un multimetro la tensione sul pin 40 quando dovrebbe uscirti la n?

È lo stesso selettore che ti dava problemi di risposta settimana scorsa?
Posta lo schema...
Quello ultimo

Che poi...
Perché hai cambiato pin?

Mamma mia quanti problemi!!!

In primis GRAZIE per le risposte.

Veniamo alle spiegazioni:

x maubarzi --> è la prima cosa che ho fatto, ho anche ripassato le saldature!

x Guglielmo --> ho provato a metter un "<=" e un "<11" ma la situazione peggiora.

x Standardoil --> 1. si tratta solo di una frazione del programma globale che non ho postato in quanto troppo lungo … ma se volete ….
2. .. ma che differenza c'è tra "input" e "input_pullup"?

x docdoc --> esatto, con il sequenziale in posizione "0" vedo la 'i', passando in posizione "1" la 'a', "2" la 'b',....,"9" la 'k', "10" la 'i' e non la 'n'.

Il delay(1000) serve solo ad ottenere qualcosa di "leggibile" sulla seriale.

Inserito "INPUT_PULLUP" e "LOW".

Funziona tutto ma non mi sente la 'n'.

Allego l'intero codice (a parte un quanto eccede i caratteri permessi), funziona tutto perfettamente; tenete presente che è stato fatto da un chimico che ha scoperto arduino, il linguaggio C++ e la programmazione solo un paio di anni fa! …. siate quindo clementi.

Saluti

Enrico

CodificaGara_9_8.ino (13.3 KB)

x Standardoil: Si.

Tu nel programma fai due stampe con due ritorni a capo
Non ne esce nessuna? Nemmeno i ritorni a capo vuoti?
Oppure ti esce la 'i' ?

x Standardoil --> ogni secondo sulla seriale mi escono tutte le lettere ad eccezione della 'n' (in funzione della posizione del sequenziale); in posizione neutra la 'i'.

Ma in posizione 'n' cosa esce?

La 'i'.

E il corrispondente led si accende?

enrico24:
x Guglielmo --> ho provato a metter un "<=" e un "<11" ma la situazione peggiora.

Non mi meraviglia e, se hai provato a mettere 11 ... allora NON hai letto bene il mio post ... ::slight_smile:

Guglielmo

Scusa Guglielmo (mi sto cospargendo il capo di cenere) …. da 0 a 9 ci sono 10 posizioni!

X standaroil --> per questo campo non sono previsti led, pro ad inserirne uno "volante".

Metti il selettore in posizione n, lascialo fermo li, non toccarlo più, verifica con il multimetro tutte le tensioni, che siano corrette, poi verifica che i tuoi pin leggano correttamente, bastano delle Serial.print() per stamparti i vari valori.
Verifica esattamente il valore di i quando fa la break per uscire.
In questo modo, a bocce ferme, puoi verificare sul software ogni singolo punto per vedere se arriva il valore atteso e puoi provare e riprovare finchè non ne esci, aggiungendo Serial.print() per visualizzare i valori delle variabili per avvicinarti al problema.

Utilizzato nuovo multimetro arrivato ieri, non funziona! pila scaduta?

Preso il vecchio!!

x maubarzi --> selettore in 'n'/ 0 sul pin, 4.90 sugli altri/ i sulla seriale // selettore in 'k'/ 0 sul pin, 4.90 sugli altri/ k sulla seriale; e così per le altre po,
x standardoil --> LED volante si accende.

Sulla seriale, dopo in for ottengo

1, 2, 3, 4, 5, 6, 7, 8, 9, i su n

e

1, 2, 3, 4, 5, 6, 7, 8, k su k

e via dicendo.

Perso sia proprio un problema legato al ciclo for ma non ho alcuna idea di come risolverlo.

Quindi quello che vuoi ottenere cosa sarebbe? Scusa, ma non lo ho capito

Che selezionando la decima posizione compaia la lettera 'n' come sulla nona compare la 'k', sulla ottava la 'h' e via di seguito, e solo sulla dodicesima (non utilizzata) e sulla prima la 'i'.

In una prima fase avevo utilizzato dei numeri, che ho sostituito con le lettere per comodità.

Ciao
Enrico

posta il codice con le Serial.print e l'output esatto, perchè mi sa che ci stiamo continuando a perdere quel piccolo dettaglio che può farci arrivare alla soluzione.

Il selettore fisso sulla posizione incriminata, mi raccomando!