Timemark: A class implementation of "blink-without-delay"

Timemark is a simple library abstracting the "blink-without-delay" code pattern to a single function. Below is a multi-blink example sketch that uses timemarks for three LED blink periods and a fourth for trace timing.

#include <Timemark.h>

Timemark trace(500);

const int led1 = 13;
Timemark blink1(500);

const int led2 = 12;
Timemark blink2(1000);

const int led3 = 11;
Timemark blink3(1500);

void setup()
{
  Serial.begin(9600);
  while (!Serial);
  Serial.println(F("MultiBlink: started"));

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);

  trace.start();
  blink1.start();
  blink2.start();
  blink3.start();
}

void loop()
{
  // Trace LED status
  if (trace.expired()) {
    Serial.print(millis());
    Serial.print(' ');
    Serial.print(digitalRead(led1));
    Serial.print(' ');
    Serial.print(digitalRead(led2));
    Serial.print(' ');
    Serial.println(digitalRead(led3));
  }

  // Blink LED 1
  if (blink1.expired())
    digitalWrite(led1, !digitalRead(led1));

  // Blink LED 2
  if (blink2.expired())
    digitalWrite(led2, !digitalRead(led2));

  // Blink LED 3
  if (blink3.expired())
    digitalWrite(led3, !digitalRead(led3));
}

More advanced usage examples can be found in the examples directory.

Cheers!

Nice, can I construct an array of these objects ?

robtillaart:
Nice, can I construct an array of these objects ?

Let me test that. I think that a default constructor might be needed. Great idea (as usual). Cheers!

robtillaart:
Nice, can I construct an array of these objects ?

The answer is yes. I have added a version of multiblink with a vector of timemarks for the leds. The constructor worked nicely as there was a default time limit.

#include <Timemark.h>

#define membersof(v) (sizeof(v) / sizeof(v[0]))

Timemark trace(500);

const int led[3] = { 13, 12, 11 };
const unsigned int limit[3] = { 500, 1000, 1500 };
Timemark blink[3];

void setup()
{
  Serial.begin(9600);
  while (!Serial);
  Serial.println(F("MultiBlinkArray: started"));

  trace.start();
  for (unsigned int i = 0; i < membersof(led); i++) {
    pinMode(led[i], OUTPUT);
    digitalWrite(led[i], LOW);
    blink[i].limitMillis(limit[i]);
    blink[i].start();
  }
}

void loop()
{
  if (trace.expired()) {
    Serial.print(millis());
    for (unsigned int i = 0; i < membersof(led); i++) {
      Serial.print(' ');
      Serial.print(digitalRead(led[i]));
    }
    Serial.println();
  }

  for (unsigned int i = 0; i < membersof(led); i++)
    if (blink[i].expired())
      digitalWrite(led[i], !digitalRead(led[i]));
}

Cheers!

That looks really GOOD! +1
Thanks,