2 Commits

Author SHA1 Message Date
bde51bc675 Added more sunrise patterns. 2017-07-19 17:20:51 -05:00
72cc218fb8 Work on the sunrise clock. 2017-07-13 08:46:28 -05:00
11 changed files with 552 additions and 633 deletions

79
Map.h
View File

@ -1,79 +0,0 @@
uint8_t coordsX[NUM_LEDS] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0 };
uint8_t coordsY[NUM_LEDS] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 };
uint8_t coordsZ[NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
void cubeXGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = coordsX[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - (x * hues));
}
}
void cubeYGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t y = coordsY[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - (y * hues));
}
}
void cubeZGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t z = coordsZ[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - (z * hues));
}
}
void cubeXYGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = coordsX[i];
uint8_t y = coordsY[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - ((x + y) * hues));
}
}
void cubeXZGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = coordsX[i];
uint8_t z = coordsZ[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - ((x + z) * hues));
}
}
void cubeYZGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t y = coordsY[i];
uint8_t z = coordsZ[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - ((y + z) * hues));
}
}
void cubeXYZGradientPalette() {
uint8_t hues = 8;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = coordsX[i];
uint8_t y = coordsY[i];
uint8_t z = coordsZ[i];
leds[i] = ColorFromPalette(gCurrentPalette, beat8(speed) - ((x + y + z) * hues));
}
}

212
Noise.h
View File

@ -1,212 +0,0 @@
/*
ESP8266 + FastLED + IR Remote: https://github.com/jasoncoon/esp8266-fastled-webserver
Copyright (C) 2015-2016 Jason Coon
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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// The 16 bit version of our coordinates
uint16_t noisex;
uint16_t noisey;
uint16_t noisez;
// We're using the x/y dimensions to map to the x/y pixels on the matrix. We'll
// use the z-axis for "time". speed determines how fast time moves forward. Try
// 1 for a very slow moving effect, or 60 for something that ends up looking like
// water.
int8_t noisespeedx = 0;
int8_t noisespeedy = 1;
int8_t noisespeedz = 0;
// Scale determines how far apart the pixels in our noise matrix are. Try
// changing these values around to see how it affects the motion of the display. The
// higher the value of scale, the more "zoomed out" the noise will be. A value
// of 1 will be so zoomed in, you'll mostly see solid colors.
uint16_t noisescale = 1; // scale is set dynamically once we've started up
uint8_t colorLoop = 0;
CRGBPalette16 blackAndWhiteStripedPalette;
// This function sets up a palette of black and white stripes,
// using code. Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{
// 'black out' all 16 palette entries...
fill_solid( blackAndWhiteStripedPalette, 16, CRGB::Black);
// and set every fourth one to white.
blackAndWhiteStripedPalette[0] = CRGB::White;
blackAndWhiteStripedPalette[4] = CRGB::White;
blackAndWhiteStripedPalette[8] = CRGB::White;
blackAndWhiteStripedPalette[12] = CRGB::White;
}
CRGBPalette16 blackAndBlueStripedPalette;
// This function sets up a palette of black and blue stripes,
// using code. Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndBlueStripedPalette()
{
// 'black out' all 16 palette entries...
fill_solid( blackAndBlueStripedPalette, 16, CRGB::Black);
for(uint8_t i = 0; i < 6; i++) {
blackAndBlueStripedPalette[i] = CRGB::Blue;
}
}
// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly.
void drawNoise3d(CRGBPalette16 palette, uint8_t hueReduce = 0)
{
for(uint16_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = coordsX[i];
uint8_t y = coordsY[i];
uint8_t z = coordsZ[i];
int xoffset = noisescale * x;
int yoffset = noisescale * y;
int zoffset = noisescale * z;
uint8_t data = inoise8(x + xoffset + noisex, y + yoffset + noisey, z + zoffset + noisez);
// The range of the inoise8 function is roughly 16-238.
// These two operations expand those values out to roughly 0..255
// You can comment them out if you want the raw noise data.
data = qsub8(data, 16);
data = qadd8(data, scale8(data, 39));
if(hueReduce > 0 && data >= hueReduce)
data -= hueReduce;
leds[i] = ColorFromPalette(palette, data, 255, LINEARBLEND);
}
noisex += noisespeedx;
noisey += noisespeedy;
noisez += noisespeedz;
}
void rainbowNoise3d() {
noisespeedx = 0;
noisespeedy = 0;
noisespeedz = -1;
noisescale = 24;
colorLoop = 0;
drawNoise3d(RainbowColors_p);
}
void rainbowStripeNoise3d() {
noisespeedx = 0;
noisespeedy = 0;
noisespeedz = -2;
noisescale = 24;
colorLoop = 0;
drawNoise3d(RainbowStripeColors_p);
}
void partyNoise3d() {
noisespeedx = -9;
noisespeedy = 0;
noisespeedz = 0;
noisescale = 32;
colorLoop = 0;
drawNoise3d(PartyColors_p);
}
void forestNoise3d() {
noisespeedx = -9;
noisespeedy = 0;
noisespeedz = 0;
noisescale = 32;
colorLoop = 0;
drawNoise3d(ForestColors_p);
}
void cloudNoise3d() {
noisespeedx = -2;
noisespeedy = 0;
noisespeedz = 0;
noisescale = 24;
colorLoop = 0;
drawNoise3d(CloudColors_p);
}
void fireNoise3d() {
noisespeedx = 16;
noisespeedy = 16;
noisespeedz = 16;
noisescale = 64;
colorLoop = 0;
drawNoise3d(HeatColors_p, 60);
}
void fireNoise23d() {
noisespeedx = 3;
noisespeedy = 3;
noisespeedz = 3;
noisescale = 32;
colorLoop = 0;
drawNoise3d(HeatColors_p);
}
void lavaNoise3d() {
noisespeedx = -4;
noisespeedy = -4;
noisespeedz = -4;
noisescale = 32;
colorLoop = 0;
drawNoise3d(LavaColors_p);
}
void oceanNoise3d() {
noisespeedx = -2;
noisespeedy = 0;
noisespeedz = 4;
noisescale = 24;
colorLoop = 0;
drawNoise3d(OceanColors_p);
}
void blackAndWhiteNoise3d() {
SetupBlackAndWhiteStripedPalette();
noisespeedx = -12;
noisespeedy = 0;
noisespeedz = 0;
noisescale = 24;
colorLoop = 0;
drawNoise3d(blackAndWhiteStripedPalette);
}
void blackAndBlueNoise3d() {
SetupBlackAndBlueStripedPalette();
noisespeedx = -4;
noisespeedy = -4;
noisespeedz = -4;
noisescale = 32;
colorLoop = 0;
drawNoise3d(blackAndBlueStripedPalette);
}

65
Text.h Normal file
View File

@ -0,0 +1,65 @@
bool mask[NUM_LEDS];
const byte digits4x8[8 * 10] = {
0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x06, // 0
0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, // 1
0x06, 0x09, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0f, // 2
0x06, 0x09, 0x08, 0x04, 0x08, 0x08, 0x09, 0x06, // 3
0x04, 0x05, 0x05, 0x05, 0x0f, 0x04, 0x04, 0x04, // 4
0x0f, 0x01, 0x01, 0x07, 0x08, 0x08, 0x09, 0x06, // 5
0x06, 0x09, 0x01, 0x07, 0x09, 0x09, 0x09, 0x06, // 6
0x0f, 0x08, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, // 7
0x06, 0x09, 0x09, 0x06, 0x09, 0x09, 0x09, 0x06, // 8
0x06, 0x09, 0x09, 0x09, 0x0e, 0x08, 0x09, 0x06, // 9
};
// preceed with a call to fillMask(false);
// set mask to true where digit should light
void digit(byte start, byte d) {
byte row, col;
for (col = 0; col < 4; col++) {
for (row = 0; row < 8; row++) {
if ((digits4x8[d * 8 + row] >> col) & 1) {
togglePixelMask(row, col + start, true);
}
else {
}
}
}
}
void displayNum(uint32_t n) {
digit( 0, (n / 10000) % 10);
digit( 5, (n / 1000) % 10);
digit(10, (n / 100) % 10);
digit(15, (n / 10) % 10);
digit(20, (n / 1) % 10);
}
void displayTime(uint32_t tm) {
uint8_t hh = (tm / 3600) % 12;
uint8_t mm = (tm / 60) % 60;
uint8_t ss = (tm) % 60;
if (hh > 9) {
digit( 1, hh / 10);
}
digit( 6, hh % 10);
setPixelMask(2, 11, true);
setPixelMask(3, 11, true);
setPixelMask(5, 11, true);
setPixelMask(6, 11, true);
digit(13, mm / 10);
digit(18, mm % 10);
if (hh > 9) {
digit( 1 + 24, hh / 10);
}
digit( 6 + 24, hh % 10);
setPixelMask(2, 11 + 24, true);
setPixelMask(3, 11 + 24, true);
setPixelMask(5, 11 + 24, true);
setPixelMask(6, 11 + 24, true);
digit(13 + 24, mm / 10);
digit(18 + 24, mm % 10);
}

View File

@ -194,7 +194,7 @@ void drawTwinkles()
uint8_t backgroundBrightness = bg.getAverageLight();
for(uint16_t i = 0; i < NUM_LEDS; i++) {
for(uint8_t i = 0; i < NUM_LEDS; i++) {
CRGB& pixel = leds[i];
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; // next 'random' number

View File

@ -2,20 +2,10 @@
padding-bottom: 70px;
}*/
.grid-item-color-button {
border: 0px;
width: 7.69%;
height: 64px;
margin: 0px;
padding: 0px;
}
.grid-item-color {
border: none;
width: 3.33%;
width: 4%;
height: 32px;
margin: 0px;
padding: 0px;
cursor: pointer;
}
.grid-item-pattern {

View File

@ -5,7 +5,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Cube by Evil Genius Labs</title>
<title>ESP8266 + FastLED by Evil Genius Labs</title>
<!-- request CSS from internet CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
@ -36,7 +36,7 @@
</div>
<div class="collapse navbar-collapse" id="navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="/">Cube <span class="sr-only">(current)</span></a></li>
<li class="active"><a href="/">ESP8266 + FastLED <span class="sr-only">(current)</span></a></li>
<li><a href="/simple.htm" target="_blank" title="Simple Mode">Simple</a></li>
<li><a href="/edit.htm" target="_blank" title="Edit Files">Files</a></li>
<li><a href="/update" target="_blank" title="Update Firmware">Firmware</a></li>

View File

@ -3,7 +3,7 @@ var address = location.hostname;
var urlBase = "";
// used when hosting the site somewhere other than the ESP8266 (handy for testing without waiting forever to upload to SPIFFS)
// var address = "192.168.86.55";
// var address = "esp8266-1920f7.local";
// var urlBase = "http://" + address + "/";
var postColorTimer = {};

View File

@ -3,7 +3,7 @@ var address = location.hostname;
var urlBase = "";
// used when hosting the site somewhere other than the ESP8266 (handy for testing without waiting forever to upload to SPIFFS)
// var address = "192.168.86.55";
// var address = "192.168.1.13";
// var urlBase = "http://" + address + "/";
var postColorTimer = {};
@ -15,27 +15,6 @@ var patterns = [
"Pride",
"Color Waves",
"X Gradient Palette",
"Y Gradient Palette",
"Z Gradient Palette",
"XY Gradient Palette",
"XZ Gradient Palette",
"YZ Gradient Palette",
"XYZ Gradient Palette",
"Fire Noise",
"Fire Noise 2",
"Lava Noise",
"Rainbow Noise",
"Rainbow Stripe Noise",
"Party Noise",
"Forest Noise",
"Cloud Noise",
"Ocean Noise",
"Black & White Noise",
"Black & Blue Noise",
"Rainbow Twinkles",
"Snow Twinkles",
"Cloud Twinkles",
@ -56,11 +35,15 @@ var patterns = [
"Cloud 2 Twinkles",
"Ocean Twinkles",
"Rainbow",
"Rainbow With Glitter",
"Solid Rainbow",
"Confetti",
"Sinelon",
"Beat",
"Juggle",
"Fire",
"Water"
];
var ws = new ReconnectingWebSocket('ws://' + address + ':81/', ['arduino']);
@ -131,13 +114,13 @@ $(document).ready(function() {
});
function addColorButtons() {
var hues = 30;
var hues = 25;
var hueStep = 360 / hues;
var levels = 25;
var levelStep = 50 / levels;
var levels = 10;
var levelStep = 60 / levels;
for(var l = 50; l < 95; l += levelStep) {
for(var l = 20; l < 80; l += levelStep) {
for(var h = 0; h < hues; h++) {
addColorButton(h * hueStep, 100, l);
}
@ -148,35 +131,24 @@ function addColorButtons() {
layoutMode: 'fitRows'
});
$('.grid-color-buttons').isotope({
itemSelector: '.grid-item-color-button',
layoutMode: 'fitRows'
});
$('.grid-item-color-button').click(colorButtonClick);
}
var colorButtonIndex = 0;
function colorButtonClick() {
function addColorButton(h, s, l) {
var color = "hsla(" + h + ", " + s + "%, " + l + "%, 1)"
var template = $("#colorButtonTemplate").clone();
template.attr("id", "color-button-" + colorButtonIndex++);
template.css("background-color", color);
template.click(function() {
var rgb = $(this).css('backgroundColor');
var components = rgbToComponents(rgb);
$(".grid-item-color").css("border", "none");
if($(this).attr("class") === "grid-item-color") {
$(this).css("border", "1px solid");
}
postColor("solidColor", components);
}
function addColorButton(h, s, l) {
var color = "hsl(" + h + ", " + s + "%, " + l + "%)"
var template = $("#colorButtonTemplate").clone();
template.css("background-color", color);
template.attr("title", template.css("background-color") + "\r\n" + color);
template.click(colorButtonClick);
});
$("#colorButtonsRow").append(template);
}

View File

@ -5,7 +5,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Cube by Evil Genius Labs</title>
<title>ESP8266 + FastLED by Evil Genius Labs</title>
<!-- request CSS from internet CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
@ -20,44 +20,22 @@
<body>
<div id="container" class="container-fluid">
<div id="container" class="container">
<div style="margin: 5px;">
<button type="button" class="btn btn-default" id="btnOn">On</button>
<button type="button" class="btn btn-default" id="btnOff">Off</button>
</div>
<h4>Patterns</h4>
<div id="patternGrid" class="grid-pattern"></div>
<h4>Basic Colors</h4>
<div class="grid-color-buttons">
<button type="button" class="grid-item-color-button" style="background: #FF0000;" title="Red">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #FF8000;" title="Orange">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #FFFF00;" title="Yellow">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #80FF00;" title="Chartreuse">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #00FF00;" title="Green">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #00FF80;" title="Spring Green">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #00FFFF;" title="Cyan">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #0080FF;" title="Azure">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #0000FF;" title="Blue">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #8000FF;" title="Violet">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #FF00FF;" title="Magenta">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #FF0080;" title="Rose">&nbsp;</button>
<button type="button" class="grid-item-color-button" style="background: #FFFFFF; border: 1px solid;" title="White">&nbsp;</button>
</div>
<h4>Color Palette</h4>
<div id="colorButtonsRow" class="grid-color"></div>
</div>
<div id="templates" style="display: none">
<button id="colorButtonTemplate" class="grid-item-color"></button>
<div id="colorButtonTemplate" class="grid-item-color"></div>
<button id="patternButtonTemplate" class="grid-item-pattern btn btn-default"></button>

View File

@ -16,8 +16,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#define FASTLED_ALLOW_INTERRUPTS 0
#define FASTLED_INTERRUPT_RETRY_COUNT 0
#include <FastLED.h>
FASTLED_USING_NAMESPACE
@ -32,19 +30,19 @@ extern "C" {
#include <WebSocketsServer.h>
#include <FS.h>
#include <EEPROM.h>
//#include <IRremoteESP8266.h>
#include <IRremoteESP8266.h>
#include "GradientPalettes.h"
#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
#include "Field.h"
#define HOSTNAME "Cube-ESP8266-" ///< Hostname. The setup function adds the Chip ID at the end.
#define HOSTNAME "ESP8266-" ///< Hostname. The setup function adds the Chip ID at the end.
//#define RECV_PIN D4
//IRrecv irReceiver(RECV_PIN);
#define RECV_PIN 1
IRrecv irReceiver(RECV_PIN);
//#include "Commands.h"
#include "Commands.h"
const bool apMode = false;
@ -61,12 +59,15 @@ ESP8266HTTPUpdateServer httpUpdateServer;
#include "FSBrowser.h"
#define DATA_PIN D5
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS 8 * 8 * 6
#define DATA_PIN MOSI
#define CLK_PIN SCK
#define LED_TYPE APA102
#define COLOR_ORDER BGR
#define MatrixWidth 8 * 3
#define MatrixHeight 8
#define NUM_LEDS MatrixWidth * MatrixHeight
#define MILLI_AMPS 2000 // IMPORTANT: set the max milli-Amps of your power supply (4A = 4000mA)
#define MILLI_AMPS 500 // IMPORTANT: set the max milli-Amps of your power supply (4A = 4000mA)
#define FRAMES_PER_SECOND 120 // here you can control the speed. With the Access Point / Web Server the animations run a bit slower.
CRGB leds[NUM_LEDS];
@ -108,6 +109,8 @@ CRGBPalette16 IceColors_p = CRGBPalette16(CRGB::Black, CRGB::Blue, CRGB::Aqua, C
uint8_t currentPatternIndex = 0; // Index number of which pattern is current
uint8_t autoplay = 0;
bool resetPattern = true;
uint8_t autoplayDuration = 10;
unsigned long autoPlayTimeout = 0;
@ -125,6 +128,30 @@ void dimAll(byte value)
}
}
const bool MatrixSerpentineLayout = true;
uint16_t XY(uint8_t x, uint8_t y)
{
uint16_t i;
if ( MatrixSerpentineLayout == false) {
i = (y * MatrixWidth) + x;
}
if ( MatrixSerpentineLayout == true) {
if ( x & 0x01) {
// Odd columns run backwards
uint8_t reverseY = (MatrixHeight - 1) - y;
i = (x * MatrixHeight) + reverseY;
} else {
// Even rows run forwards
i = (x * MatrixHeight) + y;
}
}
return i;
}
typedef void (*Pattern)();
typedef Pattern PatternList[];
typedef struct {
@ -135,37 +162,20 @@ typedef PatternAndName PatternAndNameList[];
#include "Twinkles.h"
#include "TwinkleFOX.h"
#include "Map.h"
#include "Noise.h"
#include "Sunrise.h"
// List of patterns to cycle through. Each is defined as a separate function below.
PatternAndNameList patterns = {
{ sunriseStatic, "Sunrise Static" },
{ sunriseFlicker, "Sunrise Flicker" },
{ sunriseWavesVertical, "Sunrise Waves Vertical" },
{ sunriseWavesHorizontal, "Sunrise Waves Horizontal" },
{ sunriseWavesDiagonal, "Sunrise Waves Diagonal" },
{ sunriseWavesRotating, "Sunrise Waves Rotating" },
{ pride, "Pride" },
{ colorWaves, "Color Waves" },
{ cubeXGradientPalette, "X Gradient Palette" },
{ cubeYGradientPalette, "Y Gradient Palette" },
{ cubeZGradientPalette, "Z Gradient Palette" },
{ cubeXYGradientPalette, "XY Gradient Palette" },
{ cubeXZGradientPalette, "XZ Gradient Palette" },
{ cubeYZGradientPalette, "YZ Gradient Palette" },
{ cubeXYZGradientPalette, "XYZ Gradient Palette" },
// 3d noise patterns
{ fireNoise3d, "Fire Noise" },
{ fireNoise23d, "Fire Noise 2" },
{ lavaNoise3d, "Lava Noise" },
{ rainbowNoise3d, "Rainbow Noise" },
{ rainbowStripeNoise3d, "Rainbow Stripe Noise" },
{ partyNoise3d, "Party Noise" },
{ forestNoise3d, "Forest Noise" },
{ cloudNoise3d, "Cloud Noise" },
{ oceanNoise3d, "Ocean Noise" },
{ blackAndWhiteNoise3d, "Black & White Noise" },
{ blackAndBlueNoise3d, "Black & Blue Noise" },
// twinkle patterns
{ rainbowTwinkles, "Rainbow Twinkles" },
{ snowTwinkles, "Snow Twinkles" },
@ -188,15 +198,15 @@ PatternAndNameList patterns = {
{ cloud2Twinkles, "Cloud 2 Twinkles" },
{ oceanTwinkles, "Ocean Twinkles" },
// { rainbow, "Rainbow" },
// { rainbowWithGlitter, "Rainbow With Glitter" },
{ rainbow, "Rainbow" },
{ rainbowWithGlitter, "Rainbow With Glitter" },
{ rainbowSolid, "Solid Rainbow" },
{ confetti, "Confetti" },
{ sinelon, "Sinelon" },
{ bpm, "Beat" },
{ juggle, "Juggle" },
// { fire, "Fire" },
// { water, "Water" },
{ fire, "Fire" },
{ water, "Water" },
{ showSolidColor, "Solid Color" }
};
@ -236,14 +246,12 @@ const String paletteNames[paletteCount] = {
#include "Fields.h"
void setup() {
WiFi.setSleepMode(WIFI_NONE_SLEEP);
Serial.begin(115200);
delay(100);
Serial.setDebugOutput(true);
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // for WS2812 (Neopixel)
//FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS); // for APA102 (Dotstar)
// FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // for WS2812 (Neopixel)
FastLED.addLeds<LED_TYPE, DATA_PIN, CLK_PIN, COLOR_ORDER>(leds, NUM_LEDS); // for APA102 (Dotstar)
FastLED.setDither(false);
FastLED.setCorrection(TypicalLEDStrip);
FastLED.setBrightness(brightness);
@ -256,7 +264,7 @@ void setup() {
FastLED.setBrightness(brightness);
// irReceiver.enableIRIn(); // Start the receiver
irReceiver.enableIRIn(); // Start the receiver
Serial.println();
Serial.print( F("Heap: ") ); Serial.println(system_get_free_heap_size());
@ -504,7 +512,7 @@ void loop() {
webSocketsServer.loop();
webServer.handleClient();
// handleIrInput();
handleIrInput();
if (power == 0) {
fill_solid(leds, NUM_LEDS, CRGB::Black);
@ -539,6 +547,8 @@ void loop() {
FastLED.show();
resetPattern = false;
// insert a delay to keep the framerate modest
// FastLED.delay(1000 / FRAMES_PER_SECOND);
}
@ -580,212 +590,212 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length
}
}
//void handleIrInput()
//{
// InputCommand command = readCommand();
//
// if (command != InputCommand::None) {
// Serial.print("command: ");
// Serial.println((int) command);
// }
//
// switch (command) {
// case InputCommand::Up: {
// adjustPattern(true);
// break;
// }
// case InputCommand::Down: {
// adjustPattern(false);
// break;
// }
// case InputCommand::Power: {
// setPower(power == 0 ? 1 : 0);
// break;
// }
// case InputCommand::BrightnessUp: {
// adjustBrightness(true);
// break;
// }
// case InputCommand::BrightnessDown: {
// adjustBrightness(false);
// break;
// }
// case InputCommand::PlayMode: { // toggle pause/play
// setAutoplay(!autoplay);
// break;
// }
//
// // pattern buttons
//
// case InputCommand::Pattern1: {
// setPattern(0);
// break;
// }
// case InputCommand::Pattern2: {
// setPattern(1);
// break;
// }
// case InputCommand::Pattern3: {
// setPattern(2);
// break;
// }
// case InputCommand::Pattern4: {
// setPattern(3);
// break;
// }
// case InputCommand::Pattern5: {
// setPattern(4);
// break;
// }
// case InputCommand::Pattern6: {
// setPattern(5);
// break;
// }
// case InputCommand::Pattern7: {
// setPattern(6);
// break;
// }
// case InputCommand::Pattern8: {
// setPattern(7);
// break;
// }
// case InputCommand::Pattern9: {
// setPattern(8);
// break;
// }
// case InputCommand::Pattern10: {
// setPattern(9);
// break;
// }
// case InputCommand::Pattern11: {
// setPattern(10);
// break;
// }
// case InputCommand::Pattern12: {
// setPattern(11);
// break;
// }
//
// // custom color adjustment buttons
//
// case InputCommand::RedUp: {
// solidColor.red += 8;
// setSolidColor(solidColor);
// break;
// }
// case InputCommand::RedDown: {
// solidColor.red -= 8;
// setSolidColor(solidColor);
// break;
// }
// case InputCommand::GreenUp: {
// solidColor.green += 8;
// setSolidColor(solidColor);
// break;
// }
// case InputCommand::GreenDown: {
// solidColor.green -= 8;
// setSolidColor(solidColor);
// break;
// }
// case InputCommand::BlueUp: {
// solidColor.blue += 8;
// setSolidColor(solidColor);
// break;
// }
// case InputCommand::BlueDown: {
// solidColor.blue -= 8;
// setSolidColor(solidColor);
// break;
// }
//
// // color buttons
//
// case InputCommand::Red: {
// setSolidColor(CRGB::Red);
// break;
// }
// case InputCommand::RedOrange: {
// setSolidColor(CRGB::OrangeRed);
// break;
// }
// case InputCommand::Orange: {
// setSolidColor(CRGB::Orange);
// break;
// }
// case InputCommand::YellowOrange: {
// setSolidColor(CRGB::Goldenrod);
// break;
// }
// case InputCommand::Yellow: {
// setSolidColor(CRGB::Yellow);
// break;
// }
//
// case InputCommand::Green: {
// setSolidColor(CRGB::Green);
// break;
// }
// case InputCommand::Lime: {
// setSolidColor(CRGB::Lime);
// break;
// }
// case InputCommand::Aqua: {
// setSolidColor(CRGB::Aqua);
// break;
// }
// case InputCommand::Teal: {
// setSolidColor(CRGB::Teal);
// break;
// }
// case InputCommand::Navy: {
// setSolidColor(CRGB::Navy);
// break;
// }
//
// case InputCommand::Blue: {
// setSolidColor(CRGB::Blue);
// break;
// }
// case InputCommand::RoyalBlue: {
// setSolidColor(CRGB::RoyalBlue);
// break;
// }
// case InputCommand::Purple: {
// setSolidColor(CRGB::Purple);
// break;
// }
// case InputCommand::Indigo: {
// setSolidColor(CRGB::Indigo);
// break;
// }
// case InputCommand::Magenta: {
// setSolidColor(CRGB::Magenta);
// break;
// }
//
// case InputCommand::White: {
// setSolidColor(CRGB::White);
// break;
// }
// case InputCommand::Pink: {
// setSolidColor(CRGB::Pink);
// break;
// }
// case InputCommand::LightPink: {
// setSolidColor(CRGB::LightPink);
// break;
// }
// case InputCommand::BabyBlue: {
// setSolidColor(CRGB::CornflowerBlue);
// break;
// }
// case InputCommand::LightBlue: {
// setSolidColor(CRGB::LightBlue);
// break;
// }
// }
//}
void handleIrInput()
{
InputCommand command = readCommand();
if (command != InputCommand::None) {
Serial.print("command: ");
Serial.println((int) command);
}
switch (command) {
case InputCommand::Up: {
adjustPattern(true);
break;
}
case InputCommand::Down: {
adjustPattern(false);
break;
}
case InputCommand::Power: {
setPower(power == 0 ? 1 : 0);
break;
}
case InputCommand::BrightnessUp: {
adjustBrightness(true);
break;
}
case InputCommand::BrightnessDown: {
adjustBrightness(false);
break;
}
case InputCommand::PlayMode: { // toggle pause/play
setAutoplay(!autoplay);
break;
}
// pattern buttons
case InputCommand::Pattern1: {
setPattern(0);
break;
}
case InputCommand::Pattern2: {
setPattern(1);
break;
}
case InputCommand::Pattern3: {
setPattern(2);
break;
}
case InputCommand::Pattern4: {
setPattern(3);
break;
}
case InputCommand::Pattern5: {
setPattern(4);
break;
}
case InputCommand::Pattern6: {
setPattern(5);
break;
}
case InputCommand::Pattern7: {
setPattern(6);
break;
}
case InputCommand::Pattern8: {
setPattern(7);
break;
}
case InputCommand::Pattern9: {
setPattern(8);
break;
}
case InputCommand::Pattern10: {
setPattern(9);
break;
}
case InputCommand::Pattern11: {
setPattern(10);
break;
}
case InputCommand::Pattern12: {
setPattern(11);
break;
}
// custom color adjustment buttons
case InputCommand::RedUp: {
solidColor.red += 8;
setSolidColor(solidColor);
break;
}
case InputCommand::RedDown: {
solidColor.red -= 8;
setSolidColor(solidColor);
break;
}
case InputCommand::GreenUp: {
solidColor.green += 8;
setSolidColor(solidColor);
break;
}
case InputCommand::GreenDown: {
solidColor.green -= 8;
setSolidColor(solidColor);
break;
}
case InputCommand::BlueUp: {
solidColor.blue += 8;
setSolidColor(solidColor);
break;
}
case InputCommand::BlueDown: {
solidColor.blue -= 8;
setSolidColor(solidColor);
break;
}
// color buttons
case InputCommand::Red: {
setSolidColor(CRGB::Red);
break;
}
case InputCommand::RedOrange: {
setSolidColor(CRGB::OrangeRed);
break;
}
case InputCommand::Orange: {
setSolidColor(CRGB::Orange);
break;
}
case InputCommand::YellowOrange: {
setSolidColor(CRGB::Goldenrod);
break;
}
case InputCommand::Yellow: {
setSolidColor(CRGB::Yellow);
break;
}
case InputCommand::Green: {
setSolidColor(CRGB::Green);
break;
}
case InputCommand::Lime: {
setSolidColor(CRGB::Lime);
break;
}
case InputCommand::Aqua: {
setSolidColor(CRGB::Aqua);
break;
}
case InputCommand::Teal: {
setSolidColor(CRGB::Teal);
break;
}
case InputCommand::Navy: {
setSolidColor(CRGB::Navy);
break;
}
case InputCommand::Blue: {
setSolidColor(CRGB::Blue);
break;
}
case InputCommand::RoyalBlue: {
setSolidColor(CRGB::RoyalBlue);
break;
}
case InputCommand::Purple: {
setSolidColor(CRGB::Purple);
break;
}
case InputCommand::Indigo: {
setSolidColor(CRGB::Indigo);
break;
}
case InputCommand::Magenta: {
setSolidColor(CRGB::Magenta);
break;
}
case InputCommand::White: {
setSolidColor(CRGB::White);
break;
}
case InputCommand::Pink: {
setSolidColor(CRGB::Pink);
break;
}
case InputCommand::LightPink: {
setSolidColor(CRGB::LightPink);
break;
}
case InputCommand::BabyBlue: {
setSolidColor(CRGB::CornflowerBlue);
break;
}
case InputCommand::LightBlue: {
setSolidColor(CRGB::LightBlue);
break;
}
}
}
void loadSettings()
{
@ -907,6 +917,8 @@ void setPattern(uint8_t value)
}
broadcastInt("pattern", currentPatternIndex);
resetPattern = true;
}
void setPatternName(String name)
@ -1155,7 +1167,7 @@ void heatMap(CRGBPalette16 palette, bool up)
random16_add_entropy(random(256));
// Array of temperature readings at each simulation cell
static byte heat[NUM_LEDS];
static byte heat[256];
byte colorindex;

193
sunrise.h Normal file
View File

@ -0,0 +1,193 @@
const uint16_t sunriseSeconds = 60; // how long should the "sun" take to rise from completely dark to completely lit
const uint16_t sunriseMillis = (sunriseSeconds * 1000);
const uint16_t sunriseInterval = sunriseMillis / 240; // when using palettes, the usable range is 0-240 before it starts wrapping from the last color to the first
uint8_t sunriseIncrement = 4; // how much to change brightness for each level of the matrix
uint8_t sunriseLevel;
const CRGBPalette16 sunrisePalette = HeatColors_p;
const uint8_t centerX = MatrixWidth / 2;
void updateSunrise() {
EVERY_N_MILLIS(sunriseInterval) {
if (sunriseLevel < 240) {
sunriseLevel++;
Serial.print("Current level: "); Serial.println(sunriseLevel);
}
else if (sunriseIncrement > 0) {
sunriseIncrement--;
}
}
if (resetPattern) {
sunriseLevel = 0;
sunriseIncrement = 4;
FastLED.clear();
}
}
void sunriseStatic() {
updateSunrise();
for (uint8_t x = 0; x < MatrixWidth; x++) {
int16_t d = sunriseLevel - sunriseIncrement;
for (uint8_t y = 0; y < MatrixHeight; y++) {
if (d >= 0) {
CRGB newcolor = ColorFromPalette(sunrisePalette, random(0, d), random8(d, 255));
uint16_t pixelnumber = XY(x, y);
nblend(leds[pixelnumber], newcolor, 64);
}
d -= sunriseIncrement;
}
}
}
void sunriseFlicker() {
dimAll(240);
updateSunrise();
for (uint8_t x = 0; x < MatrixWidth; x++) {
int16_t d = sunriseLevel - sunriseIncrement;
for (uint8_t y = 0; y < MatrixHeight; y++) {
if (d >= 0) {
CRGB newcolor = ColorFromPalette(sunrisePalette, random(0, d), random8(d, 255));
uint16_t pixelnumber = XY(x, y);
nblend(leds[pixelnumber], newcolor, 64);
}
d -= sunriseIncrement;
}
}
}
void sunriseWavesDiagonal() {
dimAll(240);
updateSunrise();
uint8_t t = beat8(60);
for (uint8_t x = 0; x < MatrixWidth; x++) {
for (uint8_t y = 0; y < MatrixHeight; y++) {
uint8_t cx = sin8(x);
uint8_t cy = cos8(y);
uint8_t bri8 = sin8(8 * (cx + cy) + t);
CRGB newcolor = ColorFromPalette(sunrisePalette, sunriseLevel, bri8);
uint16_t pixelnumber = XY(x, y);
pixelnumber = (NUM_LEDS - 1) - pixelnumber;
nblend(leds[pixelnumber], newcolor, 64);
}
}
}
void sunriseWavesVertical() {
updateSunrise();
static uint16_t sPseudotime = 0;
static uint16_t sLastMillis = 0;
uint8_t brightdepth = beatsin88( 341, 96, 224);
uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
uint8_t msmultiplier = beatsin88(147, 23, 60);
uint16_t ms = millis();
uint16_t deltams = ms - sLastMillis ;
sLastMillis = ms;
sPseudotime += deltams * msmultiplier;
uint16_t brightnesstheta16 = sPseudotime;
for (uint8_t y = 0; y < MatrixHeight; y++) {
brightnesstheta16 += brightnessthetainc16;
uint16_t b16 = sin16( brightnesstheta16 ) + 32768;
uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
bri8 += (255 - brightdepth);
for (uint8_t x = 0; x < MatrixWidth; x++) {
CRGB newcolor = ColorFromPalette(sunrisePalette, sunriseLevel, bri8);
uint16_t pixelnumber = XY(x, (MatrixHeight - 1) - y);
pixelnumber = (NUM_LEDS - 1) - pixelnumber;
nblend(leds[pixelnumber], newcolor, 64);
}
}
}
void sunriseWavesHorizontal() {
updateSunrise();
static uint16_t sPseudotime = 0;
static uint16_t sLastMillis = 0;
uint8_t brightdepth = beatsin88( 341, 96, 224);
uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
uint8_t msmultiplier = beatsin88(147, 23, 60);
uint16_t ms = millis();
uint16_t deltams = ms - sLastMillis ;
sLastMillis = ms;
sPseudotime += deltams * msmultiplier;
uint16_t brightnesstheta16 = sPseudotime;
for (uint8_t x = 0; x < MatrixWidth; x++) {
brightnesstheta16 += brightnessthetainc16;
uint16_t b16 = sin16( brightnesstheta16 ) + 32768;
uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
bri8 += (255 - brightdepth);
for (uint8_t y = 0; y < MatrixHeight; y++) {
CRGB newcolor = ColorFromPalette(sunrisePalette, sunriseLevel, bri8);
uint16_t pixelnumber = XY(x, y);
pixelnumber = (NUM_LEDS - 1) - pixelnumber;
nblend(leds[pixelnumber], newcolor, 64);
}
}
}
void sunriseWavesRotating() {
updateSunrise();
static uint16_t sPseudotime = 0;
static uint16_t sLastMillis = 0;
uint8_t brightdepth = beatsin88( 341, 96, 224);
uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
uint8_t msmultiplier = beatsin88(147, 23, 60);
uint16_t ms = millis();
uint16_t deltams = ms - sLastMillis ;
sLastMillis = ms;
sPseudotime += deltams * msmultiplier;
uint16_t brightnesstheta16 = sPseudotime;
for (uint8_t x = 0; x < MatrixWidth; x++) {
for (uint8_t y = 0; y < MatrixHeight; y++) {
brightnesstheta16 += brightnessthetainc16;
uint16_t b16 = sin16( brightnesstheta16 ) + 32768;
uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
bri8 += (255 - brightdepth);
CRGB newcolor = ColorFromPalette(sunrisePalette, sunriseLevel, bri8);
uint16_t pixelnumber = XY(x, y);
pixelnumber = (NUM_LEDS - 1) - pixelnumber;
nblend(leds[pixelnumber], newcolor, 64);
}
}
}