Stimeration 0.1.5
A simple yet powerful timer library that gives you stimulation.
Loading...
Searching...
No Matches
Stimeration

Stimeration

A simple yet powerful timer library that gives you stimulation.

Features

  • Gives you stimulation
  • Repeating interval timers (Timer, MicroTimer) with millisecond and microsecond resolution
  • One-shot triggers (Trigger, MicroTrigger) for delayed, single-fire actions
  • Pause and resume support that excludes paused time from elapsed and remaining calculations
  • Stateless hasElapsed() helper for one-off checks without a timer object
  • Time unit conversion helpers between seconds, milliseconds, and microseconds
  • Header-only, template-based design with no dynamic allocation, suited for AVR-class microcontrollers

Installation

Clone or download this repository into your Arduino libraries folder:

# For Linux
git clone https://codeberg.org/razkar/stimeration ~/Arduino/libraries/Stimeration

Restart the Arduino IDE (or just re-run arduino-cli compile) to pick it up.

Usage

#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();
}
}

See examples/ for more focused, single-concept sketches.

Documentation

Full API reference is available at https://razkar.codeberg.page/stimeration/.

License

BlueOak-1.0.0

Cheers, RazkarStudio

Copyright © 2026 RazkarStudio