Duty cycle of Arduino

I was wondering about the reliability of using Arduino where it would be powered up for a week or more. How long can it be used until it needs to be reset? I realise the internal clock will run to 55 days or so, but are there any other issues that would cause a crash during prolonged periods of use?

The rollover of the clock is not a problem, it is very easy to program around it. With good coding, and avoiding some constructs cough dynamic memory allocation cough cough String cough it should run as long as the power is on.

The only issue is heat dissipation (if in a confined space) - and your electricity bill!

If your sketch writes to EEPROM then the limited write-cycles of that would be the limiting factor.
Also the data retention time for the FLASH memory might be an issue after many years - quoting
from the datasheet:

Reliability Qualification results show that the projected data retention failure rate is much less
than 1 PPM over 20 years at 85°C or 100 years at 25°C.

dhjones:
I was wondering about the reliability of using Arduino where it would be powered up for a week or more. How long can it be used until it needs to be reset?

There's no limit.

dhjones:
I realise the internal clock will run to 55 days or so, but are there any other issues that would cause a crash during prolonged periods of use?

That's just software, the person who coded millis() chose a 32 bit number (as a compromise - there's no 'correct' choice for that).

The Arduino doesn't crash/reset when it reaches that number, it just goes back to zero.

the 55day bug :grin:, start a rumor about what happens after 10 cycles and you have the "555 bug" now lets come up with a scam device to fix the problem.

dhjones:
I was wondering about the reliability of using Arduino where it would be powered up for a week or more. How long can it be used until it needs to be reset? I realise the internal clock will run to 55 days or so, but are there any other issues that would cause a crash during prolonged periods of use?

I've a 5x5x5 led cube that has been running continuously for almost 3 years now, interrupted only be utilities outages now and then and even then it boots up running when power returned. Long term reliability will be determined by external hardware/power factors and/or of course sketch flaws.

Lefty

Thanks guys.

The millis() rollover is 49+ days, not 55.
(2^32)mS * 1S/1000mS * 1 min/60S * 1Hr/60min * 1 day/24 Hr = 49.7 days

Similar for micros():
(2^32)uS * 1S/1000000uS * 1 min/60S * 1Hr/60min = 1.19Hr (71.58min)

And it does not need resetting. Try this simple sketch. Open your serial monitor at 57,600

unsigned long currentmicros = 0;
unsigned long nextmicros = 0;
unsigned long interval = 10000; 

byte tens_hours = 0; 
byte ones_hours = 0;  
byte tens_minutes = 0;
byte ones_minutes = 0;
byte tens_seconds = 0;
byte ones_seconds = 0;
byte tenths = 0;
byte hundredths= 0;

byte prior_seconds = 0;

void setup()

{
  Serial.begin(57600);
  nextmicros = micros();
}

void loop()

{

  currentmicros = micros(); // read the time.

  if ((currentmicros - nextmicros) >= interval) // 10 milliseconds have gone by

  {

    hundredths = hundredths +1;

    if (hundredths == 10){
      hundredths = 0;
      tenths = tenths +1;
    }

    if (tenths == 10){
      tenths = 0;
      ones_seconds = ones_seconds +1;
    }

    if (ones_seconds == 10){
      ones_seconds = 0;
      tens_seconds = tens_seconds +1;
    }

    if (tens_seconds == 6){
      tens_seconds = 0;
      ones_minutes = ones_minutes +1;
    }

    if (ones_minutes == 10){
      ones_minutes = 0;
      tens_minutes = tens_minutes +1;
    }

    if (tens_minutes == 6){
      tens_minutes = 0;
      ones_hours = ones_hours +1;
    }

    if (ones_hours == 10){
      ones_hours = 0;
      tens_hours = tens_hours +1;
    }
    if ((tens_hours == 2) && (ones_hours == 4)){
      ones_hours = 0;
      tens_hours = 0;
      delay(1000);
    }

    nextmicros = nextmicros + interval; // update for the next comparison

  }  // end time interval check

  // counters are all updated now, send to display

  if (prior_seconds != ones_seconds){

    Serial.print (tens_hours, DEC);
    Serial.print (" ");
    Serial.print (ones_hours, DEC);
    Serial.print (" : ");
    Serial.print (tens_minutes, DEC);
    Serial.print (" ");
    Serial.print (ones_minutes, DEC);
    Serial.print (" : ");
    Serial.print (tens_seconds, DEC);
    Serial.print (" ");
    Serial.println (ones_seconds, DEC);

    prior_seconds = ones_seconds;   // show time update once/second
  }  // end one second passing check
  
  // do other stuff in the meantime ...

} // end void loop