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. Troubleshooting
  3. cannot save water meter in arduino EEPROM

cannot save water meter in arduino EEPROM

Scheduled Pinned Locked Moved Troubleshooting
16 Posts 4 Posters 3.4k Views 2 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.
  • A Offline
    A Offline
    ahmedhodhod
    wrote on last edited by ahmedhodhod
    #7

    @hard-shovel said in cannot save water meter in arduino EEPROM:

    controller

    same issue with your modification in the code & the controller are using arduino mega 2560

    H 1 Reply Last reply
    0
    • A ahmedhodhod

      @hard-shovel said in cannot save water meter in arduino EEPROM:

      controller

      same issue with your modification in the code & the controller are using arduino mega 2560

      H Offline
      H Offline
      hard-shovel
      wrote on last edited by
      #8

      @ahmedhodhod For controller I meant automation controller ie OpenHAB, Domoticz, etc

      I made an error in the start up section with the not equals test.

      // ############################################
      // ############################################
      // Initiaize the value of totalMilliLiters 
        if (EEPROM.read(0) == 0xFF){            // #### was if (EEPROM.read(0) != 0xFF)
            EEPROM.put(1,totalMilliLitres);  
      } else {
            EEPROM.get(1,totalMilliLitres);
      }
          Serial.println("Startup EPROM Value  :");
          Serial.print("Output Liquid Quantity: ");        
          Serial.println(totalMilliLitres);
      // ############################################
      

      Try this complete code, It works for me

      /*
      Liquid flow rate sensor -DIYhacking.com Arvind Sanjeev
      
      Measure the liquid/water flow rate using this code. 
      Connect Vcc and Gnd of sensor to arduino, and the 
      signal line to arduino digital pin 2.
       
       */
      #include <EEPROM.h>
      byte statusLed    = 13;
      
      byte sensorInterrupt = 0;  // 0 = digital pin 2
      byte sensorPin       = 2;
      
      // The hall-effect flow sensor outputs approximately 4.5 pulses per second per
      // litre/minute of flow.
      float calibrationFactor = 4.5;
      
      volatile byte pulseCount;  
      
      float flowRate;
      unsigned int flowMilliLitres;
      unsigned long totalMilliLitres;
      
      unsigned long oldTime;
      
      void setup()
      {
        
        // Initialize a serial connection for reporting values to the host
        Serial.begin(9600);
         
        // Set up the status LED line as an output
        pinMode(statusLed, OUTPUT);
        digitalWrite(statusLed, HIGH);  // We have an active-low LED attached
        
        pinMode(sensorPin, INPUT);
        digitalWrite(sensorPin, HIGH);
      
        pulseCount        = 0;
        flowRate          = 0.0;
        flowMilliLitres   = 0;
        totalMilliLitres  = 0;
        oldTime           = 0;
      
        // The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
        // Configured to trigger on a FALLING state change (transition from HIGH
        // state to LOW state)
        attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
      
      
      // ############################################
      // ############################################
      // Initiaize the value of totalMilliLiters 
        if (EEPROM.read(0) == 0xFF){            // #### was if (EEPROM.read(0) != 0xFF)
            EEPROM.put(1,totalMilliLitres);  
      } else {
            EEPROM.get(1,totalMilliLitres);
      }
          Serial.println("Startup EPROM Value  :");
          Serial.print("Output Liquid Quantity: ");        
          Serial.println(totalMilliLitres);
      // ############################################
      }
      /**
       * Main program loop
       */
      void loop()
      {
         
         if((millis() - oldTime) > 1000)    // Only process counters once per second
        { 
          // Disable the interrupt while calculating flow rate and sending the value to
          // the host
          detachInterrupt(sensorInterrupt);
              
          // Because this loop may not complete in exactly 1 second intervals we calculate
          // the number of milliseconds that have passed since the last execution and use
          // that to scale the output. We also apply the calibrationFactor to scale the output
          // based on the number of pulses per second per units of measure (litres/minute in
          // this case) coming from the sensor.
          flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
          
          // Note the time this processing pass was executed. Note that because we've
          // disabled interrupts the millis() function won't actually be incrementing right
          // at this point, but it will still return the value it was set to just before
          // interrupts went away.
          oldTime = millis();
          
          // Divide the flow rate in litres/minute by 60 to determine how many litres have
          // passed through the sensor in this 1 second interval, then multiply by 1000 to
          // convert to millilitres.
          flowMilliLitres = (flowRate / 60) * 1000;
          
          // Add the millilitres passed in this second to the cumulative total
          totalMilliLitres += flowMilliLitres;
            
          unsigned int frac;
          
          // Print the flow rate for this second in litres / minute
          Serial.print("Flow rate: ");
          Serial.print(int(flowRate));  // Print the integer part of the variable
          Serial.print("L/min");
          Serial.print("\t");       // Print tab space
      
          // Print the cumulative total of litres flowed since starting
          Serial.print("Output Liquid Quantity: ");        
          Serial.print(totalMilliLitres);
          Serial.print("mL"); 
          Serial.print("\t");       // Print tab space
        Serial.print(totalMilliLitres/1000);
        Serial.println("L");
      
        // ######################################################
        // ######################################################
        // Save the Value in EEPROM
          EEPROM.put(1,totalMilliLitres);           //  Was read value  EEPROM.get(1,totalMilliLitres);
        // ######################################################
        // ###################################################### 
          // Reset the pulse counter so we can start incrementing again
          pulseCount = 0;
          
          // Enable the interrupt again now that we've finished sending output
          attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
        }
      }
      
      /*
      Insterrupt Service Routine
       */
      void pulseCounter()
      {
        // Increment the pulse counter
        pulseCount++;
      }
      
      1 Reply Last reply
      0
      • A Offline
        A Offline
        ahmedhodhod
        wrote on last edited by
        #9

        unfortunately cannot read the values that stored after a power cycle

        H 1 Reply Last reply
        0
        • A ahmedhodhod

          unfortunately cannot read the values that stored after a power cycle

          H Offline
          H Offline
          hard-shovel
          wrote on last edited by hard-shovel
          #10

          @ahmedhodhod Sorry about that. When i tried the code above it was with a used board and the eprom already had data stored so worked fine.

          I have just tried with a brand new sealed mega board and had the same problem as you.

          The eprom test location and the save locations need to be the same, We were testing location 0 but saving to location 1.

          Change line 55 to the following

            if (EEPROM.read(1) == 0xFF){            // #### was if (EEPROM.read(0) != 0xFF) needs to the location as the save position
          
          

          if all is ok you should get an output on reboot like this..

          Startup EPROM Value  :
          Output Liquid Quantity: 0
          Flow rate: 0L/min	Output Liquid Quantity: 0mL	0L
          Flow rate: 2L/min	Output Liquid Quantity: 48mL	0L
          Flow rate: 39L/min	Output Liquid Quantity: 714mL	0L
          Flow rate: 29L/min	Output Liquid Quantity: 1209mL	1L
          Flow rate: 27L/min	Output Liquid Quantity: 1667mL	1L
          Flow rate: 27L/min	Output Liquid Quantity: 2133mL	2L
          Startup EPROM Value  :
          Output Liquid Quantity: 2133
          Flow rate: 1L/min	Output Liquid Quantity: 2162mL	2L
          Flow rate: 0L/min	Output Liquid Quantity: 2162mL	2L
          Flow rate: 18L/min	Output Liquid Quantity: 2469mL	2L
          Flow rate: 25L/min	Output Liquid Quantity: 2894mL	2L
          Startup EPROM Value  :
          Output Liquid Quantity: 2894
          Flow rate: 19L/min	Output Liquid Quantity: 3223mL	3L
          Flow rate: 17L/min	Output Liquid Quantity: 3511mL	3L
          Flow rate: 19L/min	Output Liquid Quantity: 3836mL	3L
          Flow rate: 4L/min	Output Liquid Quantity: 3917mL	3L
          Flow rate: 0L/min	Output Liquid Quantity: 3917mL	3L
          Flow rate: 32L/min	Output Liquid Quantity: 4453mL	4L
          Startup EPROM Value  :
          Output Liquid Quantity: 4453
          Flow rate: 0L/min	Output Liquid Quantity: 4460mL	4L
          Flow rate: 0L/min	Output Liquid Quantity: 4460mL	4L
          Flow rate: 0L/min	Output Liquid Quantity: 4460mL	4L
          
          
          1 Reply Last reply
          0
          • A Offline
            A Offline
            ahmedhodhod
            wrote on last edited by
            #11

            @hard-shovel said in cannot save water meter in arduino EEPROM:

            if (EEPROM.read(0) == 0xFF){

            thanks it working now but cannot read more than 8 digits number

            1 Reply Last reply
            0
            • M Offline
              M Offline
              mickecarlsson
              wrote on last edited by mickecarlsson
              #12

              PLease, DON’T write to eeprom in the loop(), you will destroy the eeprom. The lifecycle for the eeprom is 100000 writes/read, after that it is destroyed.
              info about eeprom writes at arduino

              EDIT: With the current code (write to eeprom every second) the eeprom will be destroyed after aprox 69 days.

              1 Reply Last reply
              1
              • A Offline
                A Offline
                ahmedhodhod
                wrote on last edited by
                #13

                i know that but the problem now how to write 8 digits in eeprom

                M 1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mickecarlsson
                  wrote on last edited by
                  #14

                  eeprom write long

                  1 Reply Last reply
                  0
                  • A ahmedhodhod

                    i know that but the problem now how to write 8 digits in eeprom

                    M Offline
                    M Offline
                    mickecarlsson
                    wrote on last edited by
                    #15

                    @ahmedhodhod did it work with the suggested links?

                    H 1 Reply Last reply
                    0
                    • M mickecarlsson

                      @ahmedhodhod did it work with the suggested links?

                      H Offline
                      H Offline
                      hard-shovel
                      wrote on last edited by
                      #16

                      @mickecarlsson
                      I do not think the actual problem is with writing the EEPROM, as the EEPROM.put function is used and this will Write any data type or object to the EEPROM.

                          EEPROM.put(1,totalMilliLitres);
                      

                      as the totalMilliLitres is already an unsigned variable that should be good for up to ten digits.

                      unsigned long totalMilliLitres;      // unsigned long  max 4,294,967,294 on UNO/Mega
                      

                      The only problem area i can see is the use of

                      volatile byte pulseCount;
                      

                      which severely limits the pulse counts to 255 and whould be better as

                      volatile unsigned int pulseCount;      // volatile byte pulseCount;  byte max 255
                      

                      More clarification of the actual problem is needed.

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


                      28

                      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