Запись в файл, поиск среднего значения
- Войдите на сайт для отправки комментариев
Ср, 28/04/2021 - 16:22
Есть датчик BME280, выводящий температуру, влажность и т.д. Чтобы найти среднее значение показаний (например за сутки) нужно создать массив для каждого показателя и записывать показания туда? И после в for найти среднее делением суммы значений на их кол-во?
Среднее какое - арифметическое, медианное, кошачье, агрххброидальное?
Не надо каждую запись хранить, достаточно сразу складывать результаты.
Арифметическое
Получается - arr[i] = bme.readTemperature(); ?
Получается - arr[i] = bme.readTemperature(); ?
не надо сохранять каждое, ответили уже
У ардуины нет столько памяти, что бы каждое измерение хранить
sasa11111
Лучше всего данные с ардуино пересылать в какую-нибудь внешнюю базу данных с привязкой каждого значения к дате и времени. А потом уже обрабатывать эти данные как хотите.
Но в названии темы ещё есть часть "Запись в файл". Это как связанно с поиском среднего? Может запись на SD, а потом обработка сохранённых данных?
b707
Может запись температуры будет производиться один раз в час.
Может запись температуры будет производиться один раз в час.
зная новичков - маловерятно :) Скорее с той скорсстью, что может обеспечить Луп :)
Спасибо, понял. А как можно реализовать "фиксацию пожара"? Т.е., берется 2 значения, условно первое и значение через 2 минуты, и если t2-t1 > 15, то пищалка будет пищать. Предполагаю, что нужно создать переменную отвечающую за "первую температуру" и каждые 2-3 минуты вычитать ее из нынешней, но как это оформить не особо понимаю.
Да, запись производится 1 раз в час.
Предполагаю, что нужно создать переменную отвечающую за "первую температуру" и каждые 2-3 минуты вычитать ее из нынешней, но как это оформить не особо понимаю.
не знаете как вычесть одно значение из другого?
Пожар же, вроде, датчиками дыма в последнее время "фиксируется". А так, условно, температура воздуха больше 100 градусов = пожар.
Да, запись производится 1 раз в час.
Ну тогда мне видится так, массив из 24 значений и каждый час он обновляется, где i будет часом. В результате в любой момент можно будет вычислить среднее арифметическое за последние 24 часа. Т.е. сумма всех элементов массива делённое на 24.
А как тогда контролировать, что час прошел? millis() использовать ?
А как тогда контролировать, что час прошел? millis() использовать ?
а сейчас как вы записываете данные раз в час? - делайте точно так же
sasa11111
Если не сложно опишите подробнее, что у вас за проект, и что уже есть, что хотите добавить, более подробнее.
И желательно опишите на каком уровне вы знаете схемотехнику и программирование. Это не от недоверия к вам, а только от того что ваша дата регистрации сегодня.
Проект примитивный - домашняя метеостанция. Могу скинуть код, что уже написано. Из того, что я бы еще добавил - уже набившая оскомину "запись в файл", отправка значений на телефон посредством wifi/bluetooth модуля, ну и возможно отрисовка графиков исходя из значений датчиков.
Уровень схемотехники - чайник, уровень программирования(C++) - конец 1 курса, где все заточено под ООП.
Для отрисовки исторические данные нужно хранить всяко.
"домашняя метеостанция" ? Может "умный дом"?
Посмотрите https://mjdm.ru/
А ардуино будет элементами.
нужно создать переменную отвечающую за "первую температуру" и каждые 2-3 минуты вычитать ее из нынешней, но как это оформить не особо понимаю.
что, на "программировании под ООП" вычитание не изучают? :)
Лучше сразу посмотреть в сторону, как сервера, и к сети можно подключить, и ЖД добавить 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 стоит в качестве сервера.
Для скользящего среднего тоже не нужно держать целого массива, достаточно IIR-фильтра.
out(n) = (in(n) + out(n-1) * 23) / 24
Это не будет идеальное среднее арифметическое, но разница мизерная.