18 Jan
18Jan

  • Tutorial/explanations coming soon...
  • Functional code is below (further be improved)

Code (as function/method)

#include <EEPROM.h>

// EEPROM Address Definitions
#define adrBuildYear          0
#define adrBuildMonth         1
#define adrBuildDay           2
#define adrBuildHour          3
#define adrBuildMinute        4
#define adrBuildSecond        5
#define adrBuildCounter       6
#define adrRunCounterHighByte 7
#define adrRunCounterLowByte  8

String ArduinoDateTimeToDisplayAndEEPROM()
{
  char s_month[5];
  int month, day, year;
  int hour, minute, second;
  static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";

  sscanf(__DATE__/*time*/, "%s %d %d", s_month, &day, &year);
  sscanf(__TIME__, "%d:%d:%d", &hour, &minute, &second);

  month = ((strstr(month_names, s_month) - month_names) / 3) + 1;

  String sMonth = month < 10 ? "0" + String(month) : String(month);
  String sDay = day < 10 ? "0" + String(day) : String(day);

  // Icrease the build counter (if different from the previous time)
  if ((EEPROM.read(adrBuildYear) != (byte)(year%100))
    || (EEPROM.read(adrBuildMonth) != (byte)month)
      || (EEPROM.read(adrBuildDay) != (byte)day)
        || (EEPROM.read(adrBuildHour) != (byte)hour)
          || (EEPROM.read(adrBuildMinute) != (byte)minute)
            || (EEPROM.read(adrBuildSecond) != (byte)second))
  {
    // Write to EEPROM (Uno/Nano: 1kb, Mega: 4kb)
    EEPROM.update(adrBuildYear,    (byte)(year%100));
    EEPROM.update(adrBuildMonth,   (byte)month);
    EEPROM.update(adrBuildDay,     (byte)day);
    EEPROM.update(adrBuildHour,    (byte)hour);
    EEPROM.update(adrBuildMinute,  (byte)minute);
    EEPROM.update(adrBuildSecond,  (byte)second);
    EEPROM.update(adrBuildCounter, (byte)(EEPROM.read(adrBuildCounter) + 1));
  }

  // Icrease the run counter by 1 and update (rewrite back)
  int rCnt = 256 * EEPROM.read(adrRunCounterHighByte) + 
    EEPROM.read(adrRunCounterLowByte) + 1;

  EEPROM.update(adrRunCounterHighByte, (byte)(rCnt/256));
  EEPROM.update(adrRunCounterLowByte, (byte)(rCnt%256));

  return "b" + String(EEPROM.read(adrBuildCounter)) + " d" + String(year) + "." + 
    sMonth + "." + sDay + " t" + __TIME__ + " r" + String(rCnt);
}

Sample Usage

void setup() 
{
  Serial.println(ArduinoDateTimeToDisplayAndEEPROM());

  // OUTPUT: (Something like)
  // b1 d2021.01.18 t12:00:00 r2
  // b: Build, d: Date, t: Time, r: Runtime counter
}

void loop() 
{

}

Link / Source

Arduino Comparison Chart: Boards & Modules

Stackoverflow: Convert string from __DATE__ into a time_t

Comments
* The email will not be published on the website.