Логгер данных на карту памяти
- Войдите на сайт для отправки комментариев
создаю устройство по типу "умного дома", решил прикрутить логгер состояния датчиков на СД карте. хочу сделать так что б каждый день создавался новый файл, и в течении суток в него записывались данные. для этого прикрутил карту СД и часы реального времени. лог в файл пишется, но я никак не могу заставить ардуину создавать каждый день новый файл. пробывал функцию rtc.getDateStr(), но файл не создается. при этом функция rtc.getTimeStr() исправно создает новый файл каждую секунду. пробывал применить в качестве имени файла переменную,
FileName = rtc.getDateStr();
File dataFile = SD.open(FileName);
но компилятор ругается на функцию SD.open(FileName), типа нельзя в качестве имени задавать эту переменную, у нее не тот тип данный. второй день бьюсь, ничего не выходит.
Какой тип этой переменной?
а еще "в лоб" можно так:
Может кто подскажет - как определить свободное пространство на частично заполненной карте. Необходимо для ограничения количества записей в FileLoger. Поиск помучил.
делал тип переменной String и char, в обоих случаях компилятор ругается.
про свободное пространство
вот скетч из примера CardInfo библиотеки SD
в этом примере определяется размер всей памяти флеш-карты и выводится список файлов с их размером. так может взять общий размер карты и вычесть размеры всех файлов? решение говнокодное но в лоб.
>// list all files in the card with date and size
>111 root.ls(LS_R | LS_DATE | LS_SIZE);
вывод только на Serial? Как считать в переменную?
Просто так не перенаправить, но всегда можно сделать своё казино с блэкджеком и шшшироким функционалом :)
Надо только поправить два файла и будет счастье. А файлы такие: SdFat.h и SdFile.cpp
В SdFat.h после строки void ls(uint8_t flags = 0, uint8_t indent = 0); вставляем строку uint32_t UsedDiskSpace(uint8_t flags = 0);
Далее идём в файл SdFile.cpp и после метода void SdFile::ls(uint8_t flags, uint8_t indent) вставляем свою функцию. ТОЛЬКО НЕ ПОСЛЕ ЭТОЙ СТРОКИ А ИМЕННО ПОСЛЕ ВСЕГО МЕТОДА НЕ ТРОГАЯ ШТАТНУЮ ФУНКЦИЮ
На всякий случай делайте копии всех файлов! Только не оставляйте в той же папке либо расширение меняйте, не имя а именно расширение.
Ну а далее используя стандартный пример:
Вот собственно так я извращался когда мне надо было узнать свободное место. Может и проще как-то можно, но мне надо было на коленки за пол часа сделать и курить мануалы было некогда :)
По скорости работает немного быстрее чем ls. Мою 2гиговую карту на которой свободно 118 мегабайт и на которой куча мелких файлов и папок обсчитывает за пару секунд где-то.
делал тип переменной String и char, в обоих случаях компилятор ругается.
А почему char? Почему не указатель на массив символов, как это подсказывает здравый смысл?
Я вот не поленился, нашел библиотеку, в которой есть данная функция (DS1307.rar).
а там английским по белому написано:
Догадываетесь, почему вам никто не ответил сразу и конкретно?
запутался я с этими типами данных, и ни одного толкового мануала на русском не нашел.
2Penni
Благодарю. Работает.
Добавлю свои 5коп: считает размер файлов, но не размер на карте. Для моих задач ОК.
Что бы посчтать размер на карте нужно оклуглять размер каждого файла в большую сторону кратно 512 байтам. Расчет размера занятого места есть только в новой библиотеке, но там эта функция работает возмутительно медленно.
Расчет размера занятого места есть только в новой библиотеке, но там эта функция работает возмутительно медленно.
SD.h? В какой новой?
Люди, встречал кто логгер на ардуино с записью на SD? Ситуация срочная, нужно писать напряжения на 12 входах сразу. Дело в том, что есть модуль входов контроллера, если напряжение на входе 0-9В это логический ноль, если 9-30 это единица. Всё это работает вполне успешно, но в какой-то непонятный момент прилетает 220 или может 380 вольт и модуль целиком выгорает. Собственно момент невероятный и не возможный, но так происходит. Соответственно нужно мониторить несколько параметров сразу, чтоб потом восстановить ход событий и хотябы понять на какой именно вход прилетает импульс. Быстродействие должно быть максимальное, иначе высоковольтный импульс можно пропустить.
Может у кого есть заготовки кода под это дело, или подобный проект встречали?
Sirocco, ардуино не столь быстра что бы отслеживать короткие сигналы на 12 каналах. Вам нужно шифратор на FPGA делать, или купить готовый высокоскоростной анализатор на FPGA. + придётся сделать входной интерфейс с делителями и супрессорами для защиты самой платы контроля.
Или повесить на вход через мостик стабилитрон с пробивным на 50-100 Вольт, последовательно, с резистором для огранияения тока и вторым для привязки к земле..... Было бы два сигнала- посадить на прерывания.
trembo, кстати хорошая мысля! :) Можно посадить на PCINT прерывания их всего 3 штуки, но каждый по 8 входов захватывает. Так что 2х прерываний хватит аж на 16 каналов. И по сработке прерывания прочитать весь порт, с которого пришёл "звоночек ". Да, пожалуй на ардуине можно. Одно в новинку -я не помню, что б кто нить тут на форуме пользовался PCINTовскими прерываниями. Но вроде лехко...)
Ничё не понял. Дайте чёнить почитать на эту тему. А как сделать делитель я знаю. Программная часть для меня большая проблема.
Как вообще построить алгоритм? Ведь нужно, чтоб анализатор стоял хотябы пару суток, лучше пять. Но в то же время не пропустить событие... Наверное нужно очень быстро измерять, скажем 50 замеров писать в массив, смотреть нет ли резких отклонений между значениями, если нет - то искать среднее и писать на флеш, если есть, то писать только максимум. И так для каждого входа. По сути, если нет отклонений, то значение напряжения писать нет смысла, достаточно отмечать логический уровень. В принципе пофиг, тристадвадцатьвосьмых атмег у меня две горсти, если ресурсов не хватит то хоть одну на канал использовать можно. Только как-то объединить, чтоб на одну флеху писали в итоге, и время ещё логировать надо...
Есть идеи алгоритма? Как такие штуки вообще работают?
Sirocco, я предложил использовать "массовые" прерывания PCINT. Про детали работы с ними можно почитать в даташите 73 страница или русскоязычным руководствам по контроллерам AVR мега. В логгере на SD карту не вижу смысла, событие как я понимаю происходит раз в несколько суток, что логгировать? Можно несколько байт иформации и в памяти подержать) В крайнем случае во внутреннюю еепром записать если очень хочется, но я б не стал. Могу накидать скелет программы. Сначала нужно выбрать соответствие будущим желаемым входам и их обозначениям pcint xx
(табличку подсмотреть можно тут). Для примера выберу от балды:
d9 pcint1 (PORTB.1)
d10 pcint2 (PORTB.2)
d11 pcint3 (PORTB.3)
d12 pcint4 (PORTB.4)
на pcint 5 висит светик, на на 6 и 7 кварц, пропустим их
a0 pcint8 (PORTC.0)
a1 pcint9 (PORTC.1)
a2 pcint10 (PORTC.2)
a3 pcint11 (PORTC.3)
a4 pcint12 (PORTC.4)
a5 pcint13 (PORTC.5)
ресеты и прочие сериалы пропустим , нам ещё 2 входа нужно , что бы было 12.
d4 pcint20 (PORTD.4)
d5 pcint21 (PORTD.5)
Ну можно и скетчик набросать:
Спасиб за идею. Уже что-то получается.
Люди, встречал кто логгер на ардуино с записью на SD? Ситуация срочная, нужно писать напряжения на 12 входах сразу. Дело в том, что есть модуль входов контроллера, если напряжение на входе 0-9В это логический ноль, если 9-30 это единица. Всё это работает вполне успешно, но в какой-то непонятный момент прилетает 220 или может 380 вольт и модуль целиком выгорает. Собственно момент невероятный и не возможный, но так происходит. Соответственно нужно мониторить несколько параметров сразу, чтоб потом восстановить ход событий и хотябы понять на какой именно вход прилетает импульс. Быстродействие должно быть максимальное, иначе высоковольтный импульс можно пропустить.
Может у кого есть заготовки кода под это дело, или подобный проект встречали?
Если есть разъемы и мощность сигнала позволяет, я бы попробывал включить транзисторные оптроны по каждому сигналу. Какой выгорит тот и канал. Может и модуль спасет:). А если по земле, то и логгер не спасет, мне кажется.
Поставил на каждый вход по паре светодиодов smd, один моментом выгорает при напряжении выше 40V, другой при напряжении выше 250V. На некоторых входах выгорели светодиоды на 40V. Но ситуация загадочная. Без логгера не понять как она могла произойти. Там сложная релейная схема, много цепочек собирается.
Как-то пару лет назад попадал в такую ситуацию. Сигнал с датчиков перепада давления на вентиляции шел в щит автоматики в соседнее помещение, шёл по тому же лотку, что и питание двигателя вентиляции 7,5КВт. Долго думал и тестил, искуственно создавал все аварийные ситуации, но не мог найти причину выгорания входов контроллера. Чисто случайно заметил. Оказалось, что в момент останова двигана пролетал сильный импульс, который наводил не хилое напряжение в слаботочных проводах. Причем этот импульс наводился только в тот момент, когда фильтр вентиляции был забит(реле в этот момент замыкалось отсылая сигнал об этом. Это не верное решение, но так было реализовано проектом.), и соответственно в штатной рабочей ситуации проблему было не отловить.
Но теперь другая ситуация...