Hallo zusammen
Ich habe zwei Potieingänge und mit diesen steuere ich per ADUINI UNO R3 bei meinem Behringer X AIR 18 über MIDI das Volumen zweier Kanäle. Nun will ich mit einem Schalter ein Potieingang wahlweise für zwei Kanäle benutzen. Das File das ich verwende funktioniert für zwei Regler, das mit dem Umschalter kriege ich nicht hin. Vielleicht kann mir da jemand weiterhelfen. Herzlichen Dank im Voraus.
Schöne Grüsse
Joe
int controlChange = 176; // MIDI kanal 1
int potiPin[] = {A0,A1};
int controllerNummer[] = {16,14};
int controllerWert[] = {0, 0};
int controllerWertAlt[] = {0, 0,};
int potiWert[] = {0, 0};
int i = 0;
void setup() {
Serial.begin(31250);
}
void loop() {
for (i = 0; i < 2; i++) {
potiWert[i] = analogRead(potiPin[i]);
controllerWert[i] = map(potiWert[i],0,1023,0,127);
if (controllerWert[i] != controllerWertAlt[i]) {
Serial.write(controlChange);
Serial.write(controllerNummer[i]);
Serial.write(controllerWert[i]);
}
controllerWertAlt[i] = controllerWert[i];
}
}
Zeig mal, was Du versucht hast.
Letzendlich brauchst Du keine for-Schleife mehr - Du liest ja nur noch ein Poti aus. Und der Index 'i' bei den Controllerwerten hängt jetzt nicht mehr von der Schleifenvariablen ab, sondern vom gelesenen Schalterwert ( 0 oder 1 ).
int controlChange = 176; // MIDI kanal 1
const uint8_t chanels = 2;
int potiPin[chanels] = {A0, A1};
int controllerNummer[chanels] = {16, 14};
int controllerWert[chanels] = {0, 0};
int controllerWertAlt[chanels] = {0, 0,};
int potiWert[chanels] = {0, 0};
const uint8_t switchPin = 2; // an dem steckt der Schalter
const uint8_t summenChannel = 0; // Welcher Poti soll beide Ausgänge bedienen
void setup()
{
Serial.begin(31250);
pinMode(switchPin, INPUT_PULLUP); // Der Schalter schaltet den PIN zwangsweise auf GND oder ist offen
}
void loop()
{
getPoti();
setChannel();
}
void getPoti()
{
for (uint8_t i = 0; i < chanels; i++)
{
potiWert[i] = analogRead(potiPin[i]);
controllerWert[i] = map(potiWert[i], 0, 1023, 0, 127);
}
}
void setChannel()
{
if (digitalRead(switchPin) == LOW) // Schalter ist geschlossen
{
for (uint8_t i = 0; i < chanels; i++) // zählt durch alle Kanäle
{
controllerWert[i] = controllerWert[summenChannel]; // Setzt alle Werte auf den "Master"
}
}
// Ausgabe wie bisher
for (uint8_t i = 0; i < chanels; i++)
{
if (controllerWert[i] != controllerWertAlt[i])
{
Serial.write(controlChange);
Serial.write(controllerNummer[i]);
Serial.write(controllerWert[i]);
}
controllerWertAlt[i] = controllerWert[i];
}
}
ich hätte einfach den Wert vom ersten Poti zum anderen kopiert.
Werte die zusammen gehören, in eine Struktur übernommen.
Naming Things geht sicher noch schöner.
ungetestet:
// https://forum.arduino.cc/t/poti-mit-schalter-umschalten/1413640/
struct Channel {
const uint8_t potiPin; // an analog input
const uint8_t nummer; // channel number used for output
uint16_t potiWert; // readed value from input
uint8_t wert; // converted value
uint8_t wertAlt; // converted value previous iteration
} channel[] {
{A0, 16},
{A1, 14}
};
constexpr uint8_t controlChange {176}; // MIDI kanal 1
constexpr size_t switchPin {2}; // an dem steckt der Schalter
void setup() {
Serial.begin(31250);
pinMode(switchPin, INPUT_PULLUP); // Der Schalter schaltet den PIN zwangsweise auf GND oder ist offen
}
void loop() {
for (size_t i = 0; i < sizeof(channel) / sizeof(channel[0]); i++) { // zählt durch alle Kanäle
if (digitalRead(switchPin) == LOW && i != 0) { // Schalter ist geschlossen: Wert wird genommen von 0
channel[i].potiWert = channel[0].potiWert;
}
else {
channel[i].potiWert = analogRead(channel[i].potiPin);
}
channel[i].wert = map(channel[i].potiWert, 0, 1023, 0, 127);
if (channel[i].wert != channel[i].wertAlt) {
Serial.write(controlChange);
Serial.write(channel[i].nummer);
Serial.write(channel[i].wert);
channel[i].wertAlt = channel[i].wert;
}
}
}
//
Ganz herzlichen Dank.
Ich habe mich offenbar ungenau ausgedrückt. Im Anhang eine Zeichnung mit den entsprechenden Bemerkungen.
Ein Poti mit fixer Controllernummer 31
Das andere Poti Wahlweise mit dem Schalter Controllernummer 14 oder 16. ZZ.pdf (131,5 KB)
Danke für den Vorschlag. Da hat sich noch ein Fehler gezeigt und ich krieg das nicht gebacken.
Wenn du mir da noch weiterhelfen kannst, bin ich die sehr dankbar.
C:\Users\41797\Documents\Arduino\sketch_nov12a\sketch_nov12a.ino: In function 'void loop()':
C:\Users\41797\Documents\Arduino\sketch_nov12a\sketch_nov12a.ino:26:9: error: 'digitalread' was not declared in this scope
Compilation error: 'digitalread' was not declared in this scope
DrDiettrich: Wenn das Poti Controllernummer 14 sein soll, was ist dann mit Controllernummer 16?
Der Wert des Potis wird jeweils nur über eine Controllernummer ausgegeben. Die andere Controllernummer ist dann 0. (14 aktiv, 16 inaktiv oder 16 aktiv, 14 inaktiv.)
Oh sorry, Asche aufs Haupt.
Hab ich am Handy geschrieben und übersehen.
Super.
Ich rate dringend dazu noch ein wenig am Code zu bauen.
Alles was sich nicht verändern kann als const.
Keine magischen Numbers im Code. Verwende beschreibende Variablen für Deine 14 / 15
Ich selbst bin ein Freund von Einschränkung des Wertbereiches von Variablen und Konstanten auf das geringst mögliche Maß. ìnt ist 16bitig und kann negativ werden. Ein uint8_t ist 8bit breit und kann nur positiv sein.
Und als letztes: Trenne das auf, wie ich das im ersten Vorschlag gemacht habe. Dann kommst Du nicht in Versuchung daraus im loop() einen Spaghetticode zu bauen...
Ich habe diesen nun um eine Funktion erweitert und einen zweiten Schalter eingebaut.
Mit diesem will ich beim zweiten Fader Wahlweise Controllernummer 31 oder 32 steuern.
Der erweiterte Skatch zeigt mir auf dem Arduino IDE keinen Fehler an, funktionieren tut das Ganze aber nicht. Da benötige ich noch einmal eure Unterstützung.
du solltest schon exakt beschreiben was dein Sketch falsch macht und was er statt dessen machen soll.
Dein Hauptproblem wird sein, dass du mit deinen Arrays durcheinander kommst.
Daher kann ich meinen Rat von vorher nur wiederholen: Fasse in eine Struktur zusammen was zusammengehört. Wenn das für einen Mixer funktioniert ist es dann ein leichtes mehrere derartige Mixer in einen Sketch zu machen.
Codeteile duplizieren mit STRG-C STRG-V geht meist schief.
edit:
ungeprüft:
ein Channel hat
ein Poti
einen Schalter
zwei Wunsch Nummern die ausgegeben werden sollen
einen gelesenen Wert vom Poti (braucht es eigentlich nicht)
einen umgerechneten Wert (braucht es eigentlich nicht)
einen "alten" umgerechneten Wert
und das ganze willst dann zwei mal.
// https://forum.arduino.cc/t/poti-mit-schalter-umschalten/1413640/
struct Channel {
const uint8_t potiPin; // an analog input
const uint8_t switchPin; // a digital input
const uint8_t nummerA; // channel number used for output
const uint8_t nummerB; // channel number used for output
uint16_t potiWert; // readed value from input
uint8_t wert; // converted value
uint8_t wertAlt; // converted value previous iteration
};
Channel channel[] {
{A0, 2, 14, 16, 0, 0, 0},
{A1, 3, 31, 32, 0, 0, 0}
};
constexpr uint8_t controlChange {176}; // MIDI kanal 1
void setup() {
Serial.begin(31250);
for (size_t i = 0; i < sizeof(channel) / sizeof(channel[0]); i++) { // zählt durch alle Kanäle
pinMode(channel[i].switchPin, INPUT_PULLUP); // Der Schalter schaltet den PIN zwangsweise auf GND oder ist offen
}
}
void loop() {
for (size_t i = 0; i < sizeof(channel) / sizeof(channel[0]); i++) { // zählt durch alle Kanäle
channel[i].potiWert = analogRead(channel[i].potiPin); // Poti lesen
channel[i].wert = map(channel[i].potiWert, 0, 1023, 0, 127); // Wert konvertieren
if (channel[i].wert != channel[i].wertAlt) { // nur bei Änderung
Serial.write(controlChange);
Serial.write(digitalRead(channel[i].switchPin) == LOW ? channel[i].nummerA : channel[i].nummerB);
Serial.write(channel[i].wert);
channel[i].wertAlt = channel[i].wert; // alten Wert für nächsten Check merken
}
}
}
//