system
July 10, 2011, 1:23pm
1
avrei bisogno di fare una media di segnali ricevuti da un sensore in un certo intervallo tempo.
Esempio: ho bisogno di fare la media su 20 acquisizioni ogni 5 secondi.
Mi potreste mandare il link di un esempio con il codice di programma da utilizzare?
grazie in anticipo
system
July 10, 2011, 2:13pm
2
ma su 20 letture o ogni 5 secondi?
di solito sono due cose abbastanza differenti
o hai qualcosa che rallenta analogread fino a 20 letture ogni 5 secondi?
dacci qualche info inpiù
Ciao,
ho buttato giù un codice di esempio, ma non l'ho provato
eccolo:
long previousMillis = 0; // will store last time LED was updated
long interval = 5000; // interval (milliseconds)
float value = 0; // valore calcolato
float media_value = 0; // valore effettivo dopo il primo loop media() completo
long samples = 20; // numero di campionamenti per media()
long current_sample = 0; // campionamento corrente
float prev_media = 0;
char str_AN1[]= {"xxxxxx"};
float misura_analogica = 1; // variabile dove appoggiare il valore analogico da mediare
void setup(){
Serial.begin(19200);
Serial.println("Serial COM init ok");
}
void loop(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > (interval/samples)) {
Serial.println("Interval samples @ " + interval/samples);
media_value = media(misura_analogica);
Serial.println("Media value is: ");
Serial.print(floatToString(str_AN1, media_value, 2, 6));
Serial.println("");
previousMillis = currentMillis;
}
}
float media(float misura){
if(current_sample >= samples){
current_sample = 0;
prev_media = (value / samples);
value = 0;
}
value += misura;
current_sample += 1;
return prev_media;
}
//-----------------------------------------------------------------------------
char * floatToString(char * outstr, double val, byte precision, byte widthp){
char temp[16];
byte i;
// compute the rounding factor and fractional multiplier
double roundingFactor = 0.5;
unsigned long mult = 1;
for (i = 0; i < precision; i++)
{
roundingFactor /= 10.0;
mult *= 10;
}
temp[0]='\0';
outstr[0]='\0';
if(val < 0.0){
strcpy(outstr,"-\0");
val = -val;
}
val += roundingFactor;
strcat(outstr, itoa(int(val),temp,10)); //prints the int part
if( precision > 0) {
strcat(outstr, ".\0"); // print the decimal point
unsigned long frac;
unsigned long mult = 1;
byte padding = precision -1;
while(precision--)
mult *=10;
if(val >= 0)
frac = (val - int(val)) * mult;
else
frac = (int(val)- val ) * mult;
unsigned long frac1 = frac;
while(frac1 /= 10)
padding--;
while(padding--)
strcat(outstr,"0\0");
strcat(outstr,itoa(frac,temp,10));
}
// generate space padding
if ((widthp != 0)&&(widthp >= strlen(outstr))){
byte J=0;
J = widthp - strlen(outstr);
for (i=0; i< J; i++) {
temp[i] = ' ';
}
temp[i++] = '\0';
strcat(temp,outstr);
strcpy(outstr,temp);
}
return outstr;
}
fammi sapere se funziona
saluti
kattivik76
system
July 10, 2011, 6:26pm
4
grazie per il programma, ho iniziato da poco con Arduino e non conosco bene come utilizzare la funzione millis(). adesso mi studio con calma il tuo esempio.
per chiarezza: ogni 5 secondi devo lanciare una routine (la routine consiste nell'acquisire 20 dati e calcolare la media)