Ciao a tutti!
Sono un principiante, quindi il mio problema è relativamente semplice: voglio che arduino mi legga i primi 10 valori che riceve da un input analogico, un potenziomentro nel mio caso.
La lettura deve avvenire con un tempo di campionamento da me definito: deltaC.
Successivamente, dopo un altro tempo da me definito come deltaS, voglio che arduino mi stampi l'array che ha letto nell'intervallo precedente di campionamento.
Voglio che il loop non si arresti mai.
Vi allego il codice che ho scritto, facendovi presente che non riesco a fare in modo che i 10 campi dell'array, corrispondenti alle prime 10 letture, vengano riempiti.
Grazie per quanto potrete fare!
// Utilizzo di un potenziometrio - array
int N=10;
int valoreUNO; //variabile di riferimento primo pot.
int arrayUNO[10];
int i=0;
unsigned long tempo; //variabile temporale
unsigned long tempoAcquisizione=0; // tempo di inizio campionamento
unsigned long tempoScarica=0; // tempo di scarica
int deltaC=100; //durata tempo di campionamento
int deltaS=2050;//tempo di scarica
//int contatore=0;
int j=0;
void setup () {
delay(2000);
Serial.begin(9600); //attivo la comunicazione seriale
}
Lo sketch non ha problemi, perchè dici che non riempie l'array?
L'unica cosa da rilevare è che, con quel ciclo for, riempi 9 valori anzichè 10, i due cicli for dovrebbero essere:
Qui c'è da chiarire una cosa. Secondo quello che hai scritto:
...mi legga i primi 10 valori che riceve da un input analogico, un potenziomentro nel mio caso.
La lettura deve avvenire con un tempo di campionamento da me definito: deltaC.
Il programma che hai scritto legge, nel più breve tempo possibile, i primi dieci valori dell'input analogico; e ripete la lettura ad ogni intervallo deltaC. In questo senso è facile che tu possa trovare TUTTI i valori dell'array uguali, in quanto le 10 letture avvengono in successione rapidissima. Troveresti, quindi, dei valori diversi solo se il valore cambiasse molto rapidamente (come dimostrazione, prova a lasciare l'input flottante e vedrai che l'array conterrà valori diversi)
Se, invece, le tue intenzioni erano quelle di registrare 10 letture, una ogni periodo deltaC, allora il programma così com'è non va bene e deve essere cambiato d conseguenza.
In pratica, ogni volta che il programma esegue
if (tempo>tempoAcquisizione+deltaC) {
devi registrare UNA SOLA lettura e non tutte e 10, magari avvalendoti di un contatore di letture.
come dicevo prima, con la if nel for, ma a quel punto nascono tutte le considerazini che ho già fatto... una bella delay nel for e passa la paura
edit: scusate, ieri avevo scritto un post (anche bello lungo) in cui espandevo un pò quello che dice dalubar nel suo ultimo messaggio... ma a quanto pare non l'ho inviato -.-"
In effetti dipende dal tipo di applicazione che vuole sviluppare kiteaddicted.
L'uso di delay() durante ogni ciclo di lettura blocca lo sketch per 100ms*10 = 1 secondo. Dato che ha presentato un esempio che usa mills() sia per la lettura dei dati che per la stampa, mi è sembrato di capire che non preferisse soluzioni "bloccanti"...
Certo anche questa del delay(), però, è una possibile soluzione...
sì, l'uso del delay risolverebbe il problema ma in maniera poco efficiente dovuta al blocco della lettura...
ho risolto così, eliminando il ciclo for in lettura e affidandomi al loop intrinseco:
ps
in questo caso ho aggiunto un altro input.
int N=10;
int valoreUNO; //variabile di riferimento primo pot.
int valoreDUE; //variabile di riferimento secondo pot.
int arrayUNO[10];
int arrayDUE[10];
int j=0;
unsigned long tempo; //variabile temporale
unsigned long tempoAcquisizione=0; // tempo di inizio campionamento
unsigned long tempoScarica=0; // tempo di scarica
int deltaC=100; //durata tempo di campionamento
int deltaS=2050;//tempo di scarica
void setup () {
delay(2000);
Serial.begin(9600); //attivo la comunicazione seriale
}