¿Está digitalizando una tensión variable producida por un potenciómetro analógico?
He usado equipo como ese y he visto el jitter y la descamación en los valores que se leen de las ollas. En mi experiencia, podría mejorarse sustancialmente limpiando los potenciómetros con aire comprimido y alcohol.
Sospecho que el problema es que DC se está enviando ingenuamente a través del potenciómetro, y luego se muestrea el voltaje dividido.
Los diseñadores de audio saben que las importantes corrientes de CC que fluyen a través de los potenciómetros (que también llevan audio) agregarán una gran cantidad de ruidos chirriantes cuando esos potenciómetros se mueven (y quizás incluso cuando no lo son).
Si estuviera diseñando un circuito que digitalice la posición de un potenciómetro analógico (en lugar del método obvio de usar un codificador rotatorio o lineal), caería estrictamente una señal de CA (desde un oscilador) a través del potenciómetro, sin Componente DC Esto se rectificaría, detectaría y digitalizaría.
Otra consideración es que las ollas de carbono baratas son más ruidosas que las unidades de cerámica, de plástico conductor o bobinadas con alambre.
Una técnica de software muy simple para suavizar valores es el suavizado ponderado exponencialmente. Este es un hermoso truco que permite que el valor suavizado dependa de todos los valores anteriores, sin conservar un historial de muestras anteriores. (Analogía familiar: la carga de un capacitor es igualmente exponencial, y el valor actual depende de todas las corrientes pasadas. Sin embargo, el capacitor no tiene memoria, per se.) Parece que hay un página de Wikipedia al respecto.
Para implementar el suavizado exponencial, simplemente realice un seguimiento del valor estimado \ $ s \ $ del potenciómetro (o cualquier parámetro \ $ x \ $ que esté muestreando).
El estimador se inicializa con la primera muestra:
$$ s_0 = x_0 $$
Luego, cuando se obtiene una nueva muestra, reemplazamos el estimador con una combinación lineal del valor existente y nuevo, donde \ $ \ alpha \ $ es el factor de fusión (denominado "factor de suavizado" en esta situación).
$$ s_t = \ alpha x_ {t-1} + (1 - \ alpha) s_ {t-1} $$
Esto se puede reescribir convenientemente de esta forma:
$$ s_t = (s_ {t-1} - s_ {t-1}) ^ {\ rightarrow 0} + \ alpha x_ {t-1} + (1 - \ alpha) s_ {t-1} $$
$$ s_t = s_ {t-1} - s_ {t-1} + s_ {t-1} + \ alpha x_ {t-1} - \ alpha s_ {t-1} $$
$$ s_t = s_ {t-1} + \ alpha x_ {t-1} - \ alpha s_ {t-1} $$
$$ s_t = s_ {t-1} + \ alpha (x_ {t-1} - s_ {t-1}) $$
En otras palabras, la nueva estimación es la estimación anterior, más una fracción de la diferencia entre el nuevo valor de la muestra y la estimación anterior .
Si todas las cantidades son enteros y \ $ \ alpha \ $ es una potencia de dos constantes, esto es muy fácil de implementar en el código. Por ejemplo, supongamos que tomamos \ $ \ alpha \ $ como \ $ 1/4 \ $, de modo que combinemos un 25% de valor nuevo, un 75% de estimador:
/* C pseudo-code */
s += (sample - s)/4; /* optimizes to s += (sample - s) >> 2; */
/* s returned to caller as the value */
El suavizado ponderado exponencialmente implementado como una línea: restar, desplazar a la derecha, acumular.