Arduino:Примеры/Smoothing
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Сглаживание [1]
Этот скетч постоянно считывает данные с входного аналогового контакта, вычисляет скользящее среднее значение и выводит результат на компьютер. Этот пример будет полезен при использовании сенсоров, дающих слишком неравномерные и «прыгающие» данные. Кроме того, он демонстрирует использование массивов для хранения данных.
Необходимое оборудование
- Плата Arduino;
- Потенциометр;
Цепь
Подключите один из крайних контактов потенциометра к 5-вольтовму напряжению, второй крайний – к «земле», а центральный – к 0-ому аналоговому контакту.
Схема
Код
Эта программа последовательно сохраняет 10 последних значений, считанных с аналогового сенсора, в массив – один за одним. С появлением нового значения все 10 чисел складываются и делятся на 10, что позволяет найти среднее значение и тем самым сгладить внешние данные. Поскольку усреднение выполняется каждый раз, когда в массив добавляется одно новое значение (т.е. программа не ждет, когда в массив добавятся, например, 5 или 10 чисел), никакой задержки в вычислении этого скользящего среднего значения не происходит. Если изменить размер массива (поставив в константу numReadings не 10, а больше – 15, 20, 30 и т.д.), то данные от сенсора будут еще более сглаженными.
/*
Сглаживание
Постоянно считывает данные с входного аналогового контакта, высчитывает на их основе скользящее среднее, а затем выводит результат на компьютер. Сохраняет последние 10 считанных значений в массиве – на их основе и выполняется постоянное усреднение.
Цепь:
* аналоговый сенсор (к примеру, потенциометр), подключенный к 0-ому входному аналоговому контакту
Создан 22 апреля 2007 Дэвидом А. Меллисом (David A. Mellis, <dam@mellis.org>),
модифицирован 9 апреля 2012 Томом Иго (Tom Igoe)
http://www.arduino.cc/en/Tutorial/Smoothing
Этот пример не защищен авторским правом.
*/
// Определяем количество значений в массиве.
// Чем больше это количество, тем более сглаженным будет результат,
// и тем больше будет задержка между входными и выходными данными.
// Использование константы вместо переменной позволяет задать размер для массива.
const int numReadings = 10;
int readings[numReadings]; // данные, считанные с входного аналогового контакта
int index = 0; // индекс для значения, которое считывается в данный момент
int total = 0; // суммарное значение
int average = 0; // среднее значение
int inputPin = A0;
void setup()
{
// инициализируем последовательную передачу данных с компьютером:
Serial.begin(9600);
// выставляем все считываемые значения на ноль:
for (int thisReading = 0; thisReading < numReadings; thisReading++)
readings[thisReading] = 0;
}
void loop() {
// берем последнее значение...
total= total - readings[index];
// ...которое было считано от сенсора:
readings[index] = analogRead(inputPin);
// добавляем его к общей сумме:
total= total + readings[index];
// продвигаемся к следующему значению в массиве:
index = index + 1;
// если мы в конце массива...
if (index >= numReadings)
// ...возвращаемся к началу:
index = 0;
// вычисляем среднее значение:
average = total / numReadings;
// выводим его на компьютер цифрами в кодировке ASCII
Serial.println(average);
delay(1); // делаем задержку между считываниями – для стабильности программы
}