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