Go Down

Topic: "stabilizzare" la lettura in ingresso (Read 873 times) previous topic - next topic

gingardu

come posso fare per "stabilizzare" la lettura in ingresso
ho una variabile long (K)
che ha dentro la lettura  la lettura cambia di una cifra o due   ogni tanto   es 12345   12346  (piu letture al secondo)

volevo validare e stampare Serial.print (invio)   solo se  due letture consecutive
sono uguali

per adesso adopero questo pezzo  ma non mi convince troppo perche se si muove di 2 cifre   o di molte cifre stampa lo stesso    =(

    if ( (invio- K  > 1 ||invio- K  <-1 )   invio=K, Serial.println (invio);


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

lsinfo

ciao
io farei cosi (o anche con uno switch)
Code: [Select]

int volte=0;
if ( invio - K) ==0)
  {
if (volte >1)
{
                invio=K;
                Serial.println (invio);
   volte=0;
}
             else
   volte++;
}
Leo55

astrobeed

Un buon sistema per annullare le fluttuazioni è fare la media su un certo numero di valori e su questa applicare il controllo della variazione +/- 1 count come stai facendo adesso.
Quanti campioni utilizzare per la media dipende anche dalla velocità con cui arrivano i dati e quella con cui vuoi rappresentarli, se come penso parliamo del solito calibro digitale non dovresti avere problemi a prendere otto letture, potenza due così la divisione la fai tramite uno shift a destra di tre posizioni, e aggiornare i dati visualizzati almeno un paio di volte al secondo.

gingardu

#3
Nov 02, 2012, 01:51 pm Last Edit: Nov 02, 2012, 01:55 pm by gingardu Reason: 1
fare la media no,  perche la velocita di aggiornamento e poca 3 volte a secondo aspettare 8 letture sono 3 secondi
troppi,  poi  la lettura e gia filtrata perche ogni tanto  senza nessun motivo la lettura viene dimezzata oppure da una cifra altissima,

se faccio la media sicuramente peggioro le cose,
  la lettura altissima la filtro con un if,  non viene printata,

per quando dimezza devo acora vedere   come fare   :~


provo con questo ma non funziona


Code: [Select]
(K > invio/2+(invio/10) || K < invio/2-(invio/10)
Code: [Select]
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


perche ogni tanto  senza nessun motivo la lettura viene dimezzata oppure da una cifra altissima,


Per ovviare a questi problemi basta inserire una seconda soglia che butta via tutte le letture che si discostano di più di un tot dall'ultima lettura valida, esempio pratico se l'ultima lettura è 1000 accetti tutte le variazioni comprese tra 900 e 1100, tutte quelle fuori range le scarti.
Quanto deve essere ampia la soglia dipende dalla massima variazione attesa tra due letture consecutive e dalla scala di misura.

Go Up