Problem mit DMX-Shield und 433MHz-Sender

Hallo ihr,

ich bin sowohl hier als auch in der Welt des Arduino recht neu. Ich habe nach einer Lösung für ein konkretes Problem gesucht und der Arduino schien dabei die richtige Basis. Bisher habe ich so gut wie keine Erfahrung, bin bisher aber immer ganz gut mit Logik und Recherche vorangekommen.

Zu meiner Anwendung:
Ich möchte Funksteckdosen per DMX-Ansteuerung (Lichtsteuerbus) schalten. Dafür habe neben dem Arduino Uno mir ein DMX-Shield von Conceptinetics zugelegt. Das Funkmodul hatte ich schon in meinem Raspberry Pi verbaut und wurde von dort ausgeborgt, stammte ursprünglich von Watterott.

Dann habe ich meinen ersten Sketch programmiert, was auch so weit funktionierte. Ich kann die Funksteckdosen wunderbar per DMX an- und ausschalten.
ABER: Die Funsteckdosen schalten mit einer variablen Verzögerung von ca. 0,5s bis 2s, was für eine Lichtsteuerung zu lange ist. Auch wenn ich per DMX Kanäle gleichzeitig schalte, reagieren die Funksteckdosen nach einander mit etwa 0,5s.

Wie gesagt, ich hab wenig Verständnis dafür, was ich da geschrieben habe. Aber dass der Prozess so lange dauert kann ich mir nicht vorstellen. Kann es sein, dass die beiden Libraries kollidieren oder hab ich das Ganze nur unzweckmäßig geschrieben?

Ich würde mich freuen, wenn mir jemand helfen kann!

Beste Grüße,
Philipp

Hier mein Code:

#include <Conceptinetics.h>
#include <RCSwitch.h>
#define SLAVE_CHANNELS 5

DMX_Slave dmx_slave ( SLAVE_CHANNELS );
RCSwitch mySwitch = RCSwitch();

void setup() {            
  dmx_slave.enable ();  
  dmx_slave.setStartAddress (300);
  mySwitch.enableTransmit(10);  
}

void loop()
{
  if ( dmx_slave.getChannelValue (1) > 127 )
    mySwitch.switchOn("01101", "10000");
  if ( dmx_slave.getChannelValue (1) < 128 )
    mySwitch.switchOff("01101", "10000");
    
  if ( dmx_slave.getChannelValue (2) > 127 )
    mySwitch.switchOn("01101", "01000");
  if ( dmx_slave.getChannelValue (2) < 128 )
    mySwitch.switchOff("01101", "01000");
    
  if ( dmx_slave.getChannelValue (3) > 127 )
    mySwitch.switchOn("01101", "00100");
  if ( dmx_slave.getChannelValue (3) < 128 )
    mySwitch.switchOff("01101", "00100");
    
  if ( dmx_slave.getChannelValue (4) > 127 )
    mySwitch.switchOn("01101", "00010");
  if ( dmx_slave.getChannelValue (4) < 128 )
    mySwitch.switchOff("01101", "00010");
    
  if ( dmx_slave.getChannelValue (5) > 127 )
    mySwitch.switchOn("01101", "00001");
  if ( dmx_slave.getChannelValue (5) < 128 )
    mySwitch.switchOff("01101", "00001");
}

EDIT:
Ich konnte das Problem eingrenzen, die DMX-Verarbeitung läuft super und das “Problem” ist scheinbar keines und folgt gänzlich aus der RCSwitch-Library. Durch Hinzufügen von

mySwitch.setRepeatTransmit(3);
  mySwitch.setPulseLength(200);

in die setup-Loop konnte ich den Sendeprozess deutlich beschleunigen. Jedoch bin ich dort scheinbar schon an der unteren Grenze, danach läuft die Funkübertragung nicht mehr stabil. Nun werde ich mich mit der Library selbst beschäftigen, um dort evtl. noch etwas Geschwindigkeit rausholen zu können.

phipper:
if ( dmx_slave.getChannelValue (1) > 127 )
mySwitch.switchOn(“01101”, “10000”);
if ( dmx_slave.getChannelValue (1) < 128 )
mySwitch.switchOff(“01101”, “10000”);

Bist Du sicher, dass Du immer unmittelbar nacheinander ZWEI Aufrufe von dmx_slave.getChannelValue mit demselben Parameter machen möchtest?

Wie lange dauert die Abarbeitung von einem dmx_slave.getChannelValue (1)?

Möchtest Du nicht vielleicht viel eher nur EINEN Aufruf der Funktion mit jedem Parameter machen und dann zweifach verzweigen, vielleicht so:

  if ( dmx_slave.getChannelValue (1) > 127 )
    mySwitch.switchOn("01101", "10000");
  else
    mySwitch.switchOff("01101", "10000");

Eine Abfrage und dann je nachdem für eine von zwei möglichen Aktionen entscheiden???

Und das für alle if-Abfragen, bei denen Du mehrfache Aufrufe mit demselben Parameter drin hast?

Ein Programm macht immer das, was Du programmierst.
Wenn Du Quatsch programmierst, macht das Programm genau das.

Danke für deine Anmerkung!
Dass die DMX-Wertabfrage als Auslöser für die Verzögerung auszuschließen ist, hatte ich ja bereits editiert. Und als Quatsch würde ich das nicht bezeichnen, es ist logisch korrekt und funktioniert auch.
Aber du hast natürlich recht, dass diese Optimierung ein paar Takte spart.

Beste Grüße