A simple yet powerful timer library that gives you stimulation.
#include <Stimeration.h>
// Repeating timers
stm::Timer heartbeat(stm::secondsToMs(1));
stm::MicroTimer sampleWindow(stm::millisToMicros(5));
// One-shot triggers
stm::Trigger warmup(stm::secondsToMs(3));
stm::MicroTrigger calibrationPulse(stm::secondsToMicros(1));
bool ledState = false;
bool paused = false;
uint32_t sampleCount = 0;
uint32_t lastButtonCheck = 0;
const uint32_t buttonDebounceMs = 50;
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, INPUT_PULLUP);
warmup.start();
calibrationPulse.start();
Serial.print("Heartbeat interval (ms): ");
Serial.println(heartbeat.intervalMs());
Serial.print("Warmup duration (ms): ");
Serial.println(warmup.intervalMs());
}
void loop() {
// Debounce a button press with the stateless helper, no timer object needed
bool buttonPressed = digitalRead(2) == LOW;
if (buttonPressed && stm::hasElapsed(lastButtonCheck, buttonDebounceMs)) {
lastButtonCheck = millis();
paused = !paused;
if (paused) {
heartbeat.pause();
warmup.pause();
Serial.println("Paused");
} else {
heartbeat.resume();
warmup.resume();
Serial.println("Resumed");
}
}
if (paused) {
Serial.print("Heartbeat paused for (ms): ");
Serial.println(heartbeat.pausedForMs());
Serial.print("Warmup paused for (ms): ");
Serial.println(warmup.pausedForMs());
return;
}
// Repeating millisecond timer
if (heartbeat.elapsed()) {
ledState = !ledState;
digitalWrite(LED_BUILTIN, ledState);
Serial.print("Heartbeat, next in (ms): ");
Serial.println(heartbeat.remaining());
}
// Repeating microsecond timer for high-rate sampling
if (sampleWindow.elapsed()) {
sampleCount++;
}
// One-shot millisecond trigger, active only until it fires once
if (!warmup.hasStarted()) {
Serial.println("Warmup finished and stopped");
} else if (warmup.isRunning()) {
Serial.print("Warming up, elapsed (ms): ");
Serial.println(warmup.elapsedMs());
}
if (warmup.triggered()) {
Serial.println("Warmup complete, retuning heartbeat");
heartbeat.setInterval(heartbeat.intervalMs() / 2);
heartbeat.reset();
warmup.cancel();
}
// One-shot microsecond trigger, restarted every time it fires
if (calibrationPulse.triggered()) {
Serial.print("Calibration pulse, samples since last: ");
Serial.println(sampleCount);
sampleCount = 0;
calibrationPulse.start();
}
}