// demo-Code non-blocking timing 2 seconds active 5 minutes pausing
// https://wokwi.com/projects/385183690731707393
// https://forum.arduino.cc/t/arduino-pause-and-resume-commands-and-saving-data-into-a-matrix/1203804/11
unsigned long dataSavingStarted;
unsigned long saveDataInterval = 2000UL; // save data for 2 seconds long
unsigned long myPausingTimer = 0; // Timer-variables MUST be of type unsigned long
unsigned long pausingInterval = 5 * 60 * 1000UL; // pause 5 minutes
unsigned long pausingStarted;
boolean SaveDataActiveMode;
const byte OnBoard_LED = 13;
byte ledState = LOW;
void setup() {
Serial.begin(115200);
Serial.println("Setup-Start");
pinMode(OnBoard_LED, OUTPUT);
SaveDataActiveMode = true;
dataSavingStarted = millis();
}
void loop() {
blinkOnBoardLED();
if ( SaveDataActiveMode == true) {
SaveDataFor2Seconds();
// check if more than 2 seconds have passed by
if ( millis() - dataSavingStarted >= saveDataInterval) {
SaveDataActiveMode = false;
pausingStarted = millis();
}
}
else { // the pausing is "active"
printPausingCountDown();
if (millis() - pausingStarted >= pausingInterval) {
dataSavingStarted = millis();
SaveDataActiveMode = true;
}
}
}
void SaveDataFor2Seconds() {
static unsigned long delayPrinTtimer;
if ( TimePeriodIsOver(delayPrinTtimer, 500) ) {
Serial.println("Saving Data");
}
}
void printPausingCountDown() {
static unsigned long delayPrinTtimer;
static unsigned long timeLeftPausing;
timeLeftPausing = (pausingInterval - (millis() - pausingStarted) ) / 1000;
if ( TimePeriodIsOver(delayPrinTtimer, 2000) ) {
Serial.print("Pausing goes on for ");
Serial.print(timeLeftPausing);
Serial.println(" seconds");
}
}
void blinkOnBoardLED() {
static unsigned long myBlinkTimer;
if ( TimePeriodIsOver(myBlinkTimer, 500) ) {
// when REALLY 500 milliseconds have passed by
if (ledState == LOW) {
ledState = HIGH; // change to HIGH
}
else { // ledState is HIGH
ledState = LOW; // change to LOW
}
digitalWrite(OnBoard_LED, ledState);
}
}
// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
unsigned long currentMillis = millis();
if ( currentMillis - startOfPeriod >= TimePeriod ) {
// more time than TimePeriod has elapsed since last time if-condition was true
startOfPeriod = currentMillis; // a new period starts right here so set new starttime
return true;
}
else return false; // actual TimePeriod is NOT yet over
}