Poti mit Schalter umschalten

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];
 }
}

Ein Schaltplan - gern auch auf Papier und abfotografiert würde uns zeigen, was du da gebaut hast.

ich würde den Schalter digital auslesen und dann den einen ermittelten Wert für beide Controller einsetzen.

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 ).

Nicht schön.

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)

Gut erkannt. Einfach:
Du hast 2 Poti an A0 und A1 und einen Schalter an D2.

Wenn das Poti Controllernummer 14 sein soll, was ist dann mit Controllernummer 16?

Am einfachsten gibst Du für potiPin[1] die controllerNummer[digitalRead(D2)] aus.

Noch immer nicht schön:

int controlChange = 176; // MIDI kanal 1

int potiPin[] = {A0, A1};
int controllerNummer[] = {31, 14};
int controllerWert[] = {0, 0};
int controllerWertAlt[] = {0, 0,};
int potiWert[] = {0, 0};

int i = 0;

const uint8_t switchPin = 2;          // Schalter am PIN

void setup()
{
  Serial.begin(31250);
  pinMode(switchPin, INPUT_PULLUP);    // Schalter schliesst nach GND oder ist offen
}

void loop()
{
  for (i = 0; i < 2; i++)
  {
    potiWert[i] = analogRead(potiPin[i]);
    controllerWert[i] = map(potiWert[i], 0, 1023, 0, 127);

    if (digitalread(switchPin) == LOW)
    {
      controllerNummer[1] = 14;
    }
    else
    {
      controllerNummer[1] = 16;
    }

    if (controllerWert[i] != controllerWertAlt[i])
    {
      Serial.write(controlChange);
      Serial.write(controllerNummer[i]);
      Serial.write(controllerWert[i]);
    }

    controllerWertAlt[i] = controllerWert[i];
  }
}

my_xy_projekt:

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

if (digitalread(switchPin) == LOW)

^~~~~~~~~~~

C:\Users\41797\Documents\Arduino\sketch_nov12a\sketch_nov12a.ino:26:9: note: suggested alternative: 'digitalRead'

if (digitalread(switchPin) == LOW)

^~~~~~~~~~~

digitalRead

exit status 1

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.)

GroßKleinschreibung beachten bzw. Compilermeldungen lesen.

Allen ein grosses Dankeschön. Es funktioniert nun zu voller Zufriedenheit.

Eine schöne Zeit wünsch ich euch.

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 richtig Freude an meinem Minimixer. J

Da kommen sofort Begehrlichkeiten auf.

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.

Besten Dank im Voraus.

Zeichnung x.pdf (211,3 KB)

int controlChange = 176; // MIDI kanal 1

int potiPin[] = {A0, A1};
int controllerNummer[] = {31, 14};
int controllerWert[] = {0, 0};
int controllerWertAlt[] = {0, 0,};
int potiWert[] = {0, 0};

int i = 0;

const uint8_t switchPin2 = 1;         // Schalter 1 am PIN 2
const uint8_t switchPin3 = 2;          // Schalter 2 am PIN 3

void setup()
{
  Serial.begin(31250);
  pinMode(switchPin2, INPUT_PULLUP);    // Schalter schliesst nach GND oder ist offen
  pinMode(switchPin3, INPUT_PULLUP);    // Schalter schliesst nach GND oder ist offen
}

void loop()
{
  for (i = 0; i < 2; i++)
  {
    potiWert[i] = analogRead(potiPin[i]);
    controllerWert[i] = map(potiWert[i], 0, 1023, 0, 127);

    if (digitalRead(switchPin2) == LOW)
    {
      controllerNummer[1] = 14; // X AiR18, Kanal 14
    }
    else
    {
      controllerNummer[1] = 16; // X AiR18, Kanal 16
    }

    if (digitalRead(switchPin3) == LOW)
    {
      controllerNummer[2] = 31; // X AiR18,  Main LR (stereo)
    }
    else
    {
      controllerNummer[2] = 32; // X AiR 18, DCA 1
    }

    if (controllerWert[i] != controllerWertAlt[i])
    {
      Serial.write(controlChange);
      Serial.write(controllerNummer[i]);
      Serial.write(controllerWert[i]);
    }

    controllerWertAlt[i] = controllerWert[i];
  }
}

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
    }
  }
}
//

Super. Vielen Dank. Funktioniert wie gewünscht.

Wünsche noch einen schönen Sonntag Abend.