#include "FastLED.h" #include "FastLED_RGBW.h" #include #define NUM_LEDS 1 #define DATA_PIN 3 #define IR_RECEIVE_PIN 2 #undef ENABLE_LED_FEEDBACK #define ENABLE_LED_FEEDBACK 0 CRGBW COL_RED (255, 0, 0, 0); CRGBW COL_GREEN ( 0,255, 0, 0); CRGBW COL_BLUE ( 0, 0,255, 0); CRGBW COL_WHITE ( 0, 0, 0,255); CRGBW COL_SUM (255,255,255,255); CRGBW COL_AMBER (255,191, 0, 0); CRGBW COL_LIME (127,255, 0, 0); CRGBW COL_AZURE ( 0,127,255, 0); CRGBW COL_ORANGE (255,127, 0, 0); CRGBW COL_CYAN ( 0,255,255, 0); CRGBW COL_UV ( 63, 0,255, 0); CRGBW COL_PEACHY (255, 63, 0, 0); CRGBW COL_SPRING ( 0,255,127, 0); CRGBW COL_MAGENTA(255, 0,255, 0); CRGBW COL_YELLOW (255,255, 0, 0); CRGBW COL_VIOLET (127, 0,255, 0); CRGBW COL_ROSE (255, 0,127, 0); CRGBW desaturate(CRGBW col) { return CRGBW(col.red, col.green, col.blue, col.white + 64); } struct ColourCode { uint32_t code; uint32_t altCode; CRGBW colour; CRGBW altColour; ColourCode(uint32_t c, uint32_t c2,CRGBW col) { code = c; altCode = c2; colour = col; altColour = desaturate(col); } ColourCode(uint32_t c, uint32_t c2, CRGBW colA, CRGBW colB) { code = c; altCode = c2; colour = colA; altColour = colB; } }; enum State { COLOUR_DISPLAYED, SPLIT_DISPLAYED, FADE_DISPLAYED, FAN_DISPLAYED, RUNNING_FAN_DISPLAYED, STROBE_SELECT_SPEED, FADE_SELECT_COLOUR, SPLIT_SELECT_COLOUR, FAN_SELECT_COLOUR, }; State state = State.COLOUR_DISPLAYED; const ColourCode colourCodes[] = { {0xE619FF00, 0xFB04EF00, COL_RED}, {0xE41BFF00, 0xFA05EF00, COL_GREEN}, {0xEE11FF00, 0xF906EF00, COL_BLUE}, {0xEA15FF00, 0xF807EF00, COL_SUM, COL_WHITE}, {0xE817FF00, 0xF708EF00, COL_AMBER}, {0xED12FF00, 0xF609EF00, COL_LIME}, {0xE916FF00, 0xF50AEF00, COL_AZURE}, {0xBF40FF00, 0xF30CEF00, COL_ORANGE}, {0xB34CFF00, 0xF20DEF00, COL_CYAN}, {0xFB04FF00, 0xF10EEF00, COL_UV}, {0xF50AFF00, 0xEF10EF00, COL_PEACHY}, {0xE11EFF00, 0xEE11EF00, COL_SPRING}, {0xF10EFF00, 0xED12EF00, COL_MAGENTA}, {0xE31CFF00, 0xEB14EF00, COL_YELLOW}, {0xEB14FF00, 0xEA15EF00, COL_VIOLET}, {0xF00FFF00, 0xE916EF00, COL_ROSE} }; const uint32_t CODE_BRIGHTER = 0xFF00EF00; const uint32_t CODE_DIMMER = 0xFE01EF00; const uint32_t CODE_OFF = 0xFD02EF00; const uint32_t CODE_ON = 0xFC03EF00; const uint32_t CODE_FLASH = 0xF40BEF00; const uint32_t CODE_STROBE = 0xF00FEF00; const uint32_t CODE_FADE = 0xEC13EF00; const uint32_t CODE_SMOOTH = 0xE817EF00; const int NUM_COLOURCODES = sizeof(colourCodes) / sizeof(ColourCode); CRGBW leds[NUM_LEDS]; CRGB *ledsRGB = (CRGB *) &leds[0]; CRGBW selectedColours[16]; uint8_t selectedColourCount = 0; //IRrecv irrecv(IR_RECEIVE_PIN);/ const int BRIGHTNESS_FADE_SPEED = 8; uint8_t brightness = 128; uint8_t brightnessTarget = 128; uint8_t brightnessFade = 0; uint32_t lastCode = 0; decode_results results; void colorFill(CRGBW c){ for(int i = 0; i < NUM_LEDS; i++){ leds[i] = c; FastLED.show(); delay(50); } } void colorFill(CRGB c){ for(int i = 0; i < NUM_LEDS; i++){ leds[i] = c; FastLED.show(); delay(50); } } void setup() { FastLED.addLeds(ledsRGB, getRGBWsize(NUM_LEDS)); colorFill(COL_SUM); FastLED.setBrightness(255); FastLED.show(); pinMode(LED_BUILTIN, OUTPUT); Serial.begin(115200); #if defined(__AVR_ATmega32U4__) while (!Serial) ; //delay for Leonardo, but this loops forever for Maple Serial #endif #if defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL) delay(2000); // To be able to connect Serial monitor after reset and before first printout #endif // Just to know which program is running on my Arduino Serial.println(F("START " __FILE__ " from " __DATE__)); // In case the interrupt driver crashes on setup, give a clue // to the user what's going on. Serial.println("Enabling IRin"); // irrecv.enableIRIn(); // Start the receiver/ IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); Serial.print(F("Ready to receive IR signals at pin ")); Serial.println(IR_RECEIVE_PIN); } void interpretColourCode(uint32_t code) { for (int i = 0; i < NUM_COLOURCODES; i++) { ColourCode col = colourCodes[i]; if (col.code == code || col.altCode == code) { if (code == lastCode) { Serial.println(F("Colour code OK - Secondary")); colorFill(col.altColour); lastCode = 0; } else { Serial.println(F("Colour code OK - Primary")); colorFill(col.colour); lastCode = code; } return; } else { // Serial.print(code, HEX); // Serial.print(F(" != ")); // Serial.println(col.code, HEX); } } Serial.println(F("CODE?!?!")); } void loop() { if (IrReceiver.decode()) { uint32_t data = IrReceiver.decodedIRData.decodedRawData; Serial.println(data, HEX); IrReceiver.resume(); // Receive the next value switch(data) { case CODE_BRIGHTER: brightness += 32; brightnessTarget = brightness; Serial.println(F("Brighter")); break; case CODE_DIMMER: brightness -= 32; brightnessTarget = brightness; Serial.println(F("Dimmer")); break; case CODE_OFF: brightnessTarget = 0; Serial.println(F("Off")); break; case CODE_ON: brightnessTarget = brightness; Serial.println(F("On")); break; default: interpretColourCode(data); Serial.println(F("Set colour")); } if (brightness <= 0) brightness = 255; } if (brightnessFade != brightnessTarget) { if (brightnessFade < brightnessTarget) brightnessFade += min(BRIGHTNESS_FADE_SPEED, brightnessTarget - brightnessFade); else brightnessFade -= min(BRIGHTNESS_FADE_SPEED, brightnessFade - brightnessTarget); //brightnessFade = brightnessTarget; FastLED.setBrightness(brightnessFade); FastLED.show(); } delay(100); }