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

lamp wrongly dark under very specific conditions, Uno 8 lamps krida #57

Open
distrakt opened this issue Feb 23, 2024 · 1 comment
Open
Labels
bug Something isn't working

Comments

@distrakt
Copy link

Describe the bug

The sketch shows a bug I have seen in dimmable_lights.h

What I see is this:

If half the lamps are set to value X, and half are set to X+1,
and digitalRead() is in the sketch (even uncalled!)
then the ones set to X are displayed dark.

In this sketch I set them alternating ABABABAB, but I've
seen same behavior for AAAABBBB; likely any order.
If they're not half-and-half, the one with fewer
works ok. (or maybe one with greater, my observations
got confused)

Conditions:

Using 8 lamps on a Krida controller, on Arduino Uno
and ONLY if a digitalRead() function call is present,
even if the digitalRead() hasn't been called.

(Perhaps digitalRead() has some setup code or interrupt contention... ?)

Hardware and software used

  • Library version: 1.6.1
  • Arduino core: 1.8.6
  • Enviroment/IDE: Arduino IDE 2.2.1
  • Dimmer board: Krida 8
  • Board: Arduino UNO, the classic

Using board 'uno' from platform in folder: /Users/poly/Library/Arduino15/packages/arduino/hardware/avr/1.8.6
Using core 'arduino' from platform in folder: /Users/poly/Library/Arduino15/packages/arduino/hardware/avr/1.8.6


I'm pasting the sketch in here, apologies if that isn't the convention, this is my first github bug report! :)

/**
[email protected] 2024-02-23

This sketch shows a bug I have seen in dimmable_lights.h

What I see is this:

If half the lamps are set to value X, and half are set to X+1,
then the ones set to X are displayed dark.

In this sketch I set them alternating ABABABAB, but I've
seen same behavior for AAAABBBB; likely any order.
If they're not half-and-half, the one with fewer
works ok. (or maybe one with greater, my observations
got confused)

Conditions:

Using 8 lamps on a Krida controller, on Arduino Uno
and ONLY if a digitalRead() function call is present,
even if the digitalRead() hasn't been called.

*/

#include <dimmable_light.h> // library "Dimmable Light" 1.6

#define ALL_EIGHT_LAMPS 1 // bug happens if using 8 lamps. fewer works ok.
#define READPIN 12
#define INCLUDE_A_DIGITAL_READ 1

// the 8 pins used by the Krida 8-channel dimmer
DimmableLight dl1(11);
DimmableLight dl2(10);
DimmableLight dl3(9);
DimmableLight dl4(8);
#if ALL_EIGHT_LAMPS
DimmableLight dl5(7);
DimmableLight dl6(6);
DimmableLight dl7(5);
DimmableLight dl8(4);
#endif

void setup() {
DimmableLight::setSyncPin(3);
DimmableLight::begin();
pinMode(READPIN, INPUT_PULLUP);

Serial.begin(115200);
delay(200);
Serial.print("\n\n");
Serial.print("Dimmable Light bug with Krida 8 channel controller\n\n");
#if INCLUDE_A_DIGITAL_READ
Serial.println("digitalRead() is linked in, we see bug of half lamps off in some cases");
#else
Serial.println("no digitalRead(), all lamps appear on as desired & expected");
#endif
}

/// set lamps alternating brightnesses a and b
void setEm(uint8_t a, uint8_t b, uint16_t wait) {
Serial.print("lamps ");
Serial.print(a, HEX);
Serial.print(", ");
Serial.print(b, HEX);
Serial.println("");

dl1.setBrightness(a);
dl2.setBrightness(b);
dl3.setBrightness(a);
dl4.setBrightness(b);
#if ALL_EIGHT_LAMPS
dl5.setBrightness(a);
dl6.setBrightness(b);
dl7.setBrightness(a);
dl8.setBrightness(b);
#endif

delay(wait);
}

static int loops = 0;
void loop() {
loops++;

#if INCLUDE_A_DIGITAL_READ
// this wont actually do a read for a long, long time
// but just linking in the function seems
// to cause the four-lights-dark bug.
if(loops == 6000)
{
Serial.println("------> digital read happening! <------");
digitalRead(READPIN);
}
#endif

setEm(0x81, 0x80, 2000); // different by 1 step -- one lamp off
setEm(0x80, 0x81, 2000);
setEm(0x82, 0x80, 2000); // different by 2 steps, works ok

Serial.print(loops);
Serial.println(" completed. let's go again.");
}

@distrakt distrakt added the bug Something isn't working label Feb 23, 2024
@distrakt
Copy link
Author

distrakt commented Feb 23, 2024

Completely acceptable workaround is to use FastGPIO library instead of the default arduino gpio functions.

But even still, I found some instability (slight occasional flicker) when lamps were near brightness to each other, especially trying to sweep them all together to a new brightness. A further workaround that helped is setBrightness(br & 0xfe), so lamps are not as close to each other in the interrupt timing.

This is on UNO; maybe not issue on faster cpu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant