отправка данных определенной даты из регистратора данных в последовательный порт
Мне было интересно, можно ли сохранить много данных (пример: данные за один год) в щите регистратора данных, а затем прочитать их из последовательного порта, не извлекая SD-карту... эта часть моего вопроса в порядке.. ... основная тема заключается в том, что я хочу прочитать данные о конкретной дате из регистратора ... Чтобы лучше объяснить это, скажем, у вас есть датчик влажности, и вы сохранили его данные в течение года. Теперь вы хотите отправить данные за последние 6 месяцев на свой телефон через Bluetooth. Является ли это возможным? Кроме того, я хотел использовать круговой буфер, но это не кажется хорошей идеей, потому что это дорого... любые идеи будут очень полезны.
@201, 👍-1
Обсуждение1 ответ
Я вижу несколько вопросов (чтение конкретных данных с 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
- Онлайн-проблема подключения Arduino к базе данных MySQL
- nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
- Подключение датчика давления к Arduino для сбора данных о давлении и времени
- Регистрация данных при просмотре меню на ЖК-экране
- Конфликт между шилдом SD-карты и акселерометром
- Синхронизация нескольких MPU9250
- Быстрая регистрация данных
- ЭБР. Можно ли создать несколько таблиц с помощью db.create()?
сколько строк регистрируется в один день?, @Juraj
Это важно? я хотел понизить суточную выборку, ну может в 2 раза..., @201
хорошо, это не так много для одного года. чтобы скопировать часть файла в Serial, вы должны прочитать файл построчно с самого начала и начать печать после того, как найдете строку с запрошенной датой начала., @Juraj