Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DMXSerial.noDataSince() not behaving as expected. #76

Open
bill-i-am-code opened this issue May 17, 2023 · 0 comments
Open

DMXSerial.noDataSince() not behaving as expected. #76

bill-i-am-code opened this issue May 17, 2023 · 0 comments

Comments

@bill-i-am-code
Copy link

I have been looking at this library to provide an interface between 2 channels of DMX and I2C. I have written the very simple sketch as below, based on the example.

//#include <Wire.h>

int dmxAddress[] = {112, 113  }; //DMX Address of the 2 channels to be monitored
byte dmxValues[2]; // Levels associated with the 2 channels
byte hiByte[2]; // used for reading DMX address from I2c
byte loByte[2]; // used for reading DMX address from I2c

const int Pin1 = 9;     // PWM output 1
const int Pin2 = 6;     // PWM output 2
const int FlagPin = 17; // Low when DMX is present.

void setup()
{
  DMXSerial.init(DMXReceiver);
//  Wire.begin(2);
//  Wire.onRequest(requestEvent);

//  Wire.onReceive(receiveEvent);

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(FlagPin, OUTPUT);

  // set some default values
  digitalWrite(FlagPin, 1);
  digitalWrite(LED_BUILTIN, HIGH);
}

void loop()
{
  // Calculate how long no data bucket was received
  unsigned long lastPacket = DMXSerial.noDataSince();
  if (lastPacket < 5000)
  {
    // read recent DMX values
    digitalWrite(FlagPin, 0);
    //digitalWrite(LED_BUILTIN, 1);
    dmxValues[0] = DMXSerial.read(dmxAddress[0]);
    dmxValues[1] = DMXSerial.read(dmxAddress[1]);
    analogWrite(Pin1, dmxValues[0]);
    analogWrite(Pin2, dmxValues[1]);
  }
  else
  {
    analogWrite(Pin1, 0);
    analogWrite(Pin2, 0);
    digitalWrite(LED_BUILTIN, 0);
    digitalWrite(FlagPin, 1);
  } // if
}
//void requestEvent()
//{
//  Wire.write(dmxValues[0]);
//  Wire.write(dmxValues[1]);
//}
//void receiveEvent(int howMany)
//{
//  while (Wire.available())
//  {
//    hiByte[0] = Wire.read();
//    loByte[0] = Wire.read();
//    hiByte[1] = Wire.read();
//    loByte[1] = Wire.read();
//    dmxAddress[0] = (hiByte[0] << 8) + loByte[0];
//    dmxAddress[1] = (hiByte[1] << 8) + loByte[1];
//  }
//}

I noticed that FlagPin will go high after some time even when valid DMX data seemed to be received. So I commented out the I2C part of the code.
I have ran the above code on an Arduino Nano and an Arduino Nano Every. In both cases the else part of the if statement in loop() is called when I think valid data is being received. Please see attached video. LED_BUILTIN goes off after a few seconds, where the 2 LEDs keep varying in level showing DMX being received.

This is not the behaviour I was expecting, but I may have misunderstood the library. Any help received with thanks.
IMG_8373.zip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant