Hi,
I’m working on a new project which uses the Grove_ChainableLED library and noticed that the library doesn’t have any “easy/handy” methods for simply turning the LED on or off. If I call the setColorHSB() function with values it will turn on. What would be the correct way to turn the light off…digitalWrite()?
This is my code so far, but the turnOn() turnOff() functions aren’t working:
#include "clickButton.h"
#include <Grove_ChainableLED.h>
#define BUTTON_PIN D2
#define BUTTON_DEBOUNCE_TIME 50
#define BUTTON_MULTICLICK_TIME 250
#define BUTTOM_LONGCLICK_TIME 1000
#define NUM_LEDS 1
int device_state = 0; // initial device state is off
int button = D0; // button is connected to D0
int LED = D4; // LED is connected to D4
double hue = 0.5; // default hue
double saturation = 1.0; // default saturation
double brightness = 0.5; // default brightness
int buttonFunction = 0; // button results
// the LED
ChainableLED leds(D4, D5, NUM_LEDS);
// the Button
ClickButton theButton(BUTTON_PIN, HIGH);
void setup()
{
//cloud variables
Particle.variable("state", device_state);
Particle.variable("hue", hue);
Particle.variable("saturation", saturation);
Particle.variable("brightness", brightness);
//cloud functions
Particle.function("turnOn", turnOn);
Particle.function("turnOff", turnOff);
Particle.function("setColor", setColor);
Particle.function("setBrightness", setBrightness);
leds.init();
pinMode(LED, OUTPUT); // sets pin as output
pinMode(button, INPUT_PULLDOWN); // sets pin as input
// Setup button timers (all in milliseconds / ms)
// (These are default if not set, but changeable for convenience)
theButton.debounceTime = BUTTON_DEBOUNCE_TIME; // Debounce timer in ms
theButton.multiclickTime = BUTTON_MULTICLICK_TIME; // Time limit for multi clicks
theButton.longClickTime = BUTTOM_LONGCLICK_TIME; // time until "held-down clicks" register
}
void loop()
{
// Update button state
theButton.Update();
// Save click codes in LEDfunction, as click codes are reset at next Update()
if(theButton.clicks != 0) buttonFunction = theButton.clicks;
if(buttonFunction == 1) {
if(device_state == 0){
//turn the light on
device_state = 1;
turnOn("on");
Particle.publish("EVENT: SINGLE CLICK ON", String(device_state));
}else{
//turn the light off
device_state = 1;
turnOff("off");
Particle.publish("EVENT: SINGLE CLICK OFF", String(device_state));
}
}
if(buttonFunction == 2) Particle.publish("EVENT: DOUBLE CLICK");
if(buttonFunction == 3) Particle.publish("EVENT: TRIPLE CLICK");
if(buttonFunction == -1) Particle.publish("EVENT: SINGLE LONG CLICK");
if(buttonFunction == -2) Particle.publish("EVENT: DOUBLE LONG CLICK");
if(buttonFunction == -3) Particle.publish("EVENT: TRIPLE LONG CLICK");
buttonFunction = 0;
delay(5);
}
int turnOn(String args){
device_state = 1;
digitalWrite(LED, HIGH);
Particle.publish("EVENT: ON");
return 1;
}
int turnOff(String args){
device_state = 0;
digitalWrite(LED, LOW);
Particle.publish("EVENT: OFF");
return 1;
}
int setColor(String args){
hue = args.toFloat();
leds.setColorHSB(0, hue, saturation, brightness);
return 1;
}
int setBrightness(String args){
brightness = args.toFloat();
leds.setColorHSB(0, hue, saturation, brightness);
return 1;
}
Note: I know this code can likely be cleaned up to simplify some of the functions.
Thanks!