Metronom/BPM Counter - grundsätzliches Vorgehen?

Helmuth:
Während dieser Loop läuft, möchte ich via Tastendruck delay_between_steps manipulieren (up/down). Dabei soll einerseits kein Tastendruck verlorengehen, andererseits darf der Loop nicht stolpern.
Desweiteren brauche ich durch Tastendruck ausgelöst die Funktion start_now, d.h. unter Beibehaltung von delay_between_steps möche ich den Triggerpunkt innerhalb dieses Zeitfensters verschieben, nennen wir es trigger_within_delay.

Vielleicht sowas?

// Dx
#define BUTTON_UP 2
#define BUTTON_DOWN 3
#define BUTTON_START 4
#define LED 13

unsigned long tick;
unsigned int delayBetweenSteps = 1000; // Blinkt alle 1000ms ...
unsigned int blinkLength = 20; // ... 20ms lang

void setup() {
}

void loop() {
  if (digitalRead(BUTTON_UP))
    delayBetweenSteps += 10; // ms
  if (digitalRead(BUTTON_DOWN))
    delayBetweenSteps -= 10; // ms
  if (digitalRead(BUTTON_START))
    tick = millis();
  if (millis()-tick > delayBetweenSteps)
    tick += delayBetweenSteps;
  digitalWrite(LED, millis()-tick<blinkLength);
}

Ungetestet, daher ohne Gewähr! :wink: