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:
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.
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]);}}
}
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.