классификация данных с ардуино

Я хочу классифицировать свои данные с 3 датчиков с помощью Arduino, чтобы каждый раз, когда я ввожу конкретную дату или час, или это может быть период времени, например, 10 дней назад, он показывал мне точные данные. Другими словами, я хочу классифицировать свои данные, чтобы всякий раз, когда мне нужна каждая деталь данных, я мог бы получить ее, введя информацию о годе, дате, времени. Я также не хотел, чтобы мои данные находились в отдельных файлах и метках времени. Я хочу иметь возможность делать это в одном файле и выполнять поиск внутри этого файла...

#include "RTClib.h"
#include <SD.h>
#include <SPI.h>

RTC_DS1307 rtc;
const int chipSelect = 10;

File dataFile;

String print_time(DateTime timestamp) {
  char message[120];

  int Year = timestamp.year();
  int Month = timestamp.month();
  int Day = timestamp.day();
  int Hour = timestamp.hour();    
int Minute = timestamp.minute();
      int Second= timestamp.second();

      sprintf(message, "%d-%d-%d %02d:%02d:%02d", Month,Day,Year,Hour,Minute,Second);

      return message;
    }

    void setup(){
      Serial.begin(9600);

      pinMode(chipSelect, OUTPUT);
      if (!SD.begin(chipSelect)){
        Serial.println("Error: SD card would not initiate.");
      }

      rtc.begin();
      if (!rtc.isrunning()){
        Serial.println("Clock is not running");
      }

      dataFile = SD.open("log0.csv", FILE_WRITE);
      if (!dataFile){
        Serial.println("Could not open file.");
      }

    }

    void loop(){
      Datetime now = rtc.now();
      dataFile.println(print_time(now));

      delay(3000);
    }

, 👍0

Обсуждение

Отвечает ли это на ваш вопрос? отправка данных конкретной даты из щита регистратора данных в последовательный порт, @Juraj

так что это ^ - новый автоматический комментарий для "возможного дубликата", @Juraj

@Juraj предложенный вами вопрос отличается от этого. Я имею в виду, например, файл с 1000 сохраненными данными. скажем, вам нужны данные с 10:00 2 декабря до настоящего времени. это главный вопрос... возможность классифицировать данные и задавать время сохранения данных. Здесь я должен написать код, чтобы моя программа понимала ВРЕМЯ, когда я ее спрашиваю..., @201


2 ответа


0
  1. Создать один файл (регистратор SD?)
  2. Когда данные получены от датчика, сохраните их в файле и сохраните следующую информацию:
    1. Отметка даты/времени
    2. Какой датчик
    3. Данные датчика
  3. После получения запроса данных (возможно, содержащего метки времени начала и окончания) проанализируйте файл и начните возвращать информацию для этих меток даты/времени в пределах запрошенных меток времени начала/окончания.

Если шаг 3 занимает слишком много времени (и приводит к отсутствию новых измерений датчиков), вам необходимо выполнять считывание меньшими шагами между считыванием показаний датчиков.

,

Это та часть, которую я не понимаю. Как мне написать код... извините, я новичок в ардуино... ваша теория написания кода полностью соответствует тому, о чем я думал, но у меня возникли проблемы с ее написанием..., @201

Разделите вашу проблему на более мелкие части (как я показал выше. Может быть, даже лучше сначала попробовать файловую часть на ПК, где у вас есть простые средства отладки без использования MCU. Таким образом, попробуйте написать файл, добавьте в него байты, притворяясь, что они приходят от датчиков.Когда у вас есть эта работа, добавьте конкретные части MCU (чтение данных датчиков и использование SD-библиотеки из Arduino вместо этого).Написать весь код немного выходит за рамки этого форума (слишком широкий слишком)., @Michel Keijzers

Я написал код с меткой времени и данными. Теперь вы можете помочь мне со следующей частью? Как я могу попросить Arduino отправить мне временную метку, которую я хочу? Я загрузил свой код. Теперь я прошу Arduino отправить мне последние 10 временных меток... есть предложения?, @201

Вы должны добавить код к вопросу, а не как ответ. То, как вы хотите «запросить это у Arduino», зависит от того, что вы хотите… вы хотите добавить клавиатуру, или набор переключателей, или клавиатуру какого-либо типа к Arduino, или последовательный порт, или другим способом (WIFI, USB)? Я не знаю ваших требований., @Michel Keijzers

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

Я никогда не использовал Bluetooth, но думаю, что это отдельный «мини-проект». Попробуйте выполнить следующие шаги: 1. Создайте (или лучше: найдите) какой-нибудь код, который отправляет что-то через BT (это не связано с Arduino). 2. Найдите код, который читает какое-то сообщение BT. 3. Отправьте что-нибудь через BT. 4 Проверьте, приходит ли он. 5. Измените отправляемое сообщение на то, в котором есть метка времени начала и окончания. 6. Измените код на Arduino для анализа этих меток времени. 7. Получите сообщения датчиков с SD-карты. 8. Отправьте его через BT. 9 Сделайте что-нибудь с ним на стороне приемника., @Michel Keijzers

Как я могу сделать номер 5 и 6? Вы можете направить меня?, @201

Шаг 5. К сообщению, которое вы отправляете на Arduino (в примере, вероятно, ничего полезного), вы добавляете несколько дополнительных байтов (например, год 0-99, месяц 1-12, день 1-31), таким образом, 3 байта. Шаг 6: Когда вы получаете сообщение, вы извлекаете эти 3 байта из сообщения и помещаете их в три (байтовые) переменные: год, месяц и день. Затем вы можете использовать эти 3 переменные для фильтрации данных датчика., @Michel Keijzers

Благодарю за ваш ответ. Итак, может ли arduino понять отметку времени, которую я пишу, как время начала и окончания?, @201

Если вы запрограммируете его реагировать на метки времени, да., @Michel Keijzers

Как мне это сделать? Вы можете направить меня?, @201

Как в 4 комментариях выше (вставьте переменные и ответьте на них)., @Michel Keijzers


1

Если вы планируете постоянно получать данные с фиксированной скоростью, я предлагаю вам не добавляйте временные метки к отдельным записям. Вместо этого сохраните начальный отметка времени и период выборки данных в двоичном заголовке, за которым следует двоичные записи фиксированного размера. Затем, когда вы хотите получить запись для времени t вы можете использовать fseek() справа от

uint32_t offset = header_size
                + record_size * (t - initial_time) / sampling_period;

Если есть небольшая вероятность того, что вы не сможете записать некоторые данные точки, вы можете захотеть иметь логическое значение в каждой записи, которое сообщает, данные действительны. Затем вы можете заполнить недостающие данные недействительными записи.

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

,

Проголосовал за ваш ответ, действительно, если данные поступают непрерывно и с фиксированной скоростью, ваше решение лучше. В моем решении я предполагал, что данные с датчиков могут поступать случайным образом и, возможно, неравномерно., @Michel Keijzers