LED_Remote

Created Diff never expires
45 removals
227 lines
386 additions
531 lines
/* =================================================================
/* =================================================================

* LED Remote
* LED Remote
* (c) Brooke. 2016

* (c) Brooke. 2016-2020


* This file is the firmware to be upload and ran on the photon. It makes use of the particle API.
* This file is the firmware to be upload and ran on the photon. It makes use of the particle API.

* All original code is under the GPL v3 except where listed.
* All original code is under the GPL v3 except where listed.




* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by
* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 3 of the License, or
* the Free Software Foundation; either version 3 of the License, or

* (at your option) any later version.
* (at your option) any later version.




* This program is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of
* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.
* GNU General Public License for more details.


* You should have received a copy of the GNU General Public License
* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA




================================================================= */
================================================================= */


/* ======================= includes ================================= */

#include <neopixel.h> // use for Build IDE

// #include "neopixel.h" // use for local build
/* ======================= Includes ================================= */

#include <neopixel.h>

// #include \"neopixel.h\" // use for local build





/* ======================= Constances====================== */
/* ======================= Constances====================== */




SYSTEM_MODE(AUTOMATIC);
SYSTEM_MODE(AUTOMATIC);


#define PIXEL_PIN 2

#define PIXEL_COUNT 58

#define PIXEL_PIN 6

#define PIXEL_COUNT 120

#define PIXEL_TYPE SK6812RGBW
#define PIXEL_TYPE SK6812RGBW

#define BRIGHTNESS 255
#define BRIGHTNESS 255




uint8_t setStripBrigtness( String brightnessValue) ;
uint8_t setStripBrigtness( String brightnessValue) ;
int setStripColor( String hexValue );

int setStripColor( String hexValue );

int currentBrightness = 0;
int currentBrightness = 0;
String currentHex = "";

String currentHex = \"\";

uint8_t setStripPower( String powerValue );

int currentPower = 2;

int loopCase = 0;
int loopCase = 0;




Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);





/**


/**

* setup -- Standard Arduino setup() function
* setup -- Standard Arduino setup() function

**/
**/

void setup (){
void setup (){


strip.begin();
strip.begin();

strip.show(); // Initialize all pixels to 'off'
strip.show(); // Initialize all pixels to 'off'


//Particle Functions for Color and Brightness
//Particle Functions for Color and Brightness
Particle.function("hex", setStripColor);

Particle.function("bri", setStripBrigtness);
Particle.function(\"hex\", setStripColor);

Particle.function(\"bri\", setStripBrigtness);

Particle.function(\"pwr\", setStripPower);



//Particle Variable to hold brightness value:

Particle.variable("curBri", currentBrightness);
//Particle Variable to hold brightness value. Shoudl return between 0 - 255

Particle.variable(\"curBri\", currentBrightness);

//Particle Variable to hold color value:

Particle.variable("curHex", currentHex);
//Particle Variable to hold color value. Should return hex or -1 for false

Particle.variable(\"curHex\", currentHex);

}

//Particle Variable to hold power value. Should always return 1 or 2.

Particle.variable(\"curPwr\", currentPower);


}


/**
/**
* loop -- Standard Arduino loop() function

**/
* loop -- Standard Arduino loop() function

**/

void loop (){
void loop (){

switch ( loopCase ) {
switch ( loopCase ) {

case 1:
case 1:

setHex(currentHex);
setHex(currentHex);

break;
break;

case 2:
case 2:

rainbowCycle(20);
rainbowCycle(20);

break;
break;

case 3:
case 3:

rainbow(20);
rainbow(20);

}
}

delay(20);
delay(20);


}
}


/**
/**
* getStripColor -- gets the HexValue input from our POST request

* @param hexValue -- gets hex value string from Particle API
* getStripColor -- gets the HexValue input from our POST request
*/

* @param hexValue -- gets hex value string from Particle API

*/

int setStripColor( String hexValue ) {
int setStripColor( String hexValue ) {

if(hexValue.length() == 8){
if(hexValue.length() == 8){

currentHex = hexValue;
currentHex = hexValue;

loopCase = 1;
loopCase = 1;

return 1;
return 1;

}
}
else if( hexValue == "rainbow" ) {

else if( hexValue == \"rainbow\" ) {

loopCase = 2;
loopCase = 2;

return 2;
return 2;

}
}
else if ( hexValue == "rainbowCycle" ) {

else if ( hexValue == \"rainbowCycle\" ) {

loopCase = 3;
loopCase = 3;

return 3;
return 3;

}
}

else {
else {

return -1;
return -1;

}
}
}

}

/**

/**

* setStripBrightness -- Sets the LED strip color based on input of particle function setStripBrigtness
* setStripBrightness -- Sets the LED strip color based on input of particle function setStripBrigtness

* @param brightnessValue -- 0-255 brightness value for our LED strip.
* @param brightnessValue -- 0-255 brightness value for our LED strip.

*/
*/

uint8_t setStripBrigtness( String brightnessValue ) {
uint8_t setStripBrigtness( String brightnessValue ) {


uint8_t brightnessAsInt = brightnessValue.toInt();
uint8_t brightnessAsInt = brightnessValue.toInt();


if( ( brightnessAsInt <= 255 ) && ( brightnessValue.length() <= 3 ) ){
if( ( brightnessAsInt <= 255 ) && ( brightnessValue.length() <= 3 ) ){
for (uint8_t i = 0; i < PIXEL_COUNT; i++ ){

for (uint8_t i = 0; i < PIXEL_COUNT; i = i + currentPower ){

strip.setBrightness( brightnessAsInt );
strip.setBrightness( brightnessAsInt );
strip.show();
}
}

strip.show();

currentBrightness = brightnessAsInt;
currentBrightness = brightnessAsInt;

return currentBrightness;
return currentBrightness;

}
}


else {
else {

return 0;
return 0;

}
}

}
}




/**
/**
* convertHex -- converts hexValue into byte to be used in our array RBG > 255

* see: https://arduino.stackexchange.com/a/16446
* setStripPower -- Sets the strip power
* @param char -- gets hex value string from Particle API

*/
* @param powerValue -- Send 1 for all lights and send 0 for just half.

*/

uint8_t setStripPower( String powerValue ) {


if( powerValue.toInt() == 1 ){

currentPower = 1;

return 1;

}

else {

currentPower = 2;

return 0;

}

}



/**

* convertHex -- converts hexValue into byte to be used in our array RBG > 255

* see: https://arduino.stackexchange.com/a/16446

* @param char -- gets hex value string from Particle API

*/

byte convertHex (const char * str){
byte convertHex (const char * str){

char c = str [0] - '0';
char c = str [0] - '0';

if (c > 9)
if (c > 9)

c -= 7;
c -= 7;

int result = c;
int result = c;

c = str [1] - '0';
c = str [1] - '0';

if (c > 9)
if (c > 9)

c -= 7;
c -= 7;

return (result << 4) | c;
return (result << 4) | c;

}
}




/**
/**
* setHex -- converts hexValue into byte to be used in our array RBG > 255

* @param hexValue HexValue to set strip to.
* setHex -- converts hexValue into byte to be used in our array RBG > 255
*/

* @param hexValue HexValue to set strip to.

*/


char setHex( String hexValue ) {
char setHex( String hexValue ) {

const char * hexCharArray = hexValue;
const char * hexCharArray = hexValue;


byte redValue = convertHex ( & hexCharArray[0] );
byte redValue = convertHex ( & hexCharArray[0] );

byte greenValue = convertHex ( & hexCharArray[2] );
byte greenValue = convertHex ( & hexCharArray[2] );

byte blueValue = convertHex ( & hexCharArray[4] );
byte blueValue = convertHex ( & hexCharArray[4] );

byte whiteValue = convertHex ( & hexCharArray[6] );
byte whiteValue = convertHex ( & hexCharArray[6] );

for (int i = 0; i < PIXEL_COUNT; i++ ){

if( currentPower == 2 ){

for (int i = 1; i < PIXEL_COUNT; i++ ){

strip.setPixelColor(i, 0, 0, 0, 0);

}



}

for (int i = 0; i < PIXEL_COUNT; i = i + currentPower ){

strip.setPixelColor(i, greenValue, redValue, blueValue, whiteValue);
strip.setPixelColor(i, greenValue, redValue, blueValue, whiteValue);
strip.show();
}
}


strip.show();





}
}

/**
/**
* rainbowCycle -- Cycles through colors

* @source: https://github.com/adafruit/Adafruit_NeoPixel
* rainbowCycle -- Cycles through colors
* @param wait -- mills between transition, higher is slower. Vaules 0-255

*/
* @source: https://github.com/adafruit/Adafruit_NeoPixel

* @param wait -- mills between transition, higher is slower. Vaules 0-255

*/

void rainbowCycle(uint8_t wait) {
void rainbowCycle(uint8_t wait) {

uint16_t i, j;
uint16_t i, j;




for(j=0; j<256; j++) { // 5 cycles of all colors on wheel
for(j=0; j<256; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {

strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
if( currentPower == 2 ){

for (int i = 1; i < PIXEL_COUNT; i++ ){

strip.setPixelColor(i, 0, 0, 0, 0);

}

}
}

for(i=0; i< strip.numPixels(); i = i + currentPower) {

strip.setPixelColor(i, Wheel(((i * 256 / PIXEL_COUNT ) + j) & 255));

}

strip.show();
strip.show();

delay(wait);
delay(wait);

}
}

}
}




/**
/**
* rainbow -- Cycles through colors

* @source: https://github.com/adafruit/Adafruit_NeoPixel
* rainbow -- Cycles through colors
* @param wait -- mills between transition, higher is slower. Vaules 0-255

*/
* @source: https://github.com/adafruit/Adafruit_NeoPixel

* @param wait -- mills between transition, higher is slower. Vaules 0-255

*/

void rainbow(uint8_t wait) {
void rainbow(uint8_t wait) {

uint16_t i, j;
uint16_t i, j;




for(j=0; j<256; j++) {
for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {

if( currentPower == 2 ){

for (int i = 1; i < PIXEL_COUNT; i++ ){

strip.setPixelColor(i, 0, 0, 0, 0);

}

}

for(i=0; i<strip.numPixels(); i = i + currentPower ) {

strip.setPixelColor(i, Wheel((i+j) & 255));
strip.setPixelColor(i, Wheel((i+j) & 255));

}
}

strip.show();
strip.show();

delay(wait);
delay(wait);

}
}

}
}




/**
/**
* Wheel

* Input a value 0 to 255 to get a color value.
* Wheel
* The colours are a transition r - g - b - back to r.

* @source: https://github.com/adafruit/Adafruit_NeoPixel
* Input a value 0 to 255 to get a color value.
* @param byte WheelPos

*/
* The colours are a transition r - g - b - back to r.

* @source: https://github.com/adafruit/Adafruit_NeoPixel

* @param byte WheelPos

*/

uint32_t Wheel(byte WheelPos) {
uint32_t Wheel(byte WheelPos) {

WheelPos = 255 - WheelPos;
WheelPos = 255 - WheelPos;

if(WheelPos < 85) {
if(WheelPos < 85) {

return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);

}
}

if(WheelPos < 170) {
if(WheelPos < 170) {

WheelPos -= 85;
WheelPos -= 85;

return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);

}
}

WheelPos -= 170;
WheelPos -= 170;

return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);

}
}




uint8_t red(uint32_t c) {
uint8_t red(uint32_t c) {

return (c >> 8);
return (c >> 8);

}
}



uint8_t green(uint32_t c) {
uint8_t green(uint32_t c) {

return (c >> 16);
return (c >> 16);

}
}



uint8_t blue(uint32_t c) {
uint8_t blue(uint32_t c) {

return (c);
return (c);

}
}