Go Down

Topic: Errore di array (??) (Read 1 time) previous topic - next topic

enrico24

Buongiorno a tutti, ho un programmino che mi fa impazzire

Code: [Select]


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


gpb01

#1
Jul 09, 2019, 01:18 pm Last Edit: Jul 09, 2019, 01:18 pm by gpb01
Code: [Select]
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) ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Standardoil

#2
Jul 09, 2019, 01:34 pm Last Edit: Jul 09, 2019, 01:39 pm by Standardoil
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?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

docdoc

#3
Jul 09, 2019, 01:45 pm Last Edit: Jul 09, 2019, 02:34 pm by docdoc
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:
Code: [Select]
if (digitalRead (sequenziale[i]) == 0)
Intanto è meglio in genere usare LOW o HIGH per evidenziare la cosa, quindi:
Code: [Select]
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):

Code: [Select]
// 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...
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

maubarzi

Ma hai verificato con un multimetro la tensione sul pin 40 quando dovrebbe uscirti la n?
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Standardoil

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

Che poi...
Perché hai cambiato pin?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

enrico24

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


enrico24


Standardoil

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' ?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

enrico24

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

Standardoil

Ma in posizione 'n' cosa esce?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

enrico24


Standardoil

E il corrispondente led si accende?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

gpb01

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 ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

enrico24

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

Go Up