I need a counter ,for time elapsed from zero point (reset) but this timer must count for days.
it will show to display "day 2 :00:01:03" and thiw will mean that its elapsed 2 days and 1 min 3 sec from the time I pressed reset button.
My only question is how can I start this timer on mega8
The IDE supports the Mega8.
Use micros( ) to count seconds, when that rolls over increment tens of seconds, when that rolls over increments the minutes, when that rolls over increment the tens of minutes, when that rolls over increment the hours, when that rolls from from 24 to 25 reset it to 0 and increment the days.
Use MAX7219 to drive the digits, has a register for each digit.
My Arduino has a clock frequency slightly off, so each day I loose a minute or two. I added a RTC from eBay (less than $2.50) that change the time everyday.
For you I guess it has the advantage that you could make your device restart the countdown so it finish when you want if you happen to loose power, or something else make the Arduino reboot.
A minute or two? Wow!
My crystal based duemilanove only drifts a second a day.
I use micros( ) to track the seconds, how is your code doing it?
void loop(){
currentMicros = micros();
if ((currentMicros - previousMicros)>=1000000){ // check for 1 second passed
previousMicros = previousMicros + 1000000; //
time_update = 1;
seconds = seconds +1;
if (seconds == 10){
seconds = 0;
tens_seconds = tens_seconds +1;
if (tens_seconds == 6){
tens_seconds = 0;
etc. for minutes, hours, days
}
}
}
// done with with counter updates
// update display if needed
if (time_udpate == 1){
time_update = 0;
// send data to the MAX7219 ...
}
// do other stuff your code might do
} // end ofvoid loop
Battery backed RTC could keep you going during power loss, especially if the sketch start time is stored in the RTC SRAM
(DS1307 has 56 bytes for example) and the sketch does the math to show the elapsed time from the stored startup and the current time.
This is what I made 1 year ago .But to succeeded I changed time libraries . Now with a fresh version of arduino ,this cod doesn't run . I lost my changed time library and I cant remember the changes that I have made
In this program a counter starts from zero. you can add hours and mins by pressing pins or you can erase timer.
Also there is a backup ,every hour, in case of power loss.
#include <DateTime.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
/* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)./. */
int resetPin = 10; // pin 10 resets the time
int addHourPin = 9;
int addMinPin = 8;
long restoreTime = 0;
int restoreDay = 0;
int eepromTime = 0;
int eepromDay = 0;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);//create object to control an LCD
void setup(){
lcd.begin(16, 4); // set up the LCD's number of columns and rows
digitalWrite(resetPin,HIGH); // this line enables pull-up
digitalWrite(addHourPin,HIGH);// this line enables pull-up
digitalWrite(addMinPin,HIGH);// this line enables pull-up
pinMode(13,OUTPUT); // we flash the LED each second
pinMode(resetPin, INPUT); // a button on this pin resets the time
pinMode(addHourPin, INPUT);//add hours to counter
pinMode(addMinPin, INPUT);//add hours to counter
DateTime.sync( 0 ); // set time to zero
/*Restoring Time after every power failure*/
restoreDay = EEPROM.read(10); //Read days passed
restoreTime = EEPROM.read(0); //read hours passed
if (restoreDay !=0) {
restoreTime = (restoreTime*3600+(restoreDay-1)*86400); //add days and hours to datetima counter
DateTime.sync(restoreTime);
}
delay (30);
}
void loop(){
/* --------- Prints time in hours, minutes and seconds ----------- */
DateTime.available(); // needed to refresh the clock time
/* GENERAL reset pin. Everithing resets to zero when presed*/
if(digitalRead(resetPin) == HIGH){
for (int u = 0; u < 20; u++)
EEPROM.write(u, 0); // write a 0 to all 512 bytes of the EEPROM
DateTime.sync( 0 ); // reset time to zero if button pressed
}
time_t timeNow = DateTime.now();
time_t customTime = timeNow;
if(digitalRead(addHourPin) == HIGH){
customTime += (86400 * 1); //add 3600 sec for 1 time(for test,adds a day)
DateTime.sync(customTime); // increase hour by one (1 day)
}
if(digitalRead(addMinPin) == HIGH){
customTime += (60 * 1);
delay (100);
DateTime.sync(customTime); // increase min by one
}
//... BACKUP TIME EVERY 1 HOUR...//
if ((DateTime.Minute) == 1 && (DateTime.Second)==10 ) {
eepromTime = DateTime.Hour;
EEPROM.write(10,eepromDay);
eepromDay = DateTime.Day ;
EEPROM.write(0,eepromTime);
}
// lcd PRINT
lcd.setCursor(0,0);
lcd.print("Hr:min:sec");
lcd.setCursor(12,0);
lcd.print(DateTime.Hour,DEC); // prints total hours
lcd.print(":");
lcd.print(DateTime.Minute,DEC); // and minutes since reset
lcd.print(":");
lcd.print(DateTime.Second,DEC); // and sec since reset
lcd.print(" "); // clears second digit every minute
lcd.setCursor(0,1);
lcd.print("Project Day");
lcd.setCursor(13,1);
lcd.print(DateTime.Day,DEC); // prints total days
lcd.print(" ");
/*test perposes lines*/
lcd.setCursor(0,3);
lcd.print("epromDay ");
lcd.print(eepromDay);
lcd.print(" time ");
lcd.print( eepromTime );
lcd.print(" ");
digitalWrite(13, LOW); //light the LED every second
delay (10);
digitalWrite(13, HIGH); //
}
Individual digits are easy with the library. I was leaving that as an exercise for the OP and being lazy. All my approach really does is start a clock at midnight January 1970. So the time of day it returns is in line with the count up. The reset button can start it over but an extra button would be more instant. It does start with the day at 1 if it was preferred to start at 0 just subtract one from hour().
Here's individual digits.
#include <Time.h>
time_t secondCount = 0;
time_t lastSecond = 0;
void setup(){
setTime(secondCount);
Serial.begin(115200); // or whatever rate you prefer
}
void loop(){
secondCount = now();
if (secondCount != lastSecond)
{
Serial.print(day(secondCount));
Serial.print(":");
if (hour(secondCount) < 10) Serial.print("0");
Serial.print(hour(secondCount));
Serial.print(":");
if (minute(secondCount) < 10) Serial.print("0");
Serial.print(minute(secondCount));
Serial.print(":");
if (second(secondCount) < 10) Serial.print("0");
Serial.print(second(secondCount));
Serial.println(" ");
lastSecond = secondCount;
}
}