Самое простое - это скользящее среднее ваших данных. То есть хранить массив данных датчиков и усреднять их. Примерно так (псевдокод):
data_X = [0,0,0,0,0];
function read_X () {
data_X.delete_first_element();
data_X.push(get_sensor_data_X());
return average(data_X);
}
При этом есть компромисс. Чем больше массив, который вы используете, тем более гладким будет результат, но тем больше будет разрыв между результатом и фактическим показанием. Например:
/\_/\
/\/ \_/\
Sensor reading: __/\/ \/\
\/\ _/\___________
\/
_
__/ \_
___/ \__
Small array: ___/ \_/\_ _
\ __/ \________
\_/
____
__/ \__
__/ \__
Large array: _______/ \__ __
\_ / \__
\_/
(forgive my ASCII-ART but I'm hoping it's good enough for illustration).
Если вам нужен быстрый отклик, но хорошее сглаживание в любом случае, тогда вам нужно использовать средневзвешенное значение массива. Это в основном цифровая обработка сигналов (с большой буквы), которая, в отличие от названия, более тесно связана с аналоговым дизайном. Вот короткая статья в Википедии об этом (с хорошими внешними ссылками, которую вы должны прочитать, если хотите пойти по этому пути): http://en.wikipedia.org/wiki/Digital_filter
Вот некоторый код из SO о фильтре нижних частот, который может удовлетворить ваши потребности: Программное обеспечение фильтра нижних частот? . Обратите внимание, что в коде в этом ответе он использует массив размером 4 (или порядка 4 в терминологии обработки сигналов, поскольку такие фильтры называются фильтрами четвертого порядка, на самом деле он может моделироваться полиномиальным уравнением 4-го порядка: 4 + bx ^ 3 + cx ^ 2 + dx) .