Riempire un Array di valori

E' possibile riempire un Array di valori provenienti da un sensore analogico?

Creare un vettore che contiene ad esempio un certo numero di di valori provenienti da un accelerometro.

Non vedo perché non dovrebbe! Mantieni un indice i che parte da 0, ad ogni lettura salvi nella i-esima posizione del vettore ed incrementi i.

L'unico "problema" è fare ricominciare i da 0 quando hai raggiunto la dimensione del vettore, per questo puoi incrementarlo in questo modo:

i = (i + 1) % N;

dove N è la dimensione del vettore. L'operatore % si chiama modulo e ritorna il resto della divisione, proprio quel che fa al caso tuo.

Fino a quanti valori potrei acquisire? Lo chiedo perchè dopo che il vettore si è riempito dovrei svolgere delle operazioni (RMS).

Beh, saprai tu quanti te ne servono...

Il massimo teorico è ovviamente la dimensione della RAM. Visto che le letture analogiche richiedono un int, dunque 2 byte, e che sulla uno hai 2 kB di RAM, direi che il massimo-massimo-massimo teorico è 1024 letture.

Ovviamente nella pratica non potranno essere così tante, perché parte della RAM è già utilizzata dal framework e parte servirà a te per fare qualcosa con sti dati :). Che so, un 500-600 letture potrebbero andare bene?

si proviamo.

Allora io sto lavorando con quest codice che acquisisce dati da un accelerometro analogico:

#include <AcceleroMMA7361.h>
AcceleroMMA7361 accelero;
int x;
int y;
int z;
int i;

void setup()
{
  Serial.begin(9600);
  pinMode(7,OUTPUT);
  pinMode(5,OUTPUT);
  int i=0;
  accelero.begin(13, 12, 11, 10, A0, A1, A2);
  accelero.setARefVoltage(5); //sets the AREF voltage to 3.3V
  accelero.setSensitivity(HIGH); //sets the sensitivity to +/-6G
  accelero.calibrate();
}

void loop(){
 digitalWrite(7,LOW);
 digitalWrite(5,LOW);
  x = accelero.getXAccel()+36;
  y = accelero.getYAccel()+36;
  z = accelero.getZAccel()+26;

  if(x>1){
    digitalWrite(5,HIGH);
    }
    if(x>50){
    digitalWrite(7,HIGH);
    }
  
 //  Serial.print("\nx: ");
//  Serial.print(x);
//  Serial.print(" \ty: ");
//  Serial.print(y);
//  Serial.print(" \tz: ");
//  Serial.print(z);
//  Serial.print("\tG*10^-2");
 

Serial.println(x);
 

delay(2); //make it readable 

}

quindi vorrei creare un array dei valori lungo x e in seguito eseguire una RMS che altro non è:

la radice quadrata della sommatoria dei quadrati dei valori dell’array diviso il numero dei valori stessi.

In matlab c’è la comodissima funzione rms(). Qui no
Cioè

Basta iterare sull'array e usare le funzioni pow() (o una banale moltiplicazione) e sqrt(), per cui ti rimando al Reference.

Sii cosciente che un'operazione del genere richiederà comunque "un po'" di tempo (a naso qualche decina/centinaia di millisecondi).

int myArray[];
int i;

for (i = 0; i < 5; i = i + 1) 

{

myArray[i]=accelero.getXAccel()+36;;
delay(100);

}

Correggimi se sbaglio. Tralasciando le altre cose.

Ad ogni iterazione acquisisce il valore accelero.getXAccell()+36 e lo colloca nella i-esima posizione dell’array? In questo caso l’array ha 5 valori. Una volta riempito esce dal ciclo for?

Eggià!

Con un delay(100) avrei che ogni 100 millisecondi c'è un Aquisizione? avrei una frequenza di campionamento di 100 Hz?

Ogni (circa) 100 ms hai un'acquisizione, il che però vuol dire 10 Hz, non 100.

Sì quello intendevo. 10 Hz. Perché usi il circa? Se inserisco altre operazioni il ciclo verrebbe rallentato?

Le istruzioni richiedono tempo per essere eseguite, ma direi che l'influenza su 100 ms è trascurabile.

Quindi se volessi una frequenza di campionamento più alta mi basta ridurre il delay. So che è un fuori post...ma in merito ho sempre avuto dubbi. Come funzionA arduino nel campionamento? Basta agire semplicemente sul delay?

Cosa intendi?

voglio dire se ad esempio scrivo:

for (i = 0; i < 5; i = i + 1) 

{
myArray[i]=accelero.getXAccel()+36;;
delay(100);
}

Ho un array con valori campionati con una frequenza di 10 Hz

se scrivo:

for (i = 0; i < 5; i = i + 1) 

{
myArray[i]=accelero.getXAccel()+36;;
delay(2);
}

Ho un array con valori campionati con una frequenza di 500 Hz. Il concetto di base è giusto?

Se campioni da Arduino è un discorso ma qui parli di accelero.getXAccel() quindi dipende dal tempo di risposta di quel sensore. Chi lo dice che è una semplice lettura analogica ? C'e' una lib che esegue un comando, bisogna vedere quel che c'e' dentro quel comando/lettura.

La cosa ideale sarebbe costruire uno sketch ad hoc per quel sensore senza passare per la libreria.

L'ho sempre pensato. Come potrei superare questo dubbio?

Certo!

Allora facciamo così cercherò di creare un post dedicato alla costruzione dello sketch dedicato a quel sensore.

Supponiamo di aver chiarito questo dubbio. E ritornando all’array.

Una volta che il vettore si è riempito il compilatore esce dal ciclo for. Quindi nella sua memoria è salvato un vettore con quei valori.

Al di fuori di questo ciclo poi posso eseguire operazioni sul vettore? Ovviamente tutto in loop():

void loop(){

for (i = 0; i < 5; i = i + 1) 
{
myArray[i]=accelero.getXAccel()+36;;
delay(100);
}

//Operazioni sul vettore my Array

}