сохранение переменных в EEPROM

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 7 дек 2015.

  1. AlexVS

    AlexVS Гик

    100 000 - это гарантированный ресурс, на практке ячейки выдерживают миллион и более циклов. Один любознательный чел специально проводил тестирование и разместил реультаты в инете.
     
    Толик Иванов нравится это.
  2. Толик Иванов

    Толик Иванов Administrator Администратор

    оригинальненько вы завернули про следующий марсоход:):D
     
  3. releyshic

    releyshic Нерд

    Это для Оригинальной или для Китая? ))
     
  4. releyshic

    releyshic Нерд

    Не подскажете как именно EEPROM.update() работает, а именно: у меня большой массив структур его надо сохранять. Если я поменяю значения в парочке Элементов массива структур и сделаю для всего массива структур EEPROM.update(), то перезапишется весь Массив структур или только Изменённые элементы Массива или вообще Толлько элементы структуры этих двух изменныйх элементов массива?
     
  5. ostrov

    ostrov Гуру

    Обещают что только те байты, которые изменились. Иначе какой смысл?
     
  6. ZAZ-965

    ZAZ-965 Гуру

  7. AlexVS

    AlexVS Гик

  8. releyshic

    releyshic Нерд

    К сожалению компилятор ругается для update, для put работает такая запись
    "C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM/EEPROM.h:122:10: error: initializing argument 2 of 'void EEPROMClass::update(int, uint8_t)' [-fpermissive]

    void update( int idx, uint8_t val ) { EERef( idx ).update( val ); }

    invalid conversion from 'Timer*' to 'uint8_t {aka unsigned char}' [-fpermissive]
    _13.06.16_Time:2613: error: invalid conversion from 'Timer*' to 'uint8_t {aka unsigned char}' [-fpermissive]
    "
    Код (C++):
    struct Timer
    {
      byte ID_TIMER = 0;
      byte WEEK_OR_EACH_DAY = 1; // 1 for 1st week, 2 for 2nd week, 0 - each day
      byte FIRST_WEEK = true;  
      bool ACTIVE_TIMER = true;
      byte DOW = 0;
      byte TIME[8];
      byte DAY = 0;
      byte MONTH = 0;
      short YEAR = 0; //format XX  
    };
    Timer Timers[TIMERS];
    EEPROM.update(adress, Timers); // записали Array по адресу adress
    Как мне весь мой Масссив структур проupdatить?
    Помогите Люди Добрые ))
     
  9. ZAZ-965

    ZAZ-965 Гуру

    releyshic, ваш пример с EEPROM.put() собрался без ошибок, ошибка где-то в другом участке кода
    Код (C++):
    #include <EEPROM.h>

    struct Timer
    {
      byte ID_TIMER = 0;
      byte WEEK_OR_EACH_DAY = 1; // 1 for 1st week, 2 for 2nd week, 0 - each day
      byte FIRST_WEEK = true;
      bool ACTIVE_TIMER = true;
      byte DOW = 0;
      byte TIME[8];
      byte DAY = 0;
      byte MONTH = 0;
      short YEAR = 0; //format XX
    };
    Timer Timers[5];

    void setup() { }

    void loop() {

      EEPROM.put(0, Timers); // записали структуру по адресу 0

    }
     
  10. releyshic

    releyshic Нерд

    ошибки в коде быть не может, компилирую только меняя put ни update и результат соответствующий, либо работает либо нет
    Мне то надо update ))
     
  11. ZAZ-965

    ZAZ-965 Гуру

    releyshic, прочтите еще раз сообщение №26
    Ошибки в коде может не быть.
     
  12. releyshic

    releyshic Нерд

    Тоесть update для массива структур не подходит? или его просто передать надо правильно?
    Кстити 1Элемент массива тоже не смог updatить
     
  13. ZAZ-965

    ZAZ-965 Гуру

    Не подходит. Или делайте сами обход полей структуры, или пользуйтесь EEPROM.put(). Вот ее шаблон
    Код (C++):
        template< typename T > const T &put( int idx, const T &t ){
            EEPtr e = idx;
            const uint8_t *ptr = (const uint8_t*) &t;
            for( int count = sizeof(T) ; count ; --count, ++e )  (*e).update( *ptr++ );
            return t;
    }
    Т.е. бородатые программисты уже написали для нас и приведение типов, и цикл по полям
     
  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    оппа, что-то новенькое.
    Что из себя представляет цикл с четырьмя параметрами?
     
  15. Limoney

    Limoney Гик

    Запись допустима
    Не рекомендуется в цикле каждый раз вычислять размер sizeof(T)
     
    Последнее редактирование: 14 июн 2016
  16. ZAZ-965

    ZAZ-965 Гуру

    Третий параметр записан через оператор запятая.
    Инициализация начального параметра цикла выполняется один раз.
     
  17. ЩАС

    ЩАС Нуб

    День добрый, мужики нужна помощь начинающему, перерыл весь инет, так и не нашёл толкового объяснения ..
    В дано, есть три типа покрытий
    static const wchar_t*rsMode[]=
    {
    L"Asphalt",
    L"Gravel" ,
    L"Weat",
    };
    На каждое из покрытий задан свой таймер с периодом и временем работы. Период и время работы сохраняю ( обновляю) и читаю так:
    for(byte i = 0; i < 3; i++) {
    period_time= EEPROM.read(2*i);
    pumping_time=EEPROM.read(2*i+1);
    }
    И
    EEPROM.update(2*rs_Mode, period_time[rs_Mode]);
    EEPROM.update(2*rs_Mode+1, pumping_time[rs_Mode]);
    Где: rs_Mode - byte
    period_time, pumping_time - unsigned int.
    Задача: сохранить в EEPROM так же и последнее выбранное дорожное покрытие.... сижу голову ломаю уже три дня, а с инетом беда .... не везде он есть по командировочным местам .... да и инфа там на стандартных примерах, статьи или для барадатых или тупо копипаст, помогите пожалуйста разобраться, спасибо
     
  18. ostrov

    ostrov Гуру

    Сразу не понял что делает первый цикл.
     
  19. ЩАС

    ЩАС Нуб

    С помощью static const wchar_t*rsMode по скетчу: вывод выбранного покрытия на экран:
    lcd.print(rsMode[rs_Mode]);
    выбор покрытия с помощью инкодера операется на byte rs_Mode:
    enc.setCounterNorm (rs_Mode);
    К сожелению не могу выложить весь скетч, так как пишу с телефона, только фото, а в рукопашную 200 строк кода на телефоне ещё тот мазахизм ))), спасибо
     
  20. ostrov

    ostrov Гуру

    Вопросов дофига. Зачем wchar_t для латинского алфавита? Почему в цикле считываются как бы символы но в одну переменную (неизвестного типа) три раза, но при этом считается только последний? Без полного кода нефига не понятно, да и в этом отрывке дофига опечаток, и пробелов не хватает и назввние переменных меняется.
     
    Mitrandir нравится это.