DMX Serial Schalter Ports Ändern

Guten Tag,
ich bin dabei einen LED Streifen mit RGBWY über DMX mit einem Arduino anzusteuern, der Arduino ist als Empfänger. Über einen Dip Schalter möchte ich den Anfang Port einstellen können da das Gerät oft an anderen Plätzen eingesetzt wird. Da ich die PWM Port Brauche für die LED´s müssen die zum Dip Schalter frei bleiben. Ich finde im Internet keine Möglichkeit die Ports zu ändern. Ändern kann ich sie in dem Feld zu die Bit Größe angegeben wird aber nicht wo ich INPUT einstelle. (Ja einzelt auf INPUT stellen habe ich auch schon Probiert und klappt nicht.)
Danke im vorraus. Benutzt als DMX Treiber habe ich einen 75LBC176. Das ist mein Code:

#include <DMXSerial.h>             //Bibliothek
int address = 0;                   //Address1
int address2 = 0;                  //Address2
int address3 = 0;                  //Address3
int address4 = 0;                  //Address4
int address5 = 0;                  //Address5
int r;                             //INT ROT
int g;                             //INT GRÜN
int b;                             //INT BLAU
int w;                             //INT WEIß1
int y;                             //INT WEIß2

void setup() {
    DMXSerial.init(DMXReceiver);   //DMX Art
    for(int i = 4; i < 17; i++){              //Eingänge         
       pinMode(i,INPUT);
       digitalWrite(i, HIGH); 
     }
  pinMode(3, OUTPUT);              //PWM Ausgänge
  pinMode(9, OUTPUT);              //PWM Ausgänge
  pinMode(10, OUTPUT);             //PWM Ausgänge
  pinMode(11, OUTPUT);             //PWM Ausgänge
  pinMode(13, OUTPUT);             //PWM Ausgänge
  address = (digitalRead(2) * 1) + (digitalRead(16) * 2) + (digitalRead(15) * 4) + (digitalRead(14) * 8) + (digitalRead(11) * 16) + (digitalRead(7) * 32) + (digitalRead(6) * 64) + (digitalRead(5) * 128) + (digitalRead(4) * 256);
  if(address == 0) {               //Größer Kleiner Adresse
  address = 1;
  } else if(address > 512){
  address = 512;
  }
  address2 = (address) + (1);      //g  Adresse für extra Kanäle
  address3 = (address) + (2);      //b
  address4 = (address) + (3);      //w
  address5 = (address) + (4);      //y
}

void loop(){
 int r = DMXSerial.read(address);  //PWM mit Adressen Ausgang
 analogWrite(3, r / 4);            //AnalogWrite PWM auf Ausgang
 int g = DMXSerial.read(address2);
 analogWrite(13, g / 4);
 int b = DMXSerial.read(address3);
 analogWrite(3, b / 4);
 int w = DMXSerial.read(address4);
 analogWrite(13, w / 4);
 int y = DMXSerial.read(address5);
 analogWrite(13, y / 4);
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Hallo kevx_ice

Irgendwie ist die Zuordnung der PWM Portausgänge noch nicht ganz richtig, wenn du einen Arduino UNO verwendest.

Eine Geräteadresse, die über ein Vierbein-Mäuseklavier erzeugt wird, läßt sich über A0 bis A3 in das Programm einlesen.

Ich habe PWM ausgänge genommen die passen zum Aufbauen aber damit funktioniert ja alles, nur das umstellen der dip schalter nicht.

soll Adresse während des Betrieb geändert werden oder beim Start?
wo und wie hast du DIP-Schalter angeschlossen?

hier z.B. mit pull-down Wiederständen:

ok. du hast interne pull-ups genutzt. na dann hier:

#include <DMXSerial.h>             //Bibliothek
int address = 0;                   //Address1
int address2 = 0;                  //Address2
int address3 = 0;                  //Address3
int address4 = 0;                  //Address4
int address5 = 0;                  //Address5

void setup() {
  DMXSerial.init(DMXReceiver);   //DMX Art
  for (int i = 4; i < 17; i++) {            //Eingänge  // was ist mit Pin 2?
    pinMode(i, INPUT);
    digitalWrite(i, HIGH);
  }
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);              //PWM Ausgänge
  pinMode(9, OUTPUT);              //PWM Ausgänge
  pinMode(10, OUTPUT);             //PWM Ausgänge
  pinMode(11, OUTPUT);             //PWM Ausgänge
  pinMode(13, OUTPUT);             //PWM Ausgänge
  address = (digitalRead(2) * 1) +
            (digitalRead(16) * 2) +
            (digitalRead(15) * 4) +
            (digitalRead(14) * 8) +
            (digitalRead(11) * 16) +
            (digitalRead(7) * 32) +
            (digitalRead(6) * 64) +
            (digitalRead(5) * 128) +
            (digitalRead(4) * 256);
  if (address == 0) address = 1;
  else {
    if (address > 512)address = 512;
  }

  address2 = address + 1;      //g  Adresse für extra Kanäle
  address3 = address + 2;      //b
  address4 = address + 3;      //w
  address5 = address + 4;      //y
}

void loop() {
  analogWrite(3, DMXSerial.read(address) / 4 );
  analogWrite(9, DMXSerial.read(address2) / 4);
  analogWrite(10, DMXSerial.read(address3) / 4 );
  analogWrite(11, DMXSerial.read(address4) / 4 );
  analogWrite(13, DMXSerial.read(address5) / 4 );
}

Hey die Schalter Nummer sind im Code drinnen, auswendig weiß ich es nicht.
Und die adresse soll nur vorm start eingestellt werden

PWM Ausgänge brauchen keinen pinMode

Doppelbelegung

so was passiert wenn ich Teile des Code von OP nicht nach meinen Vorlieben ändere.
Pin2 war auch nicht hoch gezogen. Pin13 ist kein PWM.

Ich sehe in deinem Code grundlegende Probleme:

Sowas mit Nummern ist anstrengend zu pflegen und macht den Code unübersichtlich.
In Deinem Fall stolperst Du selbst drüber:

Und da tut sich schon das nächste Dilemma auf:
Du definierst oben Variablen:

und überschreibst diese mit einer lokalen Variante.

Dann schreibst Du für alles Pins von 4-17 (Mithin A3) das die INPUT_PULLUP sein sollen und überschreibst 9,10,11,13 dann als Output.
Benutzt aber zudem

der eben nicht als INPUT_PULLUP definiert ist.

Und als letztes

Ich hab noch nicht geschaut, ob .read evtl. -1 liefert, wenn kein DMX-Wert gelesen wurde. Das geht dann komplett schief.

Mein Tipp: Ganz andere Herangehensweise.
Das fängt schon bei den Adressen an...
z.B. mit einem Array.

1 Like

Mein Guten Morgen Sketch zum austesten, der auch nicht mehr Zeilen braucht als deiner...
Leider weiss ich noch immer nicht, welche Bibliothek Du benutzt. Daher ungetestet und nicht einmal kompiliert.

#include <DMXSerial.h>             //Bibliothek

const byte pwmOutPin[] = {5, 6, 9, 10, 11};               // bildet r, g ,b, w, y ab!
const byte adressPin[] = {2, 3, 4, 7, 8, 12, A2, A3, A4}; // bildet 9 bit ab! bis 0x01FF (511)
const uint16_t universumSize = 512;                       // DMX-Universum: verfügbare Adressen
const byte ctrlPin = 13;                                  // Kleiner Gag am Rande
uint32_t ctrlVal;                                         // gehört dazu
uint16_t adress;                                          //

void setup()
{
  DMXSerial.init(DMXReceiver);
  for (byte b = 0; b < sizeof(adressPin); b++)            // über alle Pins
  {
    pinMode(adressPin[b], INPUT_PULLUP);                  //
  }
  getDmxAdress();                                         // 
  pinMode(ctrlPin, OUTPUT);                               // für den Gag am Rande
  digitalWrite(ctrlPin, HIGH);
}
//
void loop()
{
  dmxValOut();
}
//
void getDmxAdress()                                       
{
  adress = 0;                                              // Vorbelegung
  for (byte b = 0; b < sizeof(adressPin); b++)             // durchläuft alle Pins
  {
    if (!digitalRead(adressPin[b]))                        // Pin aktiviert?
    { bitSet(adress, b); }                                 // setze das dazugehörige Bit
  }
  constrain(adress, 1, universumSize - sizeof(pwmOutPin));           
}
//
void dmxValOut()
{
  for (byte b = 0; b < sizeof(pwmOutPin); b++)             // durchläuft alle Pins
  {
    int val = DMXSerial.read(address + b);                 // liest den Wert dazu ein
    if (val > -1)                                          // Prüfung ob valide
    {
      ctrlVal++;
      if (ctrlVal == 0)
      { digitalWrite(ctrlPin, !digitalRead(ctrlPin)); }
      analogWrite(pwmOutPin[b], val / 4);
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.