Среднее значение за час, два, четыре.
- Войдите на сайт для отправки комментариев
Привет всем!
Есть датчик давления/влажности/температуры. Датчики опрашиваются не равномерно, цикл опроса примерно 1 раз в 3 минуты или чаще (для экономии аккумулятора). Примерно. т.е. может быть опрос раз в 1 минуту, а может быть и 1 раз в 3 минуты.
Есть маленький экранчик, где можно вывести примерно 10 столбиков.
Хочется вывести: Первый столбик "актуальное значение" Второй: среднее за минуту... 5-среднее за прошлые 2-4 часа, 10-среднее за прошедшие 4-8 часов. т.е. не просто усредненные значения, а усредненные исторические значения.
Не понимаю каким образом хранить/формировать данные.
Важно: Все должно разгоняться автоматически. т.е. после 4-х часов работы после включения значение среднего за 4 часа должно соответвовать "первому значению после включения" или, первому среднему за минуту, потому, что датчики прогреваются примерно 3 минуты, и первые значения выдают левые.
В идеале, для каждого датчика хранится массив из 10 данных, не больше.
Подскажите, как такое называется по английски, по каким ключевым словам гуглить.
Спасибо.
Как Вы это себе представляете, если данные получаете раз в минуту или в три? Увеличивайте количество выборок или интервал времени.
Например, есть задача получить актуальное значение, среднее за час и среднее за сутки.
Выводите в столбик актуальное значение и, пока не накопилась статистика, в "часовой" столбик выводите его же.
Накапливаете статистику, суммируя каждую минутную выборку в переменную. По истечении часа (60 измерений) можете разделить результат на количество выборок, получив среднее за час. Его вывОдите в "часовой" столбик. Этот же результат суммируете в третью переменную ("суточную"). По истечении 24 измерений расчитываете среднее значение и выводите в "суточный" столбик.
Можно перевести? Т.е. среднее из предыдущих средних?
Зачем массив?
Average value
Привет!
Мой основной язык, это Ява.. Думаю более глобально. Не хочется писать отдельную логику для каждого столбца.
1. Я не хочу хранить отдельные значения сенсора. Просто потому, что их очень много. Сенсоров тоже не один и не 3. Один из них капризный, мериет 1 раз в 3 минуты.
2. Обработка даных производится в for цикле. Так же желательно память динамически не выделять. т.е. массив по минутам : 2-4-16-32-64 (это час!)
Правильно. В 4-х часовом столбике должно показываться среднее за период 4..8 часов "старости"
Это не правильно, так искать в гугле. потому, что это будет среднее за последне 4 часа. А мне надо что бы данные за последние 4 часа не учитывались. Кроме того типичное среднее отстает, от реального значения. Этого тоже надо избежать.
#29
Вот в этой теме подобное жевали.http://arduino.ru/forum/programmirovanie/vychislenie-srednego-arifmeticheskogo-s-dannykh-kotorye-prikhodyat-raz-v-10-s
Хочется вывести: Первый столбик "актуальное значение" Второй: среднее за минуту... 5-среднее за прошлые 2-4 часа, 10-среднее за прошедшие 4-8 часов. т.е. не просто усредненные значения, а усредненные исторические значения.
Не понимаю каким образом хранить/формировать данные.
Для начала нужно уточнить, что такое "среднее за минуту"? В частности, как часто оно должно обновляться? Каждое измерение или раз в минуту?
Для начала нужно уточнить, что такое "среднее за минуту"? В частности, как часто оно должно обновляться? Каждое измерение или раз в минуту?
Может обновляться раз в минуту.
Тогда для каждого значения по две переменные, хранящие значение параметра: накапливаемое и индицируемое (предыдущее) + переменные, отсчитывающие время измерения.
Тогда для каждого значения по две переменные, хранящие значение параметра: накапливаемое и индицируемое (предыдущее) + переменные, отсчитывающие время измерения.
К сожалению это подходит только для первого столбца " среднее за минуту".
В пятом столбце стоят данные "среднее за 2 часа назад." т.е. среднее по данным, которые были собраны 2..4 часа назад. Акутальные данные (резкие изменения погоды) никак не должны влиять на "исторические столбцы"
Кроме того пока не понятно, сколько данных выдает сенсор. Один сенсор может быть опрошен в любое время. Другой выдает 1 измерение в 3 минуты. Хочется написать универсальную функцию, которой кормишь номер и значение датчика, а время и количество измерений она уже считает сама.
Кроме того пока не понятно, сколько данных выдает сенсор. Один сенсор может быть опрошен в любое время. Другой выдает 1 измерение в 3 минуты. Хочется написать универсальную функцию, которой кормишь номер и значение датчика, а время и количество измерений она уже считает сама.
Если вы сами это не определите в виде, например, таблицы - откуда же функция возьмет частоту опроса датчика?
Если актуальные данные не должны влиять на исторические, то когда будут обновляться исторические данные если они показывают измерения "за 2-4 часа назад"? Ну т.е. есть время Ч, допустим у вас все правильно показывается во всех столбцах. Наступает момент времени Ч+1минута, обновляются мгновенные значения, при этом не влияя на исторические и тогда в 5м столбце что будет? исторические данные за 2:01-4:01? А то что вы пытаетесь реализовать похоже на просто интервал выборки, как из баы данных, выбрали данные за 04.12.2017 число с 12:00 по 14:00.
Если актуальные данные не должны влиять на исторические, то когда будут обновляться исторические данные если они показывают измерения "за 2-4 часа назад"? А то что вы пытаетесь реализовать похоже на просто интервал выборки, как из баы данных, выбрали данные за 04.12.2017 число с 12:00 по 14:00.
Спасибо за комментарий. Эту проблему я уже понял. Я ищу решение. Не понимаю в какую сторону.
Я стараюсь не перфекционировать, и мне проще, чтобы 4-х часовой столбик обновляется раз в 2 часа. Ищется любое простое решение.
Главное что бы там были реальные данные за ночь, а не не понятное усредненное значение, точность которого зависит от скорости изменения величины.
Если вы сами это не определите в виде, например, таблицы - откуда же функция возьмет частоту опроса датчика?
Я к тому, что:
1. Есть несколько датчиков, частота обновления их разная. Считать плавающее среднее по одной схеме для всех датчиков нельзя.
2. Возможное решение модуль принимае усредненное значение температуры за минуту, и реальное, не усредненное значение датчика СО2.
К сожалению это подходит только для первого столбца " среднее за минуту".
В пятом столбце стоят данные "среднее за 2 часа назад." т.е. среднее по данным, которые были собраны 2..4 часа назад. Акутальные данные (резкие изменения погоды) никак не должны влиять на "исторические столбцы"
Какие проблемы?
То, что было записано в ячейке 0..2 через 2 часа тупо переписывается в ячейку 2..4 (а еще через два - 4..6)
Кроме того пока не понятно, сколько данных выдает сенсор. Один сенсор может быть опрошен в любое время. Другой выдает 1 измерение в 3 минуты. Хочется написать универсальную функцию, которой кормишь номер и значение датчика, а время и количество измерений она уже считает сама.
И какие проблемы?
Я бы посоветовал еще задавать при инициализации объекта интервал опроса, после чего на каждом проходе цикла, не задумываясь, вызывать mySensor.loop();
То, что было записано в ячейке 0..2 через 2 часа тупо переписывается в ячейку 2..4 (а еще через два - 4..6)
Спасибо за ответ по делу. Примерно так я и хочу сделать. У меня шаг - логарифмический. два в степени для простоты.
Как сделать так, что бы функция ShiftData вызывалась раз в 32-64-128 минут?
ShiftData(4) - раз в 32 минуты.
ShiftData(5)- раз в 64 минуты.
ShiftData(6) раз в 128 минут.
То, что было записано в ячейке 0..2 через 2 часа тупо переписывается в ячейку 2..4 (а еще через два - 4..6)
это неверный подход. Если так делать, тогда через нечетное число часов в столбце "0..2" будут данные только за последний час, в столбце 2..4 - на самом деле данные с 1 до 3х часов назад и тд Чтобы диапазоны 0..2 , 2..4 и тд работали правильно, данные из диапазона в диапазон надо переносить при каждом новом измерении температуры, пересчитывая все средние.
Если хотите уменьшить работу - привяжите диапазоны не к текущему моменту ("столько-то часов назад"), а к реальном времени. Например, если сейчас на часах 14:40, то у вас должны быть диапазон со свежими данными с "14 до 16" и архивные - с 12 до 14, с 10 до 12 и тд
Кстати, диапазоны, подписанные реальным временем, будут восприниматься значительно нагляднее, чем заморочное "8 часов назад".
Спасибо за ответ по делу. Примерно так я и хочу сделать. У меня шаг - логарифмический. два в степени для простоты.
для двухчасовых данных:
0 - текущая ячейка для накопления, не индицируется,
1 - ячейка, которая закончила наполняться 0-2 часа назад - первая индицируемая (0..2),
2 - ячейка, которая закончила наполняться 2-4 часа назад - вторая индицируемая (2..4),
в момент, кода закончилось наполнение 0-й ячейки происходит следующее:
- каждый 2-й раз ячейка 4..8 переносится из ячейки 0..4, после чего в последнюю записывается полусумма ячеек 1 и 2,
- ячейка 2 переносится из ячейки 1, после чего в последнюю заносится знчение, вычисленое из ячейки 0,
Как сделать так, что бы функция ShiftData вызывалась раз в 32-64-128 минут?
ShiftData(4) - раз в 32 минуты.
ShiftData(5)- раз в 64 минуты.
ShiftData(6) раз в 128 минут.
нужно вызываеть ее кавждый проход цикла, а уже внутри анализировать переходы через определенные границы.
Кстати, диапазоны, подписанные реальным временем, будут восприниматься значительно нагляднее, чем заморочное "8 часов назад".
Угу,согласен, что красивее будет. только индикаторчик слижком маленький...
У меня реально влезает только 3 строчки. 24*32 пикселей... Особо не разбежишься.