From 72cc218fb8d170812161a2a5e7a3b3489fc55e8e Mon Sep 17 00:00:00 2001 From: Jason Coon Date: Thu, 13 Jul 2017 08:46:28 -0500 Subject: [PATCH] Work on the sunrise clock. --- Text.h | 65 +++++++++++++++++++++ esp8266-fastled-webserver.ino | 107 +++++++++++++++++++++------------- sunrise.h | 33 +++++++++++ 3 files changed, 166 insertions(+), 39 deletions(-) create mode 100644 Text.h create mode 100644 sunrise.h diff --git a/Text.h b/Text.h new file mode 100644 index 0000000..daa7f6d --- /dev/null +++ b/Text.h @@ -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); +} + diff --git a/esp8266-fastled-webserver.ino b/esp8266-fastled-webserver.ino index 68712f5..01bd435 100644 --- a/esp8266-fastled-webserver.ino +++ b/esp8266-fastled-webserver.ino @@ -1,20 +1,20 @@ /* - * 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 . - */ + 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 . +*/ #include FASTLED_USING_NAMESPACE @@ -39,7 +39,7 @@ extern "C" { #define HOSTNAME "ESP8266-" ///< Hostname. The setup function adds the Chip ID at the end. -#define RECV_PIN D4 +#define RECV_PIN 1 IRrecv irReceiver(RECV_PIN); #include "Commands.h" @@ -59,10 +59,13 @@ ESP8266HTTPUpdateServer httpUpdateServer; #include "FSBrowser.h" -#define DATA_PIN D8 -#define LED_TYPE WS2811 -#define COLOR_ORDER GRB -#define NUM_LEDS 24 +#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 FRAMES_PER_SECOND 120 // here you can control the speed. With the Access Point / Web Server the animations run a bit slower. @@ -123,6 +126,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 { @@ -133,10 +160,12 @@ typedef PatternAndName PatternAndNameList[]; #include "Twinkles.h" #include "TwinkleFOX.h" +#include "Sunrise.h" // List of patterns to cycle through. Each is defined as a separate function below. PatternAndNameList patterns = { + { sunrise, "Sunrise" }, { pride, "Pride" }, { colorWaves, "Color Waves" }, @@ -179,8 +208,8 @@ const uint8_t patternCount = ARRAY_SIZE(patterns); typedef struct { CRGBPalette16 palette; - String name; - } PaletteAndName; + String name; +} PaletteAndName; typedef PaletteAndName PaletteAndNameList[]; const CRGBPalette16 palettes[] = { @@ -202,10 +231,10 @@ const String paletteNames[paletteCount] = { "Cloud", "Lava", "Ocean", - "Forest", + "Forest", "Party", - "Heat", - }; + "Heat", +}; #include "Fields.h" @@ -214,8 +243,8 @@ void setup() { delay(100); Serial.setDebugOutput(true); - FastLED.addLeds(leds, NUM_LEDS); // for WS2812 (Neopixel) - //FastLED.addLeds(leds, NUM_LEDS); // for APA102 (Dotstar) + // FastLED.addLeds(leds, NUM_LEDS); // for WS2812 (Neopixel) + FastLED.addLeds(leds, NUM_LEDS); // for APA102 (Dotstar) FastLED.setDither(false); FastLED.setCorrection(TypicalLEDStrip); FastLED.setBrightness(brightness); @@ -302,7 +331,7 @@ void setup() { if (String(WiFi.SSID()) != String(ssid)) { WiFi.begin(ssid, password); } - } + } httpUpdateServer.setup(&webServer); @@ -354,7 +383,7 @@ void setup() { webServer.on("/twinkleSpeed", HTTP_POST, []() { String value = webServer.arg("value"); twinkleSpeed = value.toInt(); - if(twinkleSpeed < 0) twinkleSpeed = 0; + if (twinkleSpeed < 0) twinkleSpeed = 0; else if (twinkleSpeed > 8) twinkleSpeed = 8; broadcastInt("twinkleSpeed", twinkleSpeed); sendInt(twinkleSpeed); @@ -363,7 +392,7 @@ void setup() { webServer.on("/twinkleDensity", HTTP_POST, []() { String value = webServer.arg("value"); twinkleDensity = value.toInt(); - if(twinkleDensity < 0) twinkleDensity = 0; + if (twinkleDensity < 0) twinkleDensity = 0; else if (twinkleDensity > 8) twinkleDensity = 8; broadcastInt("twinkleDensity", twinkleDensity); sendInt(twinkleDensity); @@ -804,7 +833,7 @@ void setPower(uint8_t value) } void setAutoplay(uint8_t value) - { +{ autoplay = value == 0 ? 0 : 1; EEPROM.write(6, autoplay); @@ -883,8 +912,8 @@ void setPattern(uint8_t value) void setPatternName(String name) { - for(uint8_t i = 0; i < patternCount; i++) { - if(patterns[i].name == name) { + for (uint8_t i = 0; i < patternCount; i++) { + if (patterns[i].name == name) { setPattern(i); break; } @@ -906,8 +935,8 @@ void setPalette(uint8_t value) void setPaletteName(String name) { - for(uint8_t i = 0; i < paletteCount; i++) { - if(paletteNames[i] == name) { + for (uint8_t i = 0; i < paletteCount; i++) { + if (paletteNames[i] == name) { setPalette(i); break; } @@ -1004,10 +1033,10 @@ void sinelon() int pos = beatsin16(speed, 0, NUM_LEDS); static int prevpos = 0; CRGB color = ColorFromPalette(palettes[currentPaletteIndex], gHue, 255); - if( pos < prevpos ) { - fill_solid( leds+pos, (prevpos-pos)+1, color); + if ( pos < prevpos ) { + fill_solid( leds + pos, (prevpos - pos) + 1, color); } else { - fill_solid( leds+prevpos, (pos-prevpos)+1, color); + fill_solid( leds + prevpos, (pos - prevpos) + 1, color); } prevpos = pos; } diff --git a/sunrise.h b/sunrise.h new file mode 100644 index 0000000..13b20bf --- /dev/null +++ b/sunrise.h @@ -0,0 +1,33 @@ +void sunrise() { + dimAll(240); + + CRGBPalette16 palette = HeatColors_p; + + const uint8_t centerX = MatrixWidth / 2; + + static uint8_t currentLevel = 0; + + static uint8_t inc = 4; + + EVERY_N_MILLIS(250) { + if (currentLevel < 240) { + currentLevel++; + Serial.print("Current level: "); Serial.println(currentLevel); + } + else if (inc > 0) { + inc--; + } + } + + for (uint8_t x = 0; x < MatrixWidth; x++) { + int16_t d = currentLevel - inc; + + for (uint8_t y = 0; y < MatrixHeight; y++) { + if (d >= 0) { + leds[XY(x, y)] += ColorFromPalette(palette, random(0, d), random8(d, 255)); + } + d -= inc; + } + } +} +