Хранение данных в eeprom

Тема в разделе "Arduino & Shields", создана пользователем ДеКодер, 13 апр 2020.

  1. Приветствую, ребята. Подскажите пожалуйста с типом данных. В памяти необходимо хранить время - часы и минуты. В каком виде лучше всего хранить в EEPROM, в виде структуры или отдельными полями ? Далее будет необходимо сравнивать со временем, полученным с DS1307
     
  2. parovoZZ

    parovoZZ Гуру

    Храни количество секунд, как это сделано в писюках.
     
    Andrey12 и ДеКодер нравится это.
  3. b707

    b707 Гуру

    если только это - то один байт часы. другой минуты. Если нужна любая дата с точностью до секунд - то время в формате Unixtime (4 ,байта), как посоветовал Паровоз
     
    Andrey12 и ДеКодер нравится это.
  4. SergeiL

    SergeiL Оракул Модератор

    А чем не нравятся стандартные возможности?
    Я делаю так:
    Код (C++):
     
    // -------------------------------- EEPROM Data ------------------------
    typedef struct _eeprom_data_struct
    {
      uint8_t     Start_Counter;
      uint8_t     MQTT_Restart_Counter;
      uint8_t     Relay_Sate;
    } EEPROM_Data_Sruct;

    EEPROM_Data_Sruct   EEMEM   EEPROM_Data = {0,0,0};
    EEPROM_Data_Sruct           EEPROM_Data_RAM;
    ..................
          EEPROM.get((uint16_t) &EEPROM_Data, EEPROM_Data_RAM);
          EEPROM.put((uint16_t) &EEPROM_Data, EEPROM_Data_RAM);
     
     
    Последнее редактирование: 14 апр 2020
    ДеКодер нравится это.
  5. Всем откликнувшимся спасибо! Задача была в том, что нужно хранить отсечки времени, грубо говоря - собираю подсветку с расписанием. Т.е. по сути, нужно хранить только время, день не имеет значения.
    Полагаю тип данных подойдет:
    Код (C++):
    struct Validity
    {
      uint8_t hour_begin;
      uint8_t hour_end;
      uint8_t minuts_begin;
      uint8_t minuts_end;
    };
    Выбор такой сделал потому, что библиотека iarduino_RTC использует uint8_t, будет проще сравнивать время.
    Изначально склонялся к тому, что хранить время в секундах, прошедших с 00.00, но лишние преобразования думаю не нужны.
     
  6. Kakmyc

    Kakmyc Нерд

    О каких лишних преобразованиях речь ?
    По сути все банально.
    Библиотека Time.h, и объект tmElements(по сути структура)
     
  7. Перевод часов и минут в секунды.
     
  8. Выслушаю и ваше мнение.
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Это при таком хранении как у Вас будут лишние преобразования. Например как сравнить два времени на больше/меньше? А хранили бы как секунды - просто сравнения двух чисел.
     
    Andrey12 нравится это.
  10. Так как iarduino_RTC использует uint8_t, то сравнивать точно так же - < >, отдельно часы и отдельно минуты. Изначально и планировал хранить в секундах отсечки, но мне не нужна дата, мне нужно время, а как я понял в Unixtime хранится дата в секундах с какого-то там года.
     
  11. parovoZZ

    parovoZZ Гуру

    ну не храни дату. Храни только время.

    с 1970.
     
    ДеКодер нравится это.
  12. Поэтому и выбрал структуру с uint8_t, в которой указывается интервал в часах и минутах :)
     
  13. b707

    b707 Гуру

    вам уже несколько человек указали на то. что это неэффективно. Храните время либо в секундах с полуночи. либо. если достаточно только минут - в минутах с полуночи. Но в любом случае лучше хранить время как одно число, а не как два (часы + минуты).
    Почему - сказано в сообщении #9
     
    Andrey12 и ДеКодер нравится это.
  14. Т.е. для этого нужен перевод часов и минут в секунды ? Или есть уже готовая функция, которая возвращает количество секунд, прошедших с полуночи ?
     
  15. И если проверять время с помощью iarduino_RTC, в частности используя Hours и minutes, то опять переводить в секунды ?
     
  16. b707

    b707 Гуру

    а это так трудно? :)
    Но я бы выбрал минуты - и считать проще. и места займут меньше.
     
  17. Я просто не могу понять, зачем лишние телодвижения делать ? Когда можно часы сравнивать с Hours и минуты с minutes без преобразований в секунды ? Или где я не прав ?
     
  18. Kakmyc

    Kakmyc Нерд

    Есть такая библиотека Time.h , она кроссплатформенная, т.е. не только для ардуино а так же для ПК во всех его ипостасях.
    Так вот, эта библиотека использует как переменную для хранения секунд, так и структуру в которую преобразует при надобности эти секунды.

    И да, лучше использовать нормальные библиотеки, а не кривовато скопипасченные поделки от iarduino
     
  19. b707

    b707 Гуру

    пример - представьте что вам нужно установить, сколько времени проходит от 13час 43 мин до 22час 11 мин
    Когда у вас время в часах и минутах отдельно - вам нужно отдельно вычесть часы. отдельно минуты. да еще учесть то, что у более позднего времени минут меньше...
    А когда у вас время в секундах - вы просто вычитаете из одного числа другое

    На самом деле оба этих метода - хранить часы и минуты отдельно или все переводить в секунды - зависит от того. что вы с ними потом делаете. Мне удобнее в секундах - я так и храню. А вы решайте сами.
     
  20. Зачем забивать и так ограниченную память ?
    Вот допустим такой код (пишу на коленке)
    Код (C++):
    iarduino_RTC myTimer(RTC_DS1307);
    Validity morning;
    morning.hour_begin = 9;
    morning.minuts_begin = 0;
    morning.hour_end = 12;
    morning.minuts_end = 0;
    if(myTimer.Hours >= morning.hour_begin && myTimer.Hours <= morning.hour_end)
       Serial.Print("Доброе утро");
    Т.е. таймер сравнивает время с определенной отсечкой. Никаких периодов вычислять не нужно (иначе было бы действительно логично использовать минимальную единицу времени - секунду)
     
    Последнее редактирование: 16 апр 2020