"stabilizzare" la lettura in ingresso

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);

ciao
io farei cosi (o anche con uno switch)

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

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.

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

`(K > invio/2+(invio/10) || K < invio/2-(invio/10)```

gingardu:
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.

Io suggerisco questo ma dipende molto dal tipo d'informazione che si va a campionare:

Cambiando dominio si deve comunque accettare una discretizzazione delle informazioni, questo è ovvio. Se hai delle fluttuazioni nel tempo devi evitare però anche di campionare l'inviluppo del segnale stesso altrimenti campioni dei dati falsi.

Quindi, sapendo che "movimento" ha il segnale, apri delle finestre di osservazione che lo abbraccino sufficientemente e fai un filro a majority vote, puoi anche fare la media ma stai attento a non prendere finestre di osservazione troppo lunghe altrimenti la variazione si annulla e non la puoi osservare (sempre che tu la voglia percepire).

Spero di esserti stato di aiuto.

Per l'implementazione ... bhè quella non credo ci siano problemi. :wink:

Enry