media in un intervallo di tempo

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

ma su 20 letture o ogni 5 secondi?
di solito sono due cose abbastanza differenti :slight_smile:
o hai qualcosa che rallenta analogread fino a 20 letture ogni 5 secondi?
dacci qualche info inpiù :slight_smile:

Ciao,

ho buttato giù un codice di esempio, ma non l'ho provato :smiley:

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 :smiley:
saluti

kattivik76

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)