Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Development
  3. Best way to store large data in eeprom

Best way to store large data in eeprom

Scheduled Pinned Locked Moved Development
14 Posts 3 Posters 4.3k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • TetnobicT Tetnobic

    @hek thanks for your Nice 3d solution,
    I do not usually use the bit shifting technique, I guess the max value is 8 * 2 bits : 65 535 ?

    @mfalkvidd right 1440 minutes in a day... I am a goat... Thanks for the methods, I think I will use this...

    mfalkviddM Offline
    mfalkviddM Offline
    mfalkvidd
    Mod
    wrote on last edited by mfalkvidd
    #5

    @Tetnobic correct, the max value for a 16-bit unsigned integer is 2^16-1 which is 65535. See https://www.arduino.cc/en/Reference/UnsignedInt for details.

    TetnobicT 1 Reply Last reply
    0
    • mfalkviddM mfalkvidd

      @Tetnobic correct, the max value for a 16-bit unsigned integer is 2^16-1 which is 65535. See https://www.arduino.cc/en/Reference/UnsignedInt for details.

      TetnobicT Offline
      TetnobicT Offline
      Tetnobic
      wrote on last edited by
      #6

      @mfalkvidd so not enough to store 1 day (86400s) :( , can I do same things with int32 ?

      mfalkviddM 1 Reply Last reply
      0
      • TetnobicT Tetnobic

        @mfalkvidd so not enough to store 1 day (86400s) :( , can I do same things with int32 ?

        mfalkviddM Offline
        mfalkviddM Offline
        mfalkvidd
        Mod
        wrote on last edited by
        #7

        @Tetnobic true, nice catch :)

        32 bits (unsigned long) would work. You'd have to use bit shift though, I don't think there are equivalents for high/lowByte and word.

        unsigned long duration = 4000;
        
        saveState(0, (duration >> 24) & 0xff);
        saveState(1, (duration >> 16) & 0xff);
        saveState(2, (duration >> 8) & 0xff);
        saveState(3, duration & 0xff);
        
        duration = loadState(0) << 24 + loadState(1) << 16 + loadState(2) << 8 + loadState(3);
        

        But your original idea with hwWriteConfigBlock would be easier to read I think.

        TetnobicT 1 Reply Last reply
        1
        • mfalkviddM mfalkvidd

          @Tetnobic true, nice catch :)

          32 bits (unsigned long) would work. You'd have to use bit shift though, I don't think there are equivalents for high/lowByte and word.

          unsigned long duration = 4000;
          
          saveState(0, (duration >> 24) & 0xff);
          saveState(1, (duration >> 16) & 0xff);
          saveState(2, (duration >> 8) & 0xff);
          saveState(3, duration & 0xff);
          
          duration = loadState(0) << 24 + loadState(1) << 16 + loadState(2) << 8 + loadState(3);
          

          But your original idea with hwWriteConfigBlock would be easier to read I think.

          TetnobicT Offline
          TetnobicT Offline
          Tetnobic
          wrote on last edited by
          #8

          @mfalkvidd yes for this solution, I guess that hwWriteConfigBlock method access to the eeprom in one time, contrary to bit shifting technique that need 4 saveState so 4 access to the eeprom ?

          1 Reply Last reply
          0
          • TetnobicT Offline
            TetnobicT Offline
            Tetnobic
            wrote on last edited by Tetnobic
            #9

            I try this :

            #define EEPROM_SLEEP_DURATION_ADDRESS 0
            
            uint32_t sleepDurationInS = 86399;
            
            hwWriteConfigBlock((void*)sleepDurationInS, (void*)(EEPROM_LOCAL_CONFIG_ADDRESS+EEPROM_SLEEP_DURATION_ADDRESS), 32);
            
             hwReadConfigBlock((void*)&sleepDurationInS, (void*)(EEPROM_LOCAL_CONFIG_ADDRESS+EEPROM_SLEEP_DURATION_ADDRESS), 32);
            

            but seems no work :( my node freeze at this method

            mfalkviddM 1 Reply Last reply
            0
            • TetnobicT Tetnobic

              I try this :

              #define EEPROM_SLEEP_DURATION_ADDRESS 0
              
              uint32_t sleepDurationInS = 86399;
              
              hwWriteConfigBlock((void*)sleepDurationInS, (void*)(EEPROM_LOCAL_CONFIG_ADDRESS+EEPROM_SLEEP_DURATION_ADDRESS), 32);
              
               hwReadConfigBlock((void*)&sleepDurationInS, (void*)(EEPROM_LOCAL_CONFIG_ADDRESS+EEPROM_SLEEP_DURATION_ADDRESS), 32);
              

              but seems no work :( my node freeze at this method

              mfalkviddM Offline
              mfalkviddM Offline
              mfalkvidd
              Mod
              wrote on last edited by
              #10

              @Tetnobic that looks correct to me, but I am no c/c++ expert so pointers and casting is scary for me :) Hopefully someone with better skills can give some clarity.

              The code in the security personalizer seems to use the same syntax.

              1 Reply Last reply
              0
              • hekH Offline
                hekH Offline
                hek
                Admin
                wrote on last edited by
                #11

                Length should be 4 not 32.

                TetnobicT 1 Reply Last reply
                2
                • hekH hek

                  Length should be 4 not 32.

                  TetnobicT Offline
                  TetnobicT Offline
                  Tetnobic
                  wrote on last edited by Tetnobic
                  #12

                  @hek right :) sizeof uint32_t : 4

                  it works with :

                  #define EEPROM_SLEEP_DURATION_ADDRESS 0
                  
                  uint32_t sleepDurationInS = 86399;
                  
                  hwWriteConfigBlock((void*)&sleepDurationInS, (void*)(EEPROM_LOCAL_CONFIG_ADDRESS+EEPROM_SLEEP_DURATION_ADDRESS), 4);
                  
                   hwReadConfigBlock((void*)&sleepDurationInS, (void*)(EEPROM_LOCAL_CONFIG_ADDRESS+EEPROM_SLEEP_DURATION_ADDRESS), 4);
                  
                  1 Reply Last reply
                  3
                  • TetnobicT Offline
                    TetnobicT Offline
                    Tetnobic
                    wrote on last edited by
                    #13

                    Just for info, I found others methods to save data in eeprom :
                    in <avr/eeprom.h> there is :

                    uint8_t 	eeprom_read_byte (const uint8_t *__p)
                    uint16_t 	eeprom_read_word (const uint16_t *__p)
                    uint32_t 	eeprom_read_dword (const uint32_t *__p)
                    float 	eeprom_read_float (const float *__p)
                    void 	eeprom_read_block (void *__dst, const void *__src, size_t __n)
                    void 	eeprom_write_byte (uint8_t *__p, uint8_t __value)
                    void 	eeprom_write_word (uint16_t *__p, uint16_t __value)
                    void 	eeprom_write_dword (uint32_t *__p, uint32_t __value)
                    void 	eeprom_write_float (float *__p, float __value)
                    void 	eeprom_write_block (const void *__src, void *__dst, size_t __n)
                    void 	eeprom_update_byte (uint8_t *__p, uint8_t __value)
                    void 	eeprom_update_word (uint16_t *__p, uint16_t __value)
                    void 	eeprom_update_dword (uint32_t *__p, uint32_t __value)
                    void 	eeprom_update_float (float *__p, float __value)
                    void 	eeprom_update_block (const void *__src, void *__dst, size_t __n)
                    

                    It is to these methods that the aliases are made in the file MyHwATMega328.h :)

                    #define hwReadConfig(__pos) eeprom_read_byte((uint8_t*)(__pos))
                    #define hwWriteConfig(__pos, __val) eeprom_update_byte((uint8_t*)(__pos), (__val))
                    #define hwReadConfigBlock(__buf, __pos, __length) eeprom_read_block((void*)(__buf), (void*)(__pos), (__length))
                    #define hwWriteConfigBlock(__buf, __pos, __length) eeprom_update_block((void*)(__buf), (void*)(__pos), (__length))
                    
                    mfalkviddM 1 Reply Last reply
                    0
                    • TetnobicT Tetnobic

                      Just for info, I found others methods to save data in eeprom :
                      in <avr/eeprom.h> there is :

                      uint8_t 	eeprom_read_byte (const uint8_t *__p)
                      uint16_t 	eeprom_read_word (const uint16_t *__p)
                      uint32_t 	eeprom_read_dword (const uint32_t *__p)
                      float 	eeprom_read_float (const float *__p)
                      void 	eeprom_read_block (void *__dst, const void *__src, size_t __n)
                      void 	eeprom_write_byte (uint8_t *__p, uint8_t __value)
                      void 	eeprom_write_word (uint16_t *__p, uint16_t __value)
                      void 	eeprom_write_dword (uint32_t *__p, uint32_t __value)
                      void 	eeprom_write_float (float *__p, float __value)
                      void 	eeprom_write_block (const void *__src, void *__dst, size_t __n)
                      void 	eeprom_update_byte (uint8_t *__p, uint8_t __value)
                      void 	eeprom_update_word (uint16_t *__p, uint16_t __value)
                      void 	eeprom_update_dword (uint32_t *__p, uint32_t __value)
                      void 	eeprom_update_float (float *__p, float __value)
                      void 	eeprom_update_block (const void *__src, void *__dst, size_t __n)
                      

                      It is to these methods that the aliases are made in the file MyHwATMega328.h :)

                      #define hwReadConfig(__pos) eeprom_read_byte((uint8_t*)(__pos))
                      #define hwWriteConfig(__pos, __val) eeprom_update_byte((uint8_t*)(__pos), (__val))
                      #define hwReadConfigBlock(__buf, __pos, __length) eeprom_read_block((void*)(__buf), (void*)(__pos), (__length))
                      #define hwWriteConfigBlock(__buf, __pos, __length) eeprom_update_block((void*)(__buf), (void*)(__pos), (__length))
                      
                      mfalkviddM Offline
                      mfalkviddM Offline
                      mfalkvidd
                      Mod
                      wrote on last edited by
                      #14

                      @Tetnobic the hw* functions is a way to abstract the underlying hardware. Many MySensors fans use non-avr hardware, for example ESP8266.

                      You can of course choose to optimize for a single platform in your own sketches, but we strive to make the MySensors example sketches available for as many platforms as possible.

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      17

                      Online

                      11.7k

                      Users

                      11.2k

                      Topics

                      113.1k

                      Posts


                      Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • MySensors
                      • OpenHardware.io
                      • Categories
                      • Recent
                      • Tags
                      • Popular