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
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
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
If you include the code you have, we can offer some ideas.
Mark
Sounds like you are storing the values in RAM and not in EEPROM memory.
There are examples of using the EEPROM memory available here:
#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); }
kindly check my code
i have posted my code kindly check
i write the values to eeprom check my code
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
thanks for your time
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