/*
https://forum.arduino.cc/t/looped-void-function-and-continuity/1039262/
to be deleted 2022-11
*/
constexpr uint8_t ledA {13};
constexpr uint8_t ledB {12};
constexpr uint8_t ledC {14};
constexpr uint8_t ledD {27};
constexpr uint8_t button {23};
constexpr uint16_t interval {500};
// example with a blocking for loop
void blockingSequenceA()
{
for (int i = 0; i < 8; i++)
{
digitalWrite(ledA, HIGH);
delay(interval); // dirty delay
digitalWrite(ledA, LOW);
delay(interval); // dirty delay
}
}
// example nonblocking
byte sequenceBForLoopCounter = 255;
constexpr byte sequenceBForLoopEndvalue = 8;
void sequenceBupdate()
{
static uint32_t previousMillis = 0;
if (sequenceBForLoopCounter < sequenceBForLoopEndvalue)
{
if (millis() - previousMillis > interval)
{
previousMillis = millis();
if (digitalRead(ledB) == LOW)
{
digitalWrite(ledB, HIGH);
}
else
{
digitalWrite(ledB, LOW);
sequenceBForLoopCounter++;
}
}
}
}
void sequenceBstart()
{
sequenceBForLoopCounter = 0;
}
//example in OOP
class Sequence {
protected:
const byte led;
const byte forLoopEndvalue;
byte forLoopCounter = 255;
uint32_t previousMillis = 0;
public:
Sequence (byte led, byte forLoopEndvalue = 8) :
led{led},
forLoopEndvalue{forLoopEndvalue}
{}
void begin()
{
pinMode(led, OUTPUT);
}
void start()
{
forLoopCounter = 0;
}
void update()
{
if (forLoopCounter < forLoopEndvalue)
{
if (millis() - previousMillis > interval)
{
previousMillis = millis();
if (digitalRead(led) == LOW)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
forLoopCounter++;
}
}
}
}
};
Sequence objectLedC(ledC); // create a LED object
Sequence objectLedD(ledD, 5); // blinks only n times
void setup()
{
pinMode(ledA, OUTPUT);
pinMode(ledB, OUTPUT);
pinMode(button, INPUT_PULLUP);
objectLedC.begin();
objectLedD.begin();
}
void loop() {
if (digitalRead(button) == LOW)
{
//blockingSequenceA();
sequenceBstart();
objectLedC.start();
objectLedD.start();
}
sequenceBupdate(); // call unblocked in loop
objectLedC.update();
objectLedD.update();
}