Запись потока данных в массив
- Войдите на сайт для отправки комментариев
Чт, 27/06/2013 - 19:10
Здравствуйте ! Подскажите пожалуйста как организовать запись потока данных от датчика расстояния в массив? ДАнные от датчика растояния сыпятся по 10 значений в секундцу, вот мне надо чтобы в массив записывались все показания датчика за каждую секунду. Дело в том, что на датчике иногда проскакивают неадекватные значения, чтобы их фильтровать я хочу писать каждую секунду данные в массив, и каждую же секунду высчитывать среднее значение из всех записанных значений с массиве. По моим предположениям неадекватные значения в таком случае сильного возмущения не принесут.
Всем спасибо !
хммм... ну если предположим что есть 9 значений в районе 10 и одно НЕАДЕКВАТНОЕ в районе 1000... то среднее у вас получится 109... будет похоже на среднюю зарплату в России.. президент ей доволен, а большинство народу таких денег никогда не видело... Вы не родственики с президентом случайно? а то образ мышления у вас похож :)
Да, я троюродный отец матери сына бабушки мамы сестры путина, все верно друг мой!
Как бы то ни было, вы можете подсказать как записывать данные каждую 1/10 секунды в массив ?
и где тут поиск ? я первый раз на этом форуме.
опрашивайте датчик каждуй 0.1с, проверяйте на адекватность полученные данные и пишите в массив.... ваш кэп :)
нужно подругому искать ошибочные значения. если только одно ошибочное то можно смотреть по 3 значения и если ошибка - делить разницу между крайними на 2. Ошибку искать как - разница между 1 и 2 больше разницы между крайними(1 и 3) в 3 раза.
Вобщем надо пример показаний с ошибками, чтобы придумать фильтр для них.
вот пример :
датчик показывает расстояние до кресла :
50
51
50
50
52
51
97
49
51
50
Видим цифру 97 - результат того что кресло чуть повернули и сигнал исказился там отразился от плутона туда сюда, пришло большое значение.
дело в том что кресло может быть на расстоянии и 1 метр и 3 метра тоесть задавать какие то условия не получится, ибо в разное время кресло может быть в разном удалении.
Если бы была возможность каждое значение записывать в переменную, то переменные бы можно было сравнивать, и скажем если одна отличается от предыдущей на допустим более чем 30% то приравнивать её к предыдущей. Но и здесь, подскажите, как записывать данные из потока в переменные ?
буду пробовать, спасибо :) здесь я насколько понимаю данные пишутся каждую милисикунду с аналогово ввхода ?
давайте тогда двинемся в глубь идеи... я вижу как бы несколько вопросов..
1.зачем мы опрашиваем датчик 10 раз в секунду? мы что мчимся со страшной скоростью и нам грозит опасность столкновения и десятая доля секунды играет роль?
2. а будем ли мы успевать опрашивать датчик 10 раз в секунду, когда код разрастется в процесе обработки?
3. NeiroN вам уже описал алгоритм вычисления неправильных данных
1. предполагается использовать датчик в полете, поэтому условно да, нужна реакция.
2. Честно скажу - не знаю пока еще.
3.Да, я ему написал что с записью значений из потока в переменные у меня тоже нелады.
Можно упростить, допустим 5 значений в секунду, как записывать значения в пять переменных, при чем так, чтобы они сменялись поочередно ?
Сбасибо, буду пробовать!
в первом приблежинии вот что получается. почему то в массив не попадают переменные.
http://vk.com/doc433721_198466807?hash=32f37a24ba43a3af14&dl=0797049695558e4998
distance_sm это переменная, которая и есть поток. значения в окошке 3 - это три сантиметра. нули это данные из массива
обявление и установку переменной надо вынести за цикл, чтобы оно не сбрасывало значения. проверяйте код пошагово - с пониманием для чего нужна каждая строка.
Все сводится к фильтру калмана.
Товарищи, кто-нибудь занимался фильтрованием сигналов ? Я из любопытства спрашиваю, ничего объяснять мне не надо :)
Я в подобной ситуации (датчик расстояния) воспользовался функцией отсюда : http://playground.arduino.cc/Main/DigitalSmooth
"A digital smoothing filter for smoothing sensor jitter
This filter accepts one new piece of data each time through a loop, which the
filter inputs into a rolling array, replacing the oldest data with the latest reading.
The array is then transferred to another array, and that array is sorted from low to high.
Then the highest and lowest %15 of samples are thrown out. The remaining data is averaged
and the result is returned."
Добрый день. Извиняюсь за может не столь интересный вопрос, но столкнулся с проблемой можно сказать на прямом месте.
Создаю CW ключ морзе с памятью. Есть массив в который записывается нажатия 1й или 2й кнопки (1 или 2), и по задумке после 10ти нажатий эта последовательность символов улетает в EEPROM в определённую ячейку.
Вопросик:
Массив работает, но при каждой интерации цикла for записывается новая цифра, а надо чтоб сразу 10ть символов улетела в память.
(примерто такого вида нужно EEPROM.writeLong(addrEeprom, 1212121211;) а к сожелению записывается последняя цифра массива "1")
Как правильно организовать запись массива в память?
Заранее благодарю!
https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80
Вот здесь алгоритм обработки именно для таких случаев.
А здесь даже реализация на Си есть http://chipenable.ru/index.php/embedded-programming/item/203-mediannyy-filtr.html
Хм... Изучив код примера.... Немного не понял... А причём тут МЕДИАННЫЙ ФИЛЬТР? Если вопрос идет о том как записать массив не с помощью последовательных интераций (может и так), а как-то иначе, чтоб EEPROM записал сразу 10 цифр а не перебирал, выбрав только одну....?
Дело в том, что на датчике иногда проскакивают неадекватные значения, чтобы их фильтровать я хочу писать каждую секунду данные в массив, и каждую же секунду высчитывать среднее значение из всех записанных значений с массиве. По моим предположениям неадекватные значения в таком случае сильного возмущения не принесут.
Медианный фильтр убирает неадекватные значения. Это его предназначение. После него простого бегушего среднего будет достаточно для адекватного значения.
А как же быть с моим вопросом, неужели никто не подскажет..?
Все! Разобрался сам, просёрфив не одну тонну интернета.
Вот может кому и пригодится, к примеру таким искателям как я. Использовал стандартную библиотеку :#include <EEPROMex.h>
Приведён пример на все случаи жизни: