I am attempting to use LEDStatus.setPattern to blink the RGB LED on a certain state. But it does not blink (stays solid red). It also stays solid during my relay trigger function. The LED does go blue but doesn’t blink. Is there some special consideration I need to take?
That did not work. However, if I remove the setSpeed (keeping only the one in setup()) and then initialize with LEDStatus statusLED(LED_PATTERN_BLINK); it does work properly (blinking on error or when triggering relay but solid color on other states).
The behavior seems strange. Is this a possible bug?
You can use the Particle.function("setState", setStateFn) to test the patterns.
BTW, there are better ways to do the state check in loop().
You’d read the state of your pins only once per iteration and then use if() ... else if() ... or a switch() block or even better a numeric correlation to prevent confusion with the combinations.
e.g.
enum DoorState : int
{ DOOR_ERROR = 0b00
, DOOR_CLOSED = 0b01
, DOOR_OPEN = 0b10
, DOOR_UNKNOWN = 0b11
};
void loop() {
buttonOpenState = digitalRead(buttonOpen);
if (buttonOpenState) {
Particle.publish("triggerFrom", "buttonOpen", PRIVATE);
triggerRelay(doorRelay);
delay(1000); // lazy way to prevent hitting the publishing rate limit
}
static int prevState = DOOR_UNKNOWN;
int state = digitalRead(switchUpper) << 1
+ digitalRead(switchLower) << 0;
if (state != prevState) {
setState((DoorState)state);
prevState = state;
}
}
This requires rearranging your state enum but makes for cleaner code
I think this is the reason why you are no seeing the blinking as you keep restarting the blinking faster than the blink pattern is.
Hence you should only act on a change of state (as in my code above).
You should also consider debouncing your digital inputs.