Ich möchte, wenn ich einen Poti drehe, einen MIDI Befehl ausgeben und eine LED leuchten lassen.
Diese LED soll aber etwas länger leuchten, als die eigentliche Ausgabe des MIDI Send Befehls, da sie sonst nicht erkennbar fürs menschliche Auge leuchtet.
Ein "Delay" von 50 wäre perfekt, wenn..., ja wenn da nicht der MIDI Send Befehl in der Warteschleife wäre.
Da ich absoluter Anfänger bin, komme ich mit dem "Nachtwächter", wenn er denn hier überhaupt nötig sei, auch nicht wirklich voran, denn der eigentlich sehr einfache Sketch würde hier grosse Ausmasse annehmen.
Gibt es hier eine einfachere Lösung?
Ich habe hier eine vereinfachte Variante meines Sketches angefügt. Die MIDI Befehle laufen perfekt.
Ich benutze einen Teensy, daher passt der MIDI Send Befehl nicht mit einem Arduino überein, aber das spielt wohl für mein Problem keine Rolle.
Besten Dank im Voraus für eure Mühen, LG aus Kopenhagen
Setze Deinen Sketch am besten in Code Tags </> Symbol im Editor...
int cWert = 0; //Damit die Werte nur dann gesendet werden,
int cWertAlt = 0; //wenn das Poti benutzt wird
int potiWert = 0; //bestimmt den Poti
int ledPin = 13; // Ausgang der LED
void setup() {
Serial.begin(31250); //Die Bauderate der MIDI Sprache
pinMode(ledPin, OUTPUT); //Bestimmt den Zustand der LED Zuweisung am Proessor
}
void loop() {
potiWert = (analogRead(9)); //Die Adresse des Poti
cWert = map(potiWert,0,1023,0,127); //Der Poti Wert wird auf MIDI Verständliche
//Werte von 0 - 127 runtergerechnet
if (cWert != cWertAlt) { //Wenn der Poti gedreht wird...
usbMIDI.sendControlChange(22,cWert,0);//Der MIDI Send Befehl
digitalWrite(ledPin, HIGH); //Eine LED leuchtet, wenn der Poti benutzt wird
delay(50); //DIES HIER MUSS WEG,HÄLT ALLES AUF
}
else digitalWrite(ledPin, LOW);
cWertAlt = cWert;
}
Ach, das war deiner?
Tschuldige, ich hatte das nicht gesehen...
Magst du das nochmal posten, habe das mittlerweile verstanden, aber als Anfänger darf ich jetzt erstmal nichts neu mit code posten...
Der wird nicht unterm Arduino deklariert, da es für einen Teensy ist. Arduino kann "usbMIDI" nicht...
Ich hatte gehofft, dass das kein grosses Problem sein würde...
Natürlich trotzdem besten Dank...
Der Teensy funzt ja fast genauso wie der Arduino, nur dass er eine eigene MIDI Schnittstelle an Board hat, weswegen ich dann zum Teensy auch gewechselt bin...
Vielleicht kannst du aber trotzdem mein problem lösen?
if (cWert != cWertAlt) { //Wenn der Poti gedreht wird...
supersonderstatus=1;
ledabmillis=millis();
usbMIDI.sendControlChange(22,cWert,0);//Der MIDI Send Befehl
digitalWrite(ledPin, HIGH); //Eine LED leuchtet, wenn der Poti benutzt wird
}
if (supersonderstatus==1 and millis()-ledabmillis>=50){
supersonderstatus=0;
digitalWrite(ledPin, LOW); //Eine LED geht auch wieder aus, wenn nicht mehr gedreht wird
}
Eigentlich GENAU der Nachtwächter
(sofern supersonderstatus und ledabmillis deklariert werden)
Das mit der LED würde mit ein paar veränderten Zeilen deines Codes etwa so funktionieren:
int cWert = 0; //Damit die Werte nur dann gesendet werden,
int cWertAlt = 0; //wenn das Poti benutzt wird
int potiWert = 0; //bestimmt den Poti
int ledPin = 13; // Ausgang der LED
const unsigned long leuchtDauer = 50;
unsigned long startZeit;
void setup() {
Serial.begin(31250); //Die Bauderate der MIDI Sprache
pinMode(ledPin, OUTPUT); //Bestimmt den Zustand der LED Zuweisung am Proessor
}
void loop() {
potiWert = (analogRead(9)); //Die Adresse des Poti
cWert = map(potiWert, 0, 1023, 0, 127); //Der Poti Wert wird auf MIDI Verständliche
//Werte von 0 - 127 runtergerechnet
if (cWert != cWertAlt) { //Wenn der Poti gedreht wird...
usbMIDI.sendControlChange(22, cWert, 0); //Der MIDI Send Befehl
digitalWrite(ledPin, HIGH); //Eine LED leuchtet, wenn der Poti benutzt wird
startZeit = millis(); // Einschaltzeitpunkt merken
}
if (millis() - startZeit >= leuchtDauer) { // wenn die Leuchtdauer vorbei ist die LED ausschalten
digitalWrite(ledPin, LOW);
}
cWertAlt = cWert;
}
Allerdings schwanken normalerweise die Werte von analogRead ein wenig, auch wenn das Poti nicht gedreht wird.
Und das wird wohl für "Dauerfeuer" auf der MIDI-Schnittstelle sorgen. Und auch die LED wird höchstwahrscheinlich dauernd leuchten oder zumindest nervös blinken - auch wenn das Poti nicht berührt wird.
Kannst dir ja mal die Werte von "potiWert" oder "cWert" auf der seriellen Schnittstelle ausgeben lassen, dann siehst du das.
Haha..., Supersonderstatus, sehr schön geschrieben....
Also, das ist tatsächlich einfach, aber einem Dummen wie mir muss man es echt ins Hirn prügeln. Ja, es IST der Nachtwächter, ich habe ihn einfach so nicht sehen können...
Also, allerliebsten vielen Dank, das bringt mich so richtig weiter, auch für den Rest meines Programmes.
Falls du mal Urlaub in Kopenhagen machen solltest, melde dich, ich werde dir und deiner Familie für einen Tag den Reiseführer spielen....
Ja, du solltest eine "Toleranz-Schwelle" einbauen.
Und dass die Werte schwanken hat meist weniger mit der Qualität des Poti zu tun, als mit dem ADC (analog to digital converter) des Mikrocontrollers. Das ist kein "Präzisions-Instrument", die Versorgungsspannung ist oft nicht ganz sauber, es gibt Einstreuungen und so weiter.
const int ledPin = 13;
int cWert;
int potiWert;
int potiWertAlt;
int toleranz = 1; // kleine Werte sollten reichen
const unsigned long leuchtDauer = 50;
unsigned long startZeit;
void setup() {
Serial.begin(31250); //Die Bauderate der MIDI Sprache
pinMode(ledPin, OUTPUT); //Bestimmt den Zustand der LED Zuweisung am Proessor
}
void loop() {
potiWert = (analogRead(9)); //Die Adresse des Poti
if ( (potiWert > (potiWertAlt + toleranz)) || (potiWert < (potiWertAlt - toleranz)) ) {
cWert = potiWert/8; // ergibt Werte von 0 bis 127
usbMIDI.sendControlChange(22, cWert, 0); //Der MIDI Send Befehl
digitalWrite(ledPin, HIGH); //Eine LED leuchtet, wenn der Poti benutzt wird
startZeit = millis(); // Einschaltzeitpunkt merken
potiWertAlt = potiWert;
}
if (millis() - startZeit >= leuchtDauer) { // wenn die Leuchtdauer vorbei ist die LED ausschalten
digitalWrite(ledPin, LOW);
}
}
Also nur dann einen MIDI-Befehl senden, wenn sich der "potiWert" um mehr als den Toleranzwert ändert. Es reichen aber durchaus kleine "Toleranzwerte". Weil die Werte des ADC meist nicht um mehr als +/- 1 oder 2 schwanken.
Allerdings kann es sein, dass man sich Störungen einfängt. Und dann sind die Schwankungen größer. Das kann sich so äußern: Du berührst das Poti und plötzlich gibt es Schwankungen von 10 oder mehr.
Da kann ein Keramik-Kondensator, 100nF helfen. Zwischen GND und dem Analog-Eingang, an dem das Poti hängt.
Also zumindest bei mir ergibt so ein Aufbau sehr "smoothe" Poti-Werte.
Das Poti sollte übrigens nicht allzu hochohmig sein. 10 Kiloohm sind OK.
Beim Code oben werden beim Drehen des Potis mehrmals hintereinander MIDI-Befehle mit demselben Wert versendet. Das kann ein Problem sein oder auch nicht, das hängt davon ab, wofür du es verwendest.
Wenn du "toleranz" auf 7 stellst wird dieses Verhalten verhindert und es werden nur MIDI-Befehle mit unterschiedlichen Werten gesendet.
Das mit der Toleranz werde ich gleich mal ausprobieren, klingt einfacher als meine Rechnung.
Das mit dem Potiwert geteilt durch 8 ist auch super, aber ich muss beim "map" bleiben, da ich auch einen Joystick einplane, und da muss ich den Mittelwert berechnen und einmal auch sogar eine Hälfte des ganzen Wertes negativieren. Klingt jetzt seltsam, ergibt aber Sinn..
Egal, du hast mir absolut super weiter geholfen, eben auch so, dass ich es verstehe...