Arduino:Примеры/Smoothing: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


== Сглаживание <ref>[http://www.arduino.cc/en/Tutorial/Smoothing Arduino - Smoothing]</ref>==
=Сглаживание <ref>[http://www.arduino.cc/en/Tutorial/Smoothing Arduino - Smoothing]</ref>=


Этот скетч постоянно считывает данные с входного аналогового контакта, вычисляет скользящее среднее значение и выводит результат на компьютер. Этот пример будет полезен при использовании сенсоров, дающих слишком неравномерные и '''«прыгающие»''' данные. Кроме того, он демонстрирует использование массивов для хранения данных.
Этот [[скетч]] постоянно считывает данные с входного аналогового контакта, вычисляет скользящее среднее значение и выводит результат на [[компьютер]]. Этот пример будет полезен при использовании [[сенсор]]ов, дающих слишком неравномерные и ''«прыгающие»'' данные. Кроме того, он демонстрирует использование массивов для хранения данных.


== Необходимое оборудование ==
== Необходимое оборудование ==


* Плата '''Arduino''';
* [[Плата Arduino]] - 1 шт.
* Потенциометр;
* [[Потенциометр]] - 1 шт.


== Цепь ==
== Цепь ==
Строка 16: Строка 16:
[[File:Smoothing_graph-circuit3.png|center|frame|'''Рис. 1.''' [[Плата Arduino]] с подключенным [[потенциометр]]ом.|alt=Рис. 1. Плата Arduino с подключенным потенциометром.]]
[[File:Smoothing_graph-circuit3.png|center|frame|'''Рис. 1.''' [[Плата Arduino]] с подключенным [[потенциометр]]ом.|alt=Рис. 1. Плата Arduino с подключенным потенциометром.]]


Подключите один из крайних контактов потенциометра к 5-вольтовму напряжению, второй крайний – к '''«земле»''', а центральный – к '''0-ому аналоговому контакту'''.
Подключите один из крайних контактов потенциометра к 5-вольтовму напряжению, второй крайний – к ''«земле»'', а центральный – к 0-ому аналоговому контакту.


== Схема ==
== Схема ==
Строка 25: Строка 25:


Эта программа последовательно сохраняет 10 последних значений, считанных с аналогового сенсора, в массив – один за одним. С появлением нового значения все 10 чисел складываются и делятся на 10, что позволяет найти среднее значение и тем самым сгладить внешние данные. Поскольку усреднение выполняется каждый раз, когда в массив добавляется одно новое значение (т.е. программа не ждет, когда в массив добавятся, например, 5 или 10 чисел), никакой задержки в вычислении этого скользящего среднего значения не происходит.  
Эта программа последовательно сохраняет 10 последних значений, считанных с аналогового сенсора, в массив – один за одним. С появлением нового значения все 10 чисел складываются и делятся на 10, что позволяет найти среднее значение и тем самым сгладить внешние данные. Поскольку усреднение выполняется каждый раз, когда в массив добавляется одно новое значение (т.е. программа не ждет, когда в массив добавятся, например, 5 или 10 чисел), никакой задержки в вычислении этого скользящего среднего значения не происходит.  
Если изменить размер массива (поставив в константу '''numReadings''' не 10, а больше – 15, 20, 30 и т.д.), то данные от сенсора будут еще более сглаженными.
 
Если изменить размер массива (поставив в константу numReadings не 10, а больше – 15, 20, 30 и т.д.), то данные от сенсора будут еще более сглаженными.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
Строка 101: Строка 102:
# [[Arduino:Примеры/Fade|Fade]]
# [[Arduino:Примеры/Fade|Fade]]
# [[Arduino:Примеры/Calibration|Calibration]]
# [[Arduino:Примеры/Calibration|Calibration]]
{{ads}}


==Внешние ссылки==
==Внешние ссылки==

Версия от 18:24, 16 декабря 2021

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Сглаживание [1]

Этот скетч постоянно считывает данные с входного аналогового контакта, вычисляет скользящее среднее значение и выводит результат на компьютер. Этот пример будет полезен при использовании сенсоров, дающих слишком неравномерные и «прыгающие» данные. Кроме того, он демонстрирует использование массивов для хранения данных.

Необходимое оборудование

Цепь

Рис. 1. Плата Arduino с подключенным потенциометром.
Рис. 1. Плата Arduino с подключенным потенциометром.

Подключите один из крайних контактов потенциометра к 5-вольтовму напряжению, второй крайний – к «земле», а центральный – к 0-ому аналоговому контакту.

Схема

Рис. 2. Схема подключения потенциометра к плате Arduino.
Рис. 2. Схема подключения потенциометра к плате Arduino.

Код

Эта программа последовательно сохраняет 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);        // делаем задержку между считываниями – для стабильности программы            
}

См.также

  1. array
  2. if
  3. for
  4. Serial
  5. AnalogInput
  6. AnalogInOutSerial
  7. Fade
  8. Calibration

Внешние ссылки