Запись в файл, поиск среднего значения

sasa11111
Offline
Зарегистрирован: 28.04.2021

Есть датчик BME280, выводящий температуру, влажность и т.д. Чтобы найти среднее значение показаний (например за сутки) нужно создать массив для каждого показателя и записывать показания туда? И после в for найти среднее делением суммы значений на их кол-во? 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Среднее какое - арифметическое, медианное, кошачье, агрххброидальное?

rkit
Offline
Зарегистрирован: 23.11.2016

Не надо каждую запись хранить, достаточно сразу складывать результаты.

sasa11111
Offline
Зарегистрирован: 28.04.2021

Арифметическое

sasa11111
Offline
Зарегистрирован: 28.04.2021

Получается - arr[i] = bme.readTemperature(); ?

b707
Offline
Зарегистрирован: 26.05.2017

sasa11111 пишет:

Получается - arr[i] = bme.readTemperature(); ?

не надо сохранять каждое, ответили уже

У ардуины нет столько памяти, что бы каждое измерение хранить

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

sasa11111

Лучше всего данные с ардуино пересылать в какую-нибудь внешнюю базу данных с привязкой каждого значения к дате и времени. А потом уже обрабатывать эти данные как хотите.

Но в названии темы ещё есть часть "Запись в файл". Это как связанно с поиском среднего? Может запись на SD, а потом обработка сохранённых данных?

b707

Может запись температуры будет производиться один раз в час.

b707
Offline
Зарегистрирован: 26.05.2017

AndreyD пишет:

Может запись температуры будет производиться один раз в час.

зная новичков - маловерятно :) Скорее с той скорсстью, что может обеспечить Луп :)

sasa11111
Offline
Зарегистрирован: 28.04.2021

Спасибо, понял. А как можно реализовать "фиксацию пожара"? Т.е., берется 2 значения, условно первое и значение через 2 минуты, и если t2-t1 > 15, то пищалка будет пищать. Предполагаю, что нужно создать переменную отвечающую за "первую температуру" и каждые 2-3 минуты вычитать ее из нынешней, но как это оформить не особо понимаю.

sasa11111
Offline
Зарегистрирован: 28.04.2021

Да, запись производится 1 раз в час.

b707
Offline
Зарегистрирован: 26.05.2017

sasa11111 пишет:

Предполагаю, что нужно создать переменную отвечающую за "первую температуру" и каждые 2-3 минуты вычитать ее из нынешней, но как это оформить не особо понимаю.

не знаете как вычесть одно значение из другого?

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Пожар же, вроде, датчиками дыма в последнее время "фиксируется". А так, условно, температура воздуха больше 100 градусов = пожар. 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

sasa11111 пишет:

Да, запись производится 1 раз в час.

Ну тогда мне видится так, массив из 24 значений и каждый час он обновляется, где i будет часом. В результате в любой момент можно будет вычислить среднее арифметическое за последние 24 часа. Т.е. сумма всех элементов массива делённое на 24.

sasa11111
Offline
Зарегистрирован: 28.04.2021

А как тогда контролировать, что час прошел? millis() использовать ?
 

b707
Offline
Зарегистрирован: 26.05.2017

sasa11111 пишет:

А как тогда контролировать, что час прошел? millis() использовать ?
 

а сейчас как вы записываете данные раз в час? - делайте точно так же

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

sasa11111

Если не сложно опишите подробнее, что у вас за проект, и что уже есть, что хотите добавить, более подробнее.

И желательно опишите на каком уровне вы знаете схемотехнику и программирование. Это не от недоверия к вам, а только от того что ваша дата регистрации сегодня.

sasa11111
Offline
Зарегистрирован: 28.04.2021

Проект примитивный - домашняя метеостанция. Могу скинуть код, что уже написано. Из того, что я бы еще добавил - уже набившая оскомину "запись в файл", отправка значений на телефон посредством wifi/bluetooth модуля, ну и возможно отрисовка графиков исходя из значений датчиков.
Уровень схемотехники - чайник, уровень программирования(C++) - конец 1 курса, где все заточено под ООП.

sadman41
Offline
Зарегистрирован: 19.10.2016

Для отрисовки исторические данные нужно хранить всяко.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

"домашняя метеостанция" ? Может "умный дом"?

Посмотрите https://mjdm.ru/

А ардуино будет элементами.

b707
Offline
Зарегистрирован: 26.05.2017

sasa11111 пишет:

нужно создать переменную отвечающую за "первую температуру" и каждые 2-3 минуты вычитать ее из нынешней, но как это оформить не особо понимаю.

что, на "программировании под ООП" вычитание не изучают? :)

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Лучше сразу посмотреть в сторону, как сервера, и к сети можно подключить, и ЖД добавить https://aliexpress.ru/item/32946082975.html?spm=a2g0o.productlist.0.0.502b68f0OxadJG&algo_pvid=ce210087-2a20-4c50-b723-93bd0963c211&algo_expid=ce210087-2a20-4c50-b723-93bd0963c211-0&btsid=0b8b158f16196268392272010e528d&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_&sku_id=66262196432

И Wi-Fi и "блюпуп".

sasa11111

Просто я тоже начинал с простой ардуинки, потом AMS (Ардуино мега сервер), потом перешёл на одноплатник, а ардуинки данные передают по локалке и команды исполняют или автономно работают когда надо. У меня сейчас Cubiebord7 стоит в качестве сервера.

rkit
Offline
Зарегистрирован: 23.11.2016

Для скользящего среднего тоже не нужно держать целого массива, достаточно IIR-фильтра.

out(n) = (in(n) + out(n-1) * 23) / 24

Это не будет идеальное среднее арифметическое, но разница мизерная.