array ingressi analogici e digitali

Sto scrivendo un programma per mega2560 nel quale ho bisogno, per comodità, di elencare tutti gli ingressi in un array, così come tutte le uscite.

int ingressi [ ] { A0,A1,A2..... A13,A14,A15,2,3,4,5,6,7......34 }

Quando clicco su verifica mi esce un messaggio di errore con scritto che A13 non è stato dichiarato.

Se tolgo tutto da A13 ad A15 non mi da errori, e la verifica viene eseguita con esito positivo.
Cosa mi sfugge? Ho pensato che fosse per il fatto che A non fa parte dei numeri interi, ma allora anche A2 non è un numero, quindi non so cosa pensare.
Questo array mi serve per fare una lettura digitale di tutti gli ingressi, e potrei far leggere aparte i tre ingressi che avanzano senza rovinare il programma, ma mi sembra una soluzione assurda.

Hai selezionato la giusta board prima di compilare ? ? ? Perché per la MEGA essi sono tutti definiti ...
... e comunque potresti mettere direttamente il numero del pin definito in pins_arduino.h della Mega:

static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
static const uint8_t A3 = 57;
static const uint8_t A4 = 58;
static const uint8_t A5 = 59;
static const uint8_t A6 = 60;
static const uint8_t A7 = 61;
static const uint8_t A8 = 62;
static const uint8_t A9 = 63;
static const uint8_t A10 = 64;
static const uint8_t A11 = 65;
static const uint8_t A12 = 66;
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;

Guglielmo

Quindi non ti serve neanche creare un array, visto che vanno da 2 a 69, continui

Questa non la sapevo, mi avete risolto un problema. Riprovo e vi faccio sapere, intanto GRAZIE.

ma scrivendolo così forse il compilatore si aspettava di trovare una lista di interi, trova A0 e lo prende per una variabile, va a cercare la dichiarazione senza trovarla.

paulus1969:
ma scrivendolo così forse il compilatore si aspettava di trovare una lista di interi, trova A0 e lo prende per una variabile, va a cercare la dichiarazione senza trovarla.

E perché ? :o :o :o

E ben definita ...

static const uint8_t A0 = 54;

e come A0, tutte le altre fino ad A15.

Guglielmo

Infatti é strano perchè il problema si verifica solo per A13, A14, A15. è come se solo loro non fossero dichiarati.

Aggiungo che facendo una lettura sequenziale di tutti gli ingressi in un ciclo for il programma si blocca prima ancora di partire,Precisamente si blocca dopo aver inviato "In" sulla seriale, che sarebbe l'inizio del void loop, il quale inizia con un serial print("Inizializzazione"); che muore al secondo carattere.
ho allegato il programma e non credo che servano spiegazioni per capirlo, comunque legge tutti gli ingressi dal 2 al 59 e li mette in un array booleano, e ad ogni ciclo confronta le letture nuove con quelle precedenti per comunicarle via seriale.

Nel void setup si fa una lettura preliminare per riempire l'array delle letture vecchie in modo da avere qualcosa con cui confrontare le nuove che verranno fatte nei vari loop,

Limitando le letture a da 2 a 13 il programma funziona.

boolean vecchio []{};
boolean nuovo []{};
int c=0;


void setup() { Serial.begin(9600); 

      Serial.println("Inizializzazione...");Serial.println(" ");Serial.println(" ");
      for (int xx=2; xx<70; xx++){ pinMode( xx, INPUT);} 
      for (int xx=2; xx<70; xx++){ vecchio[xx] = digitalRead(xx); }
      for (int xx=2; xx<70; xx++){ Serial.println(vecchio[xx]); }
      Serial.println("Inizializzazione terminata");Serial.println(" ");Serial.println(" ");
}//fine void setup



void loop() { Serial.print("ciclo # ");Serial.println(c);

   for (int xx=2; xx<70; xx++){ nuovo[xx] = digitalRead(xx); } c++;
 
   for (int xx=2; xx<70; xx++){ if (vecchio[xx]!=nuovo[xx]) {vecchio[xx] = nuovo[xx]; Serial.print(xx);Serial.print(" = ");Serial.println(nuovo[xx]);}}
  

 }

scanner.ino (779 Bytes)

boolean vecchio []{};
boolean nuovo []{};

Non puoi inizializzare questi vettori così, devi specificare una dimensione:

#define N_INPUT 70

boolean vecchio [N_INPUT];
boolean nuovo [N_INPUT];

Così potrebbe anche funzionare. Qualche altro suggerimento; primo, non serve fare 800 for separati:

for (int xx=2; xx<70; xx++){
  pinMode( xx, INPUT);
  vecchio[xx] = digitalRead(xx);
  Serial.println(vecchio[xx]);
}

Visto che parti da 2, sarebbe bene fare il vettore di soli 68 elementi e salvare l'ingresso N nella posizione N-2, ma vabbeh.

Serial.print("ciclo # ");
Serial.println(c++);

for (int xx=2; xx<70; xx++) {
  nuovo[xx] = digitalRead(xx);
  if (vecchio[xx]!=nuovo[xx]) {
    vecchio[xx] = nuovo[xx];
    Serial.print(xx);
    Serial.print(" = ");
    Serial.println(nuovo[xx]);
  }
}

Non trovi che mettendo un'istruzione per riga e in generale formattando tutto con un po' più di attenzione, la leggibilità e comprensibilità dello sketch ne abbia molto a guadagnare?

In ogni caso, credo che nuovo non serva che sia un array, dovrebbe bastare una sola variabile per tenere traccia del valore attuale dell'ingresso, però bisogna vedere cosa fai nel resto dello sketch,

Anche se non so per quale motivo, era il programma sul pc a dare problemi, infatti dopo una reinstallazione si è messo a funzionare.

Proverò a scrivere in modo un po' più chiaro il codice, anche se pensavo che fosse già scritto in modo abbastanza chiaro.
Il motivo per il quale uso due diversi array è che devo avere tutte le variabili aggiornate ad ogni ciclo, questo per non perdere tempo a leggere lo stesso valore più volte e soprattutto perchè il valore potrebbe anche cambiare e questo non deve succedere fino alla fine del ciclo in corso, altrimenti potrebbero verificarsi condizioni non previste.

Ribadisco che nel codice che hai postato basterebbe che "nuovo" fosse una variabile, non serve che sia un array visto che ad ogni iterazione usi solo il valore attuale, non usi mai i precedenti. Se poi c'è altro codice che non hai postato, allora è un altro discorso.

Si hai ragione, ma c'è altro codice, l'ho omesso perchè non serviva.

A riguardo sto per aprire una nuova discussione, l'argomento è totalmente diverso quindi non mi sembrava il caso di continuare qui, però potrai vedere a cosa serve avere entrambi i valori.