Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Smoothing

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

  • Плата Arduino;
  • Потенциометр;

Цепь

Smoothing graph-circuit3.png

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

Схема

Smoothing AnalogReadSerial sch.png

Код

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

  1. /*
  2.  
  3.   Сглаживание
  4.  
  5.   Постоянно считывает данные с входного аналогового контакта, высчитывает на их основе скользящее среднее, а затем выводит результат на компьютер. Сохраняет последние 10 считанных значений в массиве – на их основе и выполняется постоянное усреднение.
  6.   Цепь:
  7.     * аналоговый сенсор (к примеру, потенциометр), подключенный к 0-ому входному аналоговому контакту
  8.  
  9.   Создан 22 апреля 2007 Дэвидом А. Меллисом (David A. Mellis, <dam@mellis.org>),
  10.   модифицирован 9 апреля 2012 Томом Иго (Tom Igoe)
  11.  
  12.   http://www.arduino.cc/en/Tutorial/Smoothing
  13.  
  14.   Этот пример не защищен авторским правом.
  15.  
  16. */
  17.  
  18.  
  19. // Определяем количество значений в массиве.
  20. // Чем больше это количество, тем более сглаженным будет результат,
  21. // и тем больше будет задержка между входными и выходными данными.
  22. // Использование константы вместо переменной позволяет задать размер для массива.
  23. const int numReadings = 10;
  24.  
  25. int readings[numReadings];      // данные, считанные с входного аналогового контакта
  26. int index = 0;                  // индекс для значения, которое считывается в данный момент
  27. int total = 0;                  // суммарное значение
  28. int average = 0;                // среднее значение
  29.  
  30. int inputPin = A0;
  31.  
  32. void setup()
  33. {
  34.   // инициализируем последовательную передачу данных с компьютером:
  35.   Serial.begin(9600);                  
  36.   // выставляем все считываемые значения на ноль:
  37.   for (int thisReading = 0; thisReading < numReadings; thisReading++)
  38.     readings[thisReading] = 0;          
  39. }
  40.  
  41. void loop() {
  42.   // берем последнее значение...
  43.   total= total - readings[index];
  44.   // ...которое было считано от сенсора:
  45.   readings[index] = analogRead(inputPin);
  46.   // добавляем его к общей сумме:
  47.   total= total + readings[index];      
  48.   // продвигаемся к следующему значению в массиве:  
  49.   index = index + 1;                    
  50.  
  51.   // если мы в конце массива...
  52.   if (index >= numReadings)              
  53.     // ...возвращаемся к началу:
  54.     index = 0;                          
  55.  
  56.   // вычисляем среднее значение:
  57.   average = total / numReadings;        
  58.   // выводим его на компьютер цифрами в кодировке ASCII
  59.   Serial.println(average);  
  60.   delay(1);        // делаем задержку между считываниями – для стабильности программы            
  61. }

См.также

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

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

  1. Arduino - Smoothing