Hello, i made a project where it counts the time when pin 3 is high. The only thing i wanna add is saving the time (int) to EEPROM. I tried it with a EEPROM code but i dont fully understand it. Anyone who can help me with this? Here is my project code, i will add the EEPROM code i think would work aswell (working in other project with the EEPROM code converted in my project but it looks messy). I am trying to save the int hour to eeprom, and if the power shuts off. I can read it back and start counting again. Any tips?
project code:
// deze constante veranderen niet
const int buttonPin = 3; // waar de button op aangesloten is
// the button moet aangesloten zijn vanaf pin naar ground, pinmode is een input_pullup
// Deze variabelen veranderen
bool buttonState; // momentele status van de button
bool lastButtonState; // vorige status van de button
unsigned long buttonBecamePressedAt;
unsigned long buttonHasBeenPressedForTotal = 0;
unsigned long buttonHasBeenPressedForThisTime = 0;
int hour;
void setup()
{
// initialize serial communication:
Serial.begin(9600);
Serial.println(".... Hoe lang is de button ingedrukt? ....");
Serial.print("Created: ");
Serial.print(__TIME__);
Serial.print(", ");
Serial.println(__DATE__);
Serial.println(__FILE__);
// Initializa de button pin als een input with pullup active low.
// verzeker dat de button van PIN naar GROUND
pinMode(buttonPin, INPUT_PULLUP);
//initialize button states
buttonState = digitalRead(buttonPin);
lastButtonState = buttonState;
Serial.println("Setup done");
Serial.println(" ");
}
void loop()
{
// lezen van de pushbutton buttonpin:
buttonState = digitalRead(buttonPin);
// vergelijkt de buttonstaat naar de vorige staat
if (buttonState != lastButtonState) // betekend dat hij veranderd is, welke kant nog onduidelijk
{
if (buttonState == LOW) // veranderd naar ingedrukt
{
// als de momentele staat is LOW dan was de button ingedrukt
Serial.print("Newly pressed at ");
Serial.print(millis());
Serial.print(" ms");
buttonBecamePressedAt = millis();
}
else // changed to released
{
// als de huidige staat HIGH dan was de button released
Serial.print(", newly released at ");
Serial.print(millis());
Serial.println(" ms");
buttonHasBeenPressedForThisTime = millis() - buttonBecamePressedAt;
buttonHasBeenPressedForTotal = buttonHasBeenPressedForTotal + buttonHasBeenPressedForThisTime;
Serial.print(" This press: ");
Serial.print(buttonHasBeenPressedForThisTime);
Serial.print(" ms");
Serial.print(", Total: ");
Serial.print(buttonHasBeenPressedForTotal);
Serial.println(" ms");
hour = buttonHasBeenPressedForTotal / 1000;
Serial.println(hour);
}
// Delay om "stuiteren" te voorkomen
delay(50);
}
// Verander de huidige staat als de vorige staat, voor de volgende keer door de loop
lastButtonState = buttonState;
}
So if i get it correct, this should work? but when i plug it out and in again. It starts at 0 again. What am i doing wrong? I wrote the EEPROM room 5 to value 0 in de setup. Than in the loop i updated 5 to the new value of "hour" . It still resets to 0 when i disconnect and connect the power, it doesnt remember the value it was at....
void setup()
{
// initialize serial communication:
Serial.begin(9600);
**EEPROM.write(5, 0);**
Serial.println(".... Hoe lang is de button ingedrukt? ....");
Serial.print("Created: ");
Serial.print(__TIME__);
Serial.print(", ");
Serial.println(__DATE__);
Serial.println(__FILE__);
// Initializa de button pin als een input with pullup active low.
// verzeker dat de button van PIN naar GROUND
pinMode(buttonPin, INPUT_PULLUP);
//initialize button states
buttonState = digitalRead(buttonPin);
lastButtonState = buttonState;
Serial.println("Setup done");
Serial.println(" ");
}
void loop()
{
// lezen van de pushbutton buttonpin:
buttonState = digitalRead(buttonPin);
// vergelijkt de buttonstaat naar de vorige staat
if (buttonState != lastButtonState) // betekend dat hij veranderd is, welke kant nog onduidelijk
{
if (buttonState == LOW) // veranderd naar ingedrukt
{
// als de momentele staat is LOW dan was de button ingedrukt
Serial.print("Newly pressed at ");
Serial.print(millis());
Serial.print(" ms");
buttonBecamePressedAt = millis();
}
else // changed to released
{
// als de huidige staat HIGH dan was de button released
Serial.print(", newly released at ");
Serial.print(millis());
Serial.println(" ms");
buttonHasBeenPressedForThisTime = millis() - buttonBecamePressedAt;
buttonHasBeenPressedForTotal = buttonHasBeenPressedForTotal + buttonHasBeenPressedForThisTime;
Serial.print(" This press: ");
Serial.print(buttonHasBeenPressedForThisTime);
Serial.print(" ms");
Serial.print(", Total: ");
Serial.print(buttonHasBeenPressedForTotal);
Serial.println(" ms");
hour = buttonHasBeenPressedForTotal / 1000;
Serial.println(projectnummer);
**EEPROM.update(5, hour);**
** Serial.println(EEPROM.read(5));**
}
// Delay om "stuiteren" te voorkomen, delay van 50ms is genoeg hiervoor
delay(50);
}
// Verander de huidige staat als de vorige staat, voor de volgende keer door de loop
lastButtonState = buttonState;
}
But if i use the put, it will always re-write to the EPROOM, if i use update it won't change unless the variable is different right? How should i implement it into my code?
Okay so what i see i just read it needs to be like this? But it still wont work...
#include <EEPROM.h>
// deze constante veranderen niet
const int buttonPin = 3; // waar de button op aangesloten is
// the button moet aangesloten zijn vanaf pin naar ground, pinmode is een input_pullup
// Deze variabelen veranderen
bool buttonState; // momentele status van de button
bool lastButtonState; // vorige status van de button
unsigned long buttonBecamePressedAt;
unsigned long buttonHasBeenPressedForTotal = 0;
unsigned long buttonHasBeenPressedForThisTime = 0;
int hour;
int AdressRoom = 15;
unsigned long projectnummer = 78125412;
if (buttonState != lastButtonState) // betekend dat hij veranderd is, welke kant nog onduidelijk
{
if (buttonState == LOW) // veranderd naar ingedrukt
{
// als de momentele staat is LOW dan was de button ingedrukt
Serial.print("Newly pressed at ");
Serial.print(millis());
Serial.print(" ms");
buttonBecamePressedAt = millis();
}
else // changed to released
{
// als de huidige staat HIGH dan was de button released
Serial.print(", newly released at ");
Serial.print(millis());
Serial.println(" ms");
buttonHasBeenPressedForThisTime = millis() - buttonBecamePressedAt;
buttonHasBeenPressedForTotal = buttonHasBeenPressedForTotal + buttonHasBeenPressedForThisTime;
Serial.print(" This press: ");
Serial.print(buttonHasBeenPressedForThisTime);
Serial.print(" ms");
Serial.print(", Total: ");
Serial.print(buttonHasBeenPressedForTotal);
Serial.println(" ms");
hour = buttonHasBeenPressedForTotal / 1000;
Serial.println(projectnummer);
EEPROM.put(AdressRoom, hour);
Serial.println(EEPROM.read(AdressRoom));
The time still resets whenever i close the seriële monitor, or power off / on the arduino....
I am new to using EEPROM so i am not sure what else is wrong...
#include <EEPROM.h>
// deze constante veranderen niet
const int buttonPin = 3; // waar de button op aangesloten is
// the button moet aangesloten zijn vanaf pin naar ground, pinmode is een input_pullup
// Deze variabelen veranderen
bool buttonState; // momentele status van de button
bool lastButtonState; // vorige status van de button
unsigned long buttonBecamePressedAt;
unsigned long buttonHasBeenPressedForTotal = 0;
unsigned long buttonHasBeenPressedForThisTime = 0;
int hour;
int AdressRoom = 15;
unsigned long projectnummer = 78125412;
void setup()
{
// initialize serial communication:
Serial.begin(9600);
Serial.println(".... Hoe lang is de button ingedrukt? ....");
Serial.print("Created: ");
Serial.print(__TIME__);
Serial.print(", ");
Serial.println(__DATE__);
Serial.println(__FILE__);
// Initializa de button pin als een input with pullup active low.
// verzeker dat de button van PIN naar GROUND
pinMode(buttonPin, INPUT_PULLUP);
//initialize button states
buttonState = digitalRead(buttonPin);
lastButtonState = buttonState;
Serial.println("Setup done");
Serial.println(" ");
}
void loop()
{
// lezen van de pushbutton buttonpin:
buttonState = digitalRead(buttonPin);
// vergelijkt de buttonstaat naar de vorige staat
if (buttonState != lastButtonState) // betekend dat hij veranderd is, welke kant nog onduidelijk
{
if (buttonState == LOW) // veranderd naar ingedrukt
{
// als de momentele staat is LOW dan was de button ingedrukt
Serial.print("Newly pressed at ");
Serial.print(millis());
Serial.print(" ms");
buttonBecamePressedAt = millis();
}
else // changed to released
{
// als de huidige staat HIGH dan was de button released
Serial.print(", newly released at ");
Serial.print(millis());
Serial.println(" ms");
buttonHasBeenPressedForThisTime = millis() - buttonBecamePressedAt;
buttonHasBeenPressedForTotal = buttonHasBeenPressedForTotal + buttonHasBeenPressedForThisTime;
Serial.print(" This press: ");
Serial.print(buttonHasBeenPressedForThisTime);
Serial.print(" ms");
Serial.print(", Total: ");
Serial.print(buttonHasBeenPressedForTotal);
Serial.println(" ms");
hour = buttonHasBeenPressedForTotal / 1000;
Serial.println(projectnummer);
EEPROM.put(AdressRoom, hour);
Serial.println(EEPROM.get(AdressRoom, hour));
}
// Delay om "stuiteren" te voorkomen, delay van 50ms is genoeg hiervoor
delay(50);
}
// Verander de huidige staat als de vorige staat, voor de volgende keer door de loop
lastButtonState = buttonState;
}