element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Arduino
  • Products
  • More
Arduino
Arduino Forum water flow sensor
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Arduino to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Suggested Answer
  • Replies 11 replies
  • Answers 6 answers
  • Subscribers 393 subscribers
  • Views 1503 views
  • Users 0 members are here
Related

water flow sensor

ahmedhodhod
ahmedhodhod over 7 years ago

Can anyone please help me i can not save value of total liters in eeprom,the main problem it read and writing while arduino mega working but if power of the value saved in eeprom go back to 0 because the counter  starting from 0

  • Sign in to reply
  • Cancel

Top Replies

  • mcb1
    mcb1 over 7 years ago in reply to ahmedhodhod +5 suggested
    ahmedhodhod Are you sure this is the code you've loaded into your Arduino.? I found numerous parts that needed to be commented out just to compile it, but I was using an UNO. There is a an incorrectly…
  • jw0752
    jw0752 over 7 years ago +3 suggested
    Hi Ahmed, You will probably have to provide a little more information and your code for someone to be able to figure out how to help. John
  • mcb1
    mcb1 over 7 years ago +2 suggested
    If you include the code you have, we can offer some ideas. Mark
  • jw0752
    0 jw0752 over 7 years ago

    Hi Ahmed,

     

    You will probably have to provide a little more information and your code for someone to be able to figure out how to help.

     

    John

    • Cancel
    • Vote Up +3 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • mcb1
    0 mcb1 over 7 years ago

    If you include the code you have, we can offer some ideas.

     

    Mark

    • Cancel
    • Vote Up +2 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • beacon_dave
    0 beacon_dave over 7 years ago

    Sounds like you are storing the values in RAM and not in EEPROM memory.

     

    There are examples of using the EEPROM memory available here:

    https://www.arduino.cc/en/Reference/EEPROM

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • ahmedhodhod
    0 ahmedhodhod over 7 years ago

    #include <EEPROM.h>
    #include <Wire.h> 
    #include "RTCLib.h"
    #include "Arduino.h"
    
    
    
    
    byte sensorInterrupt = 0;  
    byte sensorPin       = 2;
    float calibrationFactor = 4.5;
    volatile byte pulseCount;  
    float flowRate;
    unsigned int flowMilliLitres;
    unsigned long totalMilliLitres;
    unsigned long oldTime;
    int eeprom_daily,eeprom_weekly,eeprom_monthly;
    
    
    
    
    
    
    char buffer[10] = {0};
    char buffer_str[10];
    
    
    
    
    NexButton exit15 = NexButton(15, 4,"exit15");
    NexButton setting15 = NexButton(15, 5,"setting15");
    NexButton del = NexButton(15, 6,"del");
    NexText daily = NexText(15, 7, "daily");
    NexText ML = NexText(15, 1, "ml");
    NexText weekly = NexText(15, 2, "weekly");
    NexText monthly = NexText(15, 3, "monthly");
    
    
    
    
    
    
    void waterPopCallback(void *ptr)
    { 
      page15.show();
      char buffer_water[10];
      itoa(eeprom_daily,buffer_water,10);
      daily.setText(buffer_water);
      water_read ();         
    }
    
    
    
    
    
    
    
    
    void water_setup ()
    {
      pinMode(sensorPin, INPUT);
      digitalWrite(sensorPin, HIGH);
      pulseCount        = 0;
      flowRate          = 0.0;
      flowMilliLitres   = 0;
      totalMilliLitres  = 0;
      oldTime           = 0;
      attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
    }
    
    
    void water_read ()
    {
      if((millis() - oldTime) > 1000) 
      detachInterrupt(sensorInterrupt);
      flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
      oldTime = millis();
      flowMilliLitres = (flowRate / 60) * 1000;
      totalMilliLitres += flowMilliLitres;
      unsigned int frac;  
    
    
      memset(buffer, 0, sizeof(buffer)); // clear buffer
      itoa(totalMilliLitres, buffer, 10);
      ML.setText(buffer);
      event = true; 
        
      pulseCount = 0;
      attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
    } 
    
    
    void pulseCounter()
    {
      // Increment the pulse counter
      pulseCount++;
    }
    
    
    void setup(void)
    {
        Serial.begin(9600);
        
      if (EEPROM.read(0) != 0xFF)//init eeprom
      {
      init_eeprom(); 
      }
      read_init_eeprom(); 
    water_setup ();
    }
    }
    
    
    void loop(void)
    {
      nexLoop(nex_listen_list);
      water_daily();
     water_read ();
       
    }
    
    
    
    
    
    
    
    
    
    
    void init_eeprom()
    {
      Serial.print("Reset Setting ...");
      EEPROM.write(0,0xFF); //check
      EEPROM.put(1,0);      
      Serial.println(" Done");
    }
    void read_init_eeprom()
    {
      Serial.print("Read Setting ...");
    
    
     //eeprom_daily =(int) EEPROM.get(13);
     EEPROM.get(1, eeprom_daily);
    
      Serial.println(" Done");
    }
    
    
    
    
    void water_daily(){
     if (totalMilliLitres > 0)
     {
      eeprom_daily = totalMilliLitres /1000;
     Serial.println ("water_daily");
     EEPROM.put(1,eeprom_daily);
    
    }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • ahmedhodhod
    0 ahmedhodhod over 7 years ago in reply to jw0752

    kindly check my code

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • ahmedhodhod
    0 ahmedhodhod over 7 years ago in reply to mcb1

    i have posted my code kindly check

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • ahmedhodhod
    0 ahmedhodhod over 7 years ago in reply to beacon_dave

    i write the values to eeprom check my code

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • mcb1
    0 mcb1 over 7 years ago in reply to ahmedhodhod

    Yes we can see ... it appears in our inbox. (and all the other people)

     

    Eventually when I put aside my work, I'll have a look.

    However it might be another day before I can, so please bear with us as we're not paid support staff, we simply other members of this community.

     

     

    Mark

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • ahmedhodhod
    0 ahmedhodhod over 7 years ago in reply to mcb1

    thanks for your time

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • mcb1
    0 mcb1 over 7 years ago in reply to ahmedhodhod

    ahmedhodhod

    Are you sure this is the code you've loaded into your Arduino.?

    I found numerous parts that needed to be commented out just to compile it, but I was using an UNO.

     

    There is a an incorrectly placed } at line 111 and the sketch is missing one at the end.

     

     

    Eeprom is a byte value only ... that is it must be a number between 0 and 255.

    So each location address has a byte.

     

    I'm not sure what value the totalMilliLitres is, but you are dividing it by 1000 which makes it Litres.

     

    I've never used put and get, but it appears that this will place the value over an address, ie not a single address (1 in your case)

    You can see this here https://www.arduino.cc/en/Tutorial/EEPROMPut

     

    In your sketch you are simply writing it to address 1 which may not be enough given that the totalMilliLitres has been declared as a 'long'.

     

     

    You should be able to determine if the issue is related to the Intialisation routine as it prints "Reset Setting .... "

    You haven't shown us the serial print so we left guessing as to what it is doing.

    A copy of the actual Serial messages would be useful to see if it is actually working as it should be.

     

     

    I suspect your problem is related to the sketch process, rather than how you are writing it.

    You're reading the value stored in the eeprom as eeprom_daily, but you rewrite this each time the totalMilliLitres is greater than 0.

    The value you putting into address 1 is the totalMilliLitres/1000 which is likely to be less than 1.

     

    So whenever you get 100ml of water used, you call void water_daily() and then divide 100 by 1000 (which returns 0.1)

    The totalMilliLitres is decalred as an unsigned long (see here https://www.arduino.cc/reference/en/language/variables/data-types/unsignedlong/  )

    Unsigned long variables are extended size variables for number storage, and store 32 bits (4 bytes). Unlike standard longs unsigned longs won’t store negative numbers, making their range from 0 to 4,294,967,295 (2^32 - 1).  

     

    So I suspect you are always storing a zero, and hence your sketch is working as it should, but not the way you expect it.

     

     

    Mark

    • Cancel
    • Vote Up +5 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
>
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube