analog media

void loop() {// put your main code here, to run repeatedly:
for(i=0;i<15;i++)
  {
    valori=valori+analogRead(A0);
   } 
  media=valori/15; 
 // media=analogRead(A0);
  
  Serial.println(media); 
  delay(50);

qualcuno sa dirmi cosa sbaglio?

ps. il risultato e’ un segnale in ingresso che passa i 1023 e ha picchi positivi e negativi…WoW

Domanda: vero che valori é un intero?

scusa mi sa che ho fatto un errore a mandare solo parte dello sketch ecco

int i,valori=0, media;

void setup() {// put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(A0,INPUT);
}

void loop() {// put your main code here, to run repeatedly:
for(i=0;i<15;i++)
  {
    valori=valori+analogRead(A0);
   } 
  media=valori/15; 
 
  
  Serial.println(media); 
  delay(50);
  
}

-come dicevo prima, monitor seriale mi rileva picchi positivi e negativi, tutt’altro che valore stabile… anzi decisamente non funzionante

Ciao

La variabile valori, all'inizio del secondo giro di loop, che valore pensi che abbia?

La variabile valori, all’inizio del secondo giro di loop, che valore pensi che abbia?

Certo continuando a sommare dati alla variabile valori senza mai azzerarla questa prima o poi va in overflow tirando fuori valori sia negativi che positivi.

Comunque il problema è che non azzeri mai la variabile valori.

void loop() {            // put your main code here, to run repeatedly:

    for ( i=0; i<15; i++ )
    {
        valori=valori+analogRead(A0);
     }
     media=valori/15;
     valori = 0;
 
 
     Serial.println(media);
     delay(50);
 
}

Risolto il mistero la media dovrebbe funzionare, anche se non è proprio il modo migliore di eseguirla.
L’ideale sarebbe di acquisire il valore da analogRead() ogni tot tempo, ad esempio ogni 10ms o meno a seconda di quanto tempo si può aspettare per avere calcolata la media. Se esegui questa:valori=valori+analogRead(A0); ogni millesimo di secondo, avrai una media calcolata ogni 1 x 15 = 15ms. Altra side effect del tuo codice è che le altre istruzioni presenti nel loop non saranno eseguite fintantoché il ciclo for non viene completato. Visto che la funzione loop() ed in effetti un ciclo infinito la puoi usare come un for, ma le condizioni (<= ecc) le devi gestire tramite if ( confizione ).

byte sampleCounter = 0;
consy byte nSampleMax = 15

void loop() {            // put your main code here, to run repeatedly:

    if (sampleCounter  < nSampleMax) {               

         valori = valori + analogRead(A0);               // #1
         nSampleCounter++;                                     // #2

    } else { 

         media = valori / nSampleMax;
         valori = nSampleCounter = 0;  // se non azzero nSampleConter il codice  #1 e #2 non verrà più                                    
                                                           eseguito
    }  

}

mi sono accorto solo ora della risposta, ed ora mi e' più chiaro cio' che intendevi grazie!