подскажите как, в каком формате, и в какой памяти хранить данные
- Войдите на сайт для отправки комментариев
Чт, 03/03/2022 - 13:37
Здравствуйте, при разработке устройств возникает вопрос, как хранить данные с датчиков в микроконтроллере, какую память выбрать для этого, допустим мерю напряжение, токи, 3 фазной сети, также данные с других ацп получаю, часов реального времени, в общем много цифр, понимаю eeprom не пойдет в этой задачи, оперативка тоже закончится быстро, SD карту использовать не хочется, может есть какие ни будь варианты о которых я не слышал и не знаю?
плпробуйте оценить обьем данных, которые надо хранить - от этого зависит ответ
При больших объемах правильнее передавать на удаленный "сервер" (а там складывать в СУБД).
Для относительно небольших - внешняя EEPROM (можно ознакомиться).
объем данных большой, в субд складывать буду, но когда нет интернета допустим месяц, а данные летят каждую секунду
но когда нет интернета допустим месяц, а данные летят каждую секунду
Вы не с того начинаете. Прежде чем задавать вопрос, вам надо прикинуть РЕАЛЬНО НЕОБХОДИМЫЙ обьем данных - причем прикинуть в числах, а не в категориях "большой" или "маленький".
И не ждите, что кто-то посчитает это за вас. У вас же есть число параметров? Вы знаете размер каждого параметра в байтах? вы знаете частоту их записи? - перемножьте эти три числа - получите обьем данных в час или в сутки. Посчитайте и напишите сюда.
И советую "урезать осетра". Вы уверены, что "напряжения и токи трехфазной сети, записанные каждую секунду" - вам будут нужны через месяц? В любом случае надо остановится на каком-то разумном уровне - например писать данные раз в минуту или реже... или, напрмер, хранить архив за сутки, потом затирать.
При больших объемах правильнее передавать на удаленный "сервер" (а там складывать в СУБД).
Для относительно небольших - внешняя EEPROM (можно ознакомиться).
Подписался
Хранить данные в EEPROM лучше в структуре, ИМНО...периодически сбрасывая в СУБД
Надо собирать стенд и анализировать какие данные идут. Может быть имеет смысл не все данные писать, а только изменившиеся от последнего записанного значения (или при превышении какого-то "допуска")? Тогда, если в основном идут одинаковые данные и лишь иногда возникает "что-то", то записей будет гораздо меньше.
идея отличная!!! спасибо!
но когда нет интернета допустим месяц, а данные летят каждую секунду
Вы не с того начинаете. Прежде чем задавать вопрос, вам надо прикинуть РЕАЛЬНО НЕОБХОДИМЫЙ обьем данных - причем прикинуть в числах, а не в категориях "большой" или "маленький".
И не ждите, что кто-то посчитает это за вас. У вас же есть число параметров? Вы знаете размер каждого параметра в байтах? вы знаете частоту их записи? - перемножьте эти три числа - получите обьем данных в час или в сутки. Посчитайте и напишите сюда.
И советую "урезать осетра". Вы уверены, что "напряжения и токи трехфазной сети, записанные каждую секунду" - вам будут нужны через месяц? В любом случае надо остановится на каком-то разумном уровне - например писать данные раз в минуту или реже... или, напрмер, хранить архив за сутки, потом затирать.
102 байта в секунду, хранить нужно 1 месяц минимум это 258.59 Кбайт в час получается 260мб в месяц, или что то не понимаю, в общем строка примерно такая будет
102 символа с пробелами
так щас посмотрю и думаю что я туплю жестко, бред написал, каждое число надо засунуть в переменную и тогда получатся копейки
в общем строка примерно такая будет
102 символа с пробелами
давайте начнем с того, что хранить это в виде строки - очевидная дурость. Храните в бинарном виде - будет занимать в 3-4 раза меньше места.
Во вторых, вся тема у меня вызывает впечатление, что вы толком не понимаете, что это за данные идут с прибора и зачем это вам - а просто хочется похвастать за пивом, что. мол, "у меня все данные про электросеть пишутся за кажный месяц".
Не страдайте ерундой.
так щас посмотрю и думаю что я туплю жестко, бред написал, каждое число надо засунуть в переменную и тогда получатся копейки
Если сохранять каждую секунду в течении месяца - копейки все равно перерастут в мегабайты.
А вот то что "бред написал" - это согласен, думаю желание это все записывать - это просто блажь новичка, впервые дорвавшегося до измерительных приборов, реально вам вообще не нужна эта информация.
47 байт получается 165,23кб в час
47 байт получается 165,23кб в час
ну вот и берите тут микруху, что вам BOOM в сообщении #2 посоветовал - ее хватит на 2 часа. дальше будете перезаписывать.
А. нет, ошибся... там же в килобитах, а не в килобайтах :) Той памяти хватит на 15 минут, примерно :)
На месяц вам нужно примерно 120 Мбайт... не стадайте херней
так щас посмотрю и думаю что я туплю жестко, бред написал, каждое число надо засунуть в переменную и тогда получатся копейки
Если сохранять каждую секунду в течении месяца - копейки все равно перерастут в мегабайты.
А вот то что "бред написал" - это согласен, думаю желание это все записывать - это просто блажь новичка, впервые дорвавшегося до измерительных приборов, реально вам вообще не нужна эта информация.
это я щас пишу что нужно в максималке, потому что надо анализировать инвертора, для реального мониторинга будет раз в 5 минут, но такую градацию надо оставить тоже, и она должна хранится ну согласен месяц это дурость, неделю точно, для поиска багов разных систем
47 байт получается 165,23кб в час
ну вот и берите тут микруху, что вам BOOM в сообщении #2 посоветовал - ее хватит на 2 часа. дальше будете перезаписывать.
А. нет, ошибся... там же в килобитах, а не в килобайтах :) Той памяти хватит на 15 минут, примерно :)
На месяц вам нужно примерно 120 Мбайт... не стадайте херней
да 32 Кб маловато)
она должна хранится ну согласен месяц это дурость, неделю точно, для поиска багов разных систем
тогда только внешнее хранение. На неделю вам нужно примерно 40 Мбайт емкости, для внешнего сервера это копейки, а для микроконтроллера очень прилично.
ну или все-таки делайте на СД-карточке. Только при частом скидывании на нее данных карточки будут дохнуть.
она должна хранится ну согласен месяц это дурость, неделю точно, для поиска багов разных систем
тогда только внешнее хранение. На неделю вам нужно примерно 40 Мбайт емкости, для внешнего сервера это копейки, а для микроконтроллера очень прилично.
ну или все-таки делайте на СД-карточке. Только при частом скидывании на нее данных карточки будут дохнуть.
вот я тоже об этом всем думал, и надеялся что я чего то не знаю, вдруг есть чип энергонезависемый с огромным количеством циклов перезаписи и емкостью мегабайт на 100
она должна хранится ну согласен месяц это дурость, неделю точно, для поиска багов разных систем
тогда только внешнее хранение. На неделю вам нужно примерно 40 Мбайт емкости, для внешнего сервера это копейки, а для микроконтроллера очень прилично.
ну или все-таки делайте на СД-карточке. Только при частом скидывании на нее данных карточки будут дохнуть.
выгрузка на сервер это первоочередное, но когда нет свзязи с сервером и отключилось устройство еще через какое то время - не хочу потерять данные
все отказываюсь от этой идеи))) при записи раз в минуту надо 16мбит при записи раз в 5 минут нужно 3,2мбита, остановлюсь на
AT25DF161-SH-T, Последовательная Flash-память с интерфейсом SPI, 16Мбит
как раз 100 000 циклов перезаписи, раз в месяц ее перезаписывать это для нее ерунда, когда нужно будет получать мгновенные данные, буду выгружать их через rs485 либо другой какой нибудь интерфейс, даже UART сразу на комп, там можно и 200 значений в секунду собирать
посмотрите еще серию w25q - они дешевле и более распространенные
посмотрите еще серию w25q - они дешевле и более распространенные
о спасибо большое! 2 раза дешевле) будем пробовать
о спасибо большое! 2 раза дешевле) будем пробовать
только там SPI. обратите внимание
для поиска багов разных систем
тогда прямая запись в SQL
Для похожих целей я использую FRAM
Существуют разные стратегии хранения данных. Например, если точность не аптечная, то писать можно не каждую секунду, а когда изменится значение метрики, загрубляя полученные данные. Каждую минуту/пятиминутку писать опорное значение, чтобы таймлайн не рассыпался и графики были без дырок.
Да я и говорю - смотря какие данные идут и какой анализ им нужен. Если нужно, к примеру, только учитывать факт отключения ЭЭ, так зачем каждую миллисекунду писать данные?)))
+1. Доводилось писать лог в 2мб Flash. Только события, только при изменении. И даже без регулярных опорных значений - многолетняя практика показала что не нужны они.
может есть какие ни будь варианты о которых я не слышал и не знаю?
Вот тут описан замечательный аппарат на Ардуино, который умеет ручкой на бумажке записывать. Умеет не только тексты, но и рисунки, и графики.
Аппаратную часть можно не делать, а купить готовую.
может есть какие ни будь варианты о которых я не слышал и не знаю?
Вот тут описан замечательный аппарат на Ардуино, который умеет ручкой на бумажке записывать. Умеет не только тексты, но и рисунки, и графики.
Аппаратную часть можно не делать, а купить готовую.
ахахах)) спасибо))
поправьте может я не правильно понимаю? имею данные 54 байта в секунду и микросхема 16мбит получается если 54 байта раз в секунду то минута это 1620 байт, час 48600 байт, сутки 1166400 байт, год 42573600 байт * 8 / 1024 / 1024 = 3249мбит / 16 = 203 перезаписи в год, получается если циклировать постоянно память то у меня будет примерно 492 года что бы ее убить??? по даташиту на AT25DF161 - 100000 циклов перезаписи, в общем за 10 лет такого использования у меня возможно даже сыпаться память не начнет? даже если не напишу оптимизатор записи
По моему у вас калькулятор сломался. 16 мбит это 2 мбайта. 54 байта в секунду *60*60=194,4 кбайта в час итого на сутки вам потребуется более 4,6 мбайт памяти. А вашей микросхемы хватит менее чем на полсуток. Ресурс микросхемы закончится на вторые сутки если каждую секунду будет приходить обновление К тому же надо ещё учитывать, что запись в микросхему по времени, всегда намного больше, чем чтение.
В вашем случае, я бы применил математику и аппроксимировал результаты.
А вообще, если ваша задача лежит в области измерений напряжений и токов на высоковольтных линиях питания, то проще купить трехфазный UPS какой нибудь серьезной конторы где уже давно производители встроили все измерения (с настройками дискретности и построением графиков) и сливать результаты раз в сутки ручками не изобретая велосипед. Для диссертации вам этого хватит.
если 54 байта раз в секунду то минута это 1620 байт
судя по этим цифрам, у вас в минуте 30 секунд...
если 54 байта раз в секунду то минута это 1620 байт
судя по этим цифрам, у вас в минуте 30 секунд...
да случайно, ну разделим цифру " 492 года" на 2 и все равно запас огромный
Ресурс микросхемы закончится на вторые сутки если каждую секунду будет приходить обновление
нет, если сначала писать последовательно до конца, а потом разом все стирать.
По моему у вас калькулятор сломался. 16 мбит это 2 мбайта. 54 байта в секунду *60*60=194,4 кбайта в час итого на сутки вам потребуется более 4,6 мбайт памяти. А вашей микросхемы хватит менее чем на полсуток. Ресурс микросхемы закончится на вторые сутки если каждую секунду будет приходить обновление К тому же надо ещё учитывать, что запись в микросхему по времени, всегда намного больше, чем чтение.
В вашем случае, я бы применил математику и аппроксимировал результаты.
А вообще, если ваша задача лежит в области измерений напряжений и токов на высоковольтных линиях питания, то проще купить трехфазный UPS какой нибудь серьезной конторы где уже давно производители встроили все измерения (с настройками дискретности и построением графиков) и сливать результаты раз в сутки ручками не изобретая велосипед. Для диссертации вам этого хватит.
да тут речь не идет уже через сколько память на ней закончится, а именно ресурс и как вы посчитали что на вторые сутки микруха сдохнет? калькулятор у вас сломался похоже, 54 байта *60*60 = 189.8кб - это раз, второе - это 4.44мб в сутки согласен, в год 1624мб делим на 2(память микрухи) = 812 получаем циклы перезаписи в год, уножаем на 10 лет - 8120 циклов перезаписи при ресурсе 100 000 циклов
имею данные 54 байта в секунду
Вы это писали? Тогда я вам привёл расчет, если вы будете сохранять все данные (54 байта) каждую секунду то 100000 циклов закончатся через 27,7 часов (100000/3600) Если будете сохранять каждые 5 минут то ресурс закончится через 333,3 часа или 14 суток. Поймите одно, как только вы переводите микросхему в режим записи/стирания, это -1 цикл. И не важно сколько вы будете ячеек записывать или стирать (хоть одну, а стирание - это запись в ячейку 0xFF). Сравнить можно с аккумуляторами на ноутбуки, где производитель указывает 500 циклов заряд/разряд. Некоторые контроллеры таких батареек даже счетчики имеют. Поставил на заряд - 1 цикл получи. Вот по этому банками не удаётся решить проблему, надо сбрасывать счетчик в мозгах, что не всегда удается.
Поймите одно, как только вы переводите микросхему в режим записи/стирания, это -1 цикл. И не важно сколько вы будете ячеек записывать или стирать (хоть одну, а стирание - это запись в ячейку 0xFF).
SAB, вы уже второй раз это пишете.
Думаю вы неправы. Счетчик циклов относится к каждому 4Кбит-ному блоку ОТДЕЛЬНО и только к операции стирания ( запись в ячейку 0xFF).
Если стереть разом весь чип и потом писать данные последовательно - счетчик будет увеличиваться один раз на запись всего чипа, а не на каждые 54 байта, как вы пытаетесь запугать ТС
Если одни и теже ячейки писать, то да. Тут надо по другому. По принципу ssd, где пишутся и потом (без стирания, на сколько я знаю) перезаписываются все свободные ячейки памяти, за это отдельный контроллер там отвечает.
Надо ознакомиться с https://ru.wikipedia.org/wiki/FIFO и сделать выводы по организации перезаписи памяти правильно.
b707 опередил сообщением ))
Продолжу тему про флешь память, вопрос в следующем:
создал массив данных которые надо "скармливать" функции для разбивки на байты, могу закидывать их в флешь, но вот вопрос, есть куча переменных разделенных на байты, если скормить все в флешь - не смогу определить где начало, где конец, так же переменные с значением 0 и 255, и вообще любое число где делится на байты 255, допустим 65281 делится на 255 и 1, какие маркеры выставлять в таком случае?
идут числа допустим в одной посылке:
134, 255, 64809, 544, 65281, 0, 1.
в памяти они запишутся как:
134, 255, 253 и 41, 2 и 32, 255 и 1, 0, 1.
пишите все переменные в одном размере, например как двухбайтовые
Если количество датчиков (с которых идут данные) конечно и не слишком велико, то можно "завернуть" их в структуру, тогда писать в EEPROM можно целиком структуру (а не отдельно). А сдвиг (если нужен) - на размер той самой структуры. Но это я только рассуждаю, я не до конца понимаю в чем там проблема в #41 у ТС.
я не до конца понимаю в чем там проблема в #41 у ТС.
похоже он не понимает. что такое uint8 uin16 uint32 и как они устроены
я не до конца понимаю в чем там проблема в #41 у ТС.
похоже он не понимает. что такое uint8 uin16 uint32 и как они устроены
Ну если так - то структура это отличное решение ))
Если количество датчиков (с которых идут данные) конечно и не слишком велико, то можно "завернуть" их в структуру, тогда писать в EEPROM можно целиком структуру (а не отдельно). А сдвиг (если нужен) - на размер той самой структуры. Но это я только рассуждаю, я не до конца понимаю в чем там проблема в #41 у ТС.
в том что большинство данных будут иметь по 2 байта максимум основное время и в редких случаях по 3 и 4 байта, поэтому хотел экономить место в памяти, но походу нет никакого сверхумного решения этой задачи кроме как добавлять целый байт индекса, но это намного ухудшит ситуацию с занимаемым местом в памяти... ну и у меня нет eeprom, но сути это не меняет конечно
я не до конца понимаю в чем там проблема в #41 у ТС.
похоже он не понимает. что такое uint8 uin16 uint32 и как они устроены
ну вроде количество байт uint 8 - 1 байт в 16 - 2 в 32 - 4 в переменной?
просто предположим зачем мне отдавать под 4 байта памяти для числа 2350? но раз в месяц оно может прыгнуть до 935000 и тогда надо будет 3 байта для хранения, а может пол месяца оно будет в 0, снова структуру из 4 байт отдавать под 0?
кроме как добавлять целый байт индекса, но это намного ухудшит ситуацию с занимаемым местом
один байт индекса на сколько там... на 55 байт записи - сильно ухудшит ситуацию?
просто предположим зачем мне отдавать под 4 байта памяти для числа 2350? но раз в месяц оно может прыгнуть до 935000 и тогда надо будет 3 байта для хранения, а может пол месяца оно будет в 0, снова структуру из 4 байт отдавать под 0?
а иначе никак
просто предположим зачем мне отдавать под 4 байта памяти для числа 2350? но раз в месяц оно может прыгнуть до 935000 и тогда надо будет 3 байта для хранения, а может пол месяца оно будет в 0, снова структуру из 4 байт отдавать под 0?