Hey Forum!
Letzte Woche erhielt ich meinen ersten Arduino Uno und bin nun bei ersten Experimenten. LEDs faden, eine gelötetes “Keypad” mit Widerstandsleiter und RC Entprellung kann ich erfolgreich am Analogeingang auslesen... Ich habe vor 20 Jahren Pascal und rudimentär Assembler gelernt, bin zwar etwas eingerostet, aber fange nicht bei Null an.
Doch zur eigentlichen Frage, die geplante Anwendung ist die folgende: Ich möchte ein Programm schreiben, welches in regelmäßigen Abständen einen Impuls ausgibt, sagen wir zum Anfang, eine LED soll kurz blitzen. Soweit, so einfach.
recorded_time = millis()
if millis() > recorded_time + delay_between_steps do Flash
Jetzt zum Problem: 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.
Luxus wäre später noch eine “Tap” Funktion wie am Drumcomputer, also eine Funktion, welche im Hintergrund den Abstand zwischen 2 oder für mehr Genauigkeit 4 Tastendrücken misst und in einen delay_between_steps Wert umsetzt.
Wofür das Ganze? Es geht darum, ein DMX Lichtpult mit periodischen Impulsen zu versorgen (ob via Midi oder Audio weiss ich noch nicht), um Lichteffekte zur Musik zu synchronisieren. Dabei darf kein Impuls ausfallen oder verzögert kommen und kein Tastendruck verloren gehen. Es soll absolut synchron zur (elektronischen) Musik laufen und um die “Latenz” der angeschlossenen (glühwendenhaltigen) Leuchtmittel “vorgehen”, damit die Lampe “auf den Punkt” leuchtet und nicht erst angeht.
Jede Funktion einzeln ist für mich kein Problem, dass Problem ist, wie bekommt man das alles in einen Loop - mit dem Anspruch der Timinggenauigkeit. Geht das überhaupt? Eigentlich bräuchte man ja 2 voneinander völlig unabhängige "Tasks". Wenn ich versuche, mir das als Struktogramm aufzuschreiben, habe ich immer das Dilemma, dass ich entweder Gefahr laufe, einen Impuls zu verlieren, z.B. wegen einer Interruptroutine oder eben einen Tastendruck...
An dieser Stelle habe ich einen Knoten im Hirn und wäre für jeden Vorschlag von Euch sehr dankbar.
Oder sollte ich gleich mit 2 Arduinos planen, einen nur zum Keypad Lesen, delay_between_steps und trigger_within_delay berechnen und übergeben, den anderen nur zum Variable Annehmen und Impulse Ausgeben?
Mittelfristig ist die Erweiterung um ein LCD Shield geplant, um z.B. die aktuellen BPM auszugeben.
Ich hoffe, dass Kernproblem ist verständlich. Für Eure Hilfe danke ich im voraus.
Mit besten Grüßen
Helmuth