отправка данных определенной даты из регистратора данных в последовательный порт

Мне было интересно, можно ли сохранить много данных (пример: данные за один год) в щите регистратора данных, а затем прочитать их из последовательного порта, не извлекая SD-карту... эта часть моего вопроса в порядке.. ... основная тема заключается в том, что я хочу прочитать данные о конкретной дате из регистратора ... Чтобы лучше объяснить это, скажем, у вас есть датчик влажности, и вы сохранили его данные в течение года. Теперь вы хотите отправить данные за последние 6 месяцев на свой телефон через Bluetooth. Является ли это возможным? Кроме того, я хотел использовать круговой буфер, но это не кажется хорошей идеей, потому что это дорого... любые идеи будут очень полезны.

, 👍-1

Обсуждение

сколько строк регистрируется в один день?, @Juraj

Это важно? я хотел понизить суточную выборку, ну может в 2 раза..., @201

хорошо, это не так много для одного года. чтобы скопировать часть файла в Serial, вы должны прочитать файл построчно с самого начала и начать печать после того, как найдете строку с запрошенной датой начала., @Juraj


1 ответ


0

Я вижу несколько вопросов (чтение конкретных данных с SD) и круговой буфер; Я думаю, что это две разные «проблемы».

Чтение определенных данных с SD

Это зависит от того, как вы сохраняете свои данные. Вы создаете один большой файл или, например, каждый день создаете новый файл?

Предполагая последнее, это относительно просто, просто отправить содержимое файлов в течение определенной даты.

Если у вас есть большой файл, вам нужно проанализировать файл, в частности, метки времени, которые вы должны включить в файл, и отправить все в определенные даты.

Если анализ занимает слишком много времени, вы можете создать второй файл, содержащий начальные точки (например, смещение в байтах) для каждого дня. Так, например, 1 января -> 0 означает, что 1 января начинается с байта 0, 2 января -> 3633 начинается с байта 3633; вы можете использовать некоторую функцию seek, чтобы начать чтение файла данных, начиная с даты; продолжая также проверять смещение даты окончания в байтах.

Вы можете получить отметку времени файла:

void dateTime(uint16_t* date, uint16_t* time) 
{
    DateTime now = rtc.now(); 
    // возвращаем дату, используя макрос FAT_DATE для форматирования полей
    *date = FAT_DATE(now.year(), now.month(), now.day());
}

Вы можете начать чтение с определенной позиции в файле с помощью функции fseek, см. https://www.arduino.cc/en/Reference/FileSeek.

Круговой буфер

Это относится к отправке байтов (через периферийное устройство/Bluetooth). Это совсем не дорого. Что вы делаете, так это создаете кольцевой буфер (например, 50 байт или что-то еще). Затем вы начинаете записывать в него байты (которые вы копируете из SD-файла, увеличивая буферное пространство. Затем вы начинаете отправлять из него байты, уменьшая буферное пространство.

Я никогда не пользовался Bluetooth, поэтому не знаю, как отправляется пакет (и его размер); если вы можете просто отправлять пакеты определенной или фиксированной длины, вам не нужен циклический буфер, просто продолжайте читать, например, 50 байт, поместите его в фиксированный массив, отправьте его и снова загрузите и т. д., пока не будут отправлены все байты.

,

Идея заключалась в том, чтобы запросить любую историю данных, которую я хочу, через мобильный телефон mu ... Я хотел создать разные файлы с определенными отметками времени, но тогда, если период, который я хочу, не был в файлах, это было бы проблемой ..., @201

И еще одна вещь, которую я не знаю, это как указать определенную начальную точку для моих файлов?, @201

Вы можете получить время, используя: void dateTime(uint16_t* дата, uint16_t* время) { DateTime now = rtc.now(); // возвращаем дату, используя макрос FAT_DATE для форматирования полей *date = FAT_DATE(сейчас.год(), сейчас.месяц(), сейчас.день());, @Michel Keijzers

Могу ли я также получить период разного времени?, @201

Таким образом, после записи файла (каждый день) или в последний раз один раз в день вы можете получить дату обратно, хотя может быть даже проще написать дату в имени файла (data_yymmdd.log), @Michel Keijzers

Не уверен, что вы имеете в виду … если вам нужно с 5 по 10 декабря, просто зачитайте 5 файлов и отправьте их (?), @Michel Keijzers

О чтении не с начала см. https://www.arduino.cc/en/Reference/FileSeek, @Michel Keijzers

да например с 5 по 10 декабря. Как мне это сделать?, @201

Если у вас есть отдельный файл для каждого дня, прочитайте файл 5dec (частями, например, по 50 байт или около того) и отправьте каждый пакет, затем сделайте то же самое с файлом 6dec и т. д., @Michel Keijzers

Как я могу сохранить каждую информацию в отдельном файле? например, за 1 неделю, 1 месяц и т. д. Я имею в виду, что данные за 1 неделю также должны быть в данных за один месяц... не могли бы вы помочь мне с кодом?, @201

Это зависит от того, лучше сделать несколько команд, которые отправляют необходимую информацию (например, период начала/окончания)., @Michel Keijzers