Lampa ws2812B DIY

User avatar
YoMan
Posts: 2338
Joined: Thu Apr 30, 2020 5:18 pm
Location: Częstochowa

Post

pixello wrote: Tue Sep 12, 2023 12:16 pm Przedstawiam wszystkim, a szczególnie autorowi projektu moje zastosowanie lampy na ws2812.
https://youtu.be/yzswMZ7LLDQ
Do mojego projektu użyłem pierwszą wersję kodu i nieco go zmodyfikowałem. Dla wprawnych obserwatorów jak widać na filmie program wykonuje trzy równoległe animacje na trzech różnej długości paskach LED oczywiście z jednego esp, a co za tym idzie trzy osobne GPIO do sterowania liniami LED nad wanną, pod wanną i pod prysznicem. Powiecie pewnie, że sterowanie takim oświetleniem łazienki jest kłopotliwe bo kto zabiera telefon do łazienki żeby włączyć LED-y. Dlatego użyłem pierwszej wersji kodu lampy gdzie dedykowany przycisk włącza animację, a każde kolejne naciśnięcie powoduje zmianę animacji i oczywiście podwójne kliknięcie wyłącza paski LED. Do tego celu użyłem modułu TTP223 ukrytego pod klawiszem przełącznika naściennego.
Całkiem ładnie to wyszło :) Gratuluję.
Może wrzucisz swój kod też dla innych do nauki?
YoMan
________________________________________
Wziąłem udział w Supla Offline Party 2023 ;)
kozus
Posts: 13
Joined: Tue Jun 07, 2022 9:15 am
Location: Katowice

Post

pixello wrote: Tue Sep 12, 2023 12:16 pm Przedstawiam wszystkim, a szczególnie autorowi projektu moje zastosowanie lampy na ws2812.
https://youtu.be/yzswMZ7LLDQ
Do mojego projektu użyłem pierwszą wersję kodu i nieco go zmodyfikowałem. Dla wprawnych obserwatorów jak widać na filmie program wykonuje trzy równoległe animacje na trzech różnej długości paskach LED oczywiście z jednego esp, a co za tym idzie trzy osobne GPIO do sterowania liniami LED nad wanną, pod wanną i pod prysznicem. Powiecie pewnie, że sterowanie takim oświetleniem łazienki jest kłopotliwe bo kto zabiera telefon do łazienki żeby włączyć LED-y. Dlatego użyłem pierwszej wersji kodu lampy gdzie dedykowany przycisk włącza animację, a każde kolejne naciśnięcie powoduje zmianę animacji i oczywiście podwójne kliknięcie wyłącza paski LED. Do tego celu użyłem modułu TTP223 ukrytego pod klawiszem przełącznika naściennego.
Super to wygląda, łazienka super GRALUTUJĘ , (marzy mi się taka) mi niestety kod nie działa (stary) mam identyczny problem jak mrprezident14 a chciałem sprawdzić, popróbować, niestety kodu samego nowego nie ma tylko binarka, może podzielił byś się swoim, aktualnie robię z tych diod zegar i chciałem mieć możliwość sterowania z supli kolorem jasnością ale tu poległem nie jestem programistą po tygodniu frustracji dałem za wygraną ale pixello dałeś mi nadzieję i może podzielisz się kodem lub cząstką :lol: aby można było sterować nimi z supli :) nie wiesz jak byś mnie uszczęśliwił ;) z zwykłymi RGB no było by wyzwanie zrobić zegar :) nie mówię że się nie da ale po co wyważać otwarte drzwi, za to miał bym sterowanie kolorami i zaciemnieniem :) ehhhhhh. na razie się poddaję.
radzik_r
Posts: 400
Joined: Sun Aug 11, 2019 5:32 pm

Post

Z którą wersją macie problem z uruchomieniem?
kozus
Posts: 13
Joined: Tue Jun 07, 2022 9:15 am
Location: Katowice

Post

radzik_r wrote: Fri Dec 04, 2020 9:32 pm Witam.
Tak się napatrzyłem na różne projekty ledowe na youtubie i niektóre mi się spodobały, więc spróbowałem sam coś skleić.
W pobliskim markecie nabyłem elementy składowe projektu.
Kilka wieczorów dłubania i wyszła amatorska lampa DIY na taśmie ledowej WS2812B.

Do budowy użyłem: listwa drewniana 20x30mm x 2,4m,naluminiowy profil do taśm led, klej do drewna, kilka wkrętów, pleksa mleczna, mała puszka (200ml) białej farby + wałek + pędzel, taśma ledowa WS2812B, wemos d1mini, tymczasowo zasliacz 12V 3A + przetwornica step-down LM2596 ustawiona na 5V


2 krótkie filmiki z przezentacji działania
https://youtu.be/sfJkrrcNDJQ
https://youtu.be/iQaIDBlvyhM

KOD również amatorski sklejony metodą Ctrl+C, Ctrl+V z przykładu supli oraz z biblioteki FastLED.

Code: Select all

// TEST_LAMPA_DIY_WS2812B//
/*
  Copyright (C) AC SOFTWARE SP. Z O.O.

  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 2
  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, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include <SPI.h>
#include <SuplaDevice.h>

#include <supla/control/virtual_relay.h>
#include <supla/control/rgbw_base.h>

// ESP8266 based board:
#include <supla/network/esp_wifi.h>
Supla::ESPWifi wifi("your_wifi_ssid", "your_wifi_password");

#include <FastLED.h>

#define LED_PIN     5
#define COLOR_ORDER GRB
#define CHIPSET     WS2812B
#define NUM_LEDS    53

#define RED_PIN              101
#define GREEN_PIN            102
#define BLUE_PIN             103
#define COLOR_BRIGHTNESS_PIN 104
#define BRIGHTNESS_PIN       105

#define BRIGHTNESS  150
#define FRAMES_PER_SECOND 60
#define FASTLED_ALLOW_INTERRUPTS 0
FASTLED_USING_NAMESPACE
#define TEMPERATURE_1 Tungsten100W
#define TEMPERATURE_2 OvercastSky
#define DISPLAYTIME 30
bool gReverseDirection = false;
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
CRGB leds[NUM_LEDS];
CRGBPalette16 gPal;


Supla::Control::RGBWBase *r_g_b_w = nullptr;
Supla::Control::VirtualRelay *virtual_relay1 = nullptr;  // name for relay 1
Supla::Control::VirtualRelay *virtual_relay2 = nullptr;  // name for relay 2
Supla::Control::VirtualRelay *virtual_relay3 = nullptr;  // name for relay 3
Supla::Control::VirtualRelay *virtual_relay4 = nullptr;  // name for relay 4
Supla::Control::VirtualRelay *virtual_relay5 = nullptr;  // name for relay 5

// zmienne pomocnicze //
int X0, X1, X2, X3, X4, X5 = false;
int FUNKCJA = 100;
int R_G_B_W = false;


class RgbwLeds : public Supla::Control::RGBWBase {
  public:
    RgbwLeds(int redPin,
             int greenPin,
             int bluePin,
             int colorBrightnessPin,
             int brightnessPin)
      : redPin(redPin),
        greenPin(greenPin),
        bluePin(bluePin),
        colorBrightnessPin(colorBrightnessPin),
        brightnessPin(brightnessPin) {
    }
    void setRGBWValueOnDevice( uint8_t red,
                               uint8_t green,
                               uint8_t blue,
                               uint8_t colorBrightness,
                               uint8_t brightness) {
      //       analogWrite(brightnessPin, (brightness * 255) / 100);
      //       analogWrite(colorBrightnessPin, (colorBrightness * 255) / 100);
      //       analogWrite(redPin,   red);
      //       analogWrite(greenPin, green);
      //       analogWrite(bluePin,  blue);
      if ( colorBrightnessPin > 5) {
        R_G_B_W = true; 

        // włączenie KOLORU RGB wyłącza pozostałe kanały jeżeli któryś jest włączony //
        if ( virtual_relay1->isOn())  virtual_relay1->turnOff();
        if ( virtual_relay2->isOn())  virtual_relay2->turnOff();
        if ( virtual_relay3->isOn())  virtual_relay3->turnOff();
        if ( virtual_relay4->isOn())  virtual_relay4->turnOff();
        if ( virtual_relay5->isOn())  virtual_relay5->turnOff();

        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i].r = red   * colorBrightness / 200 ;   // max red   255 * max colorBrightness 100 / 170 =  150 maksymalna jasność (zasilacz 2A)
          leds[i].g = green * colorBrightness / 200 ;  // max green 255 * max colorBrightness 100 / 170 =  150 maksymalna jasność (zasilacz 2A)
          leds[i].b = blue  * colorBrightness / 200 ; // max blue  255 * max colorBrightness 100 / 170 =  150 maksymalna jasność (zasilacz 2A)
        }
        FastLED.show();
      }
    }
  protected:
    int redPin;
    int greenPin;
    int bluePin;
    int brightnessPin;
    int colorBrightnessPin;
};

void setup() {
  Serial.begin(115200);

  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness( BRIGHTNESS );
  gPal = HeatColors_p;

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  WiFi.mode(WIFI_STA);

  /*
     Having your device already registered at cloud.supla.org,
     you want to change CHANNEL sequence or remove any of them,
     then you must also remove the device itself from cloud.supla.org.
     Otherwise you will get "Channel conflict!" error.
  */

  r_g_b_w = new RgbwLeds(RED_PIN, GREEN_PIN, BLUE_PIN, COLOR_BRIGHTNESS_PIN, BRIGHTNESS_PIN); // kanał RGBW
  virtual_relay1 = new Supla::Control::VirtualRelay();                                       // wirtualny kanał // Confetti(
  virtual_relay2 = new Supla::Control::VirtualRelay();                                      // wirtualny kanał // ColorTemperature()
  virtual_relay3 = new Supla::Control::VirtualRelay();                                     // wirtualny kanał // Pacifica()
  virtual_relay4 = new Supla::Control::VirtualRelay();                                    // wirtualny kanał // Fire2012()
  virtual_relay5 = new Supla::Control::VirtualRelay();                                   // wirtualny kanał // Fire2012WithPalette()

  OFF();

  /*
     SuplaDevice Initialization.
     Server address is available at https://cloud.supla.org
     If you do not have an account, you can create it at https://cloud.supla.org/account/create
     SUPLA and SUPLA CLOUD are free of charge

  */

  SuplaDevice.setName("LAMPA_DIY_WS2812B");

  SuplaDevice.begin(GUID,              // Global Unique Identifier
                    "svr1.supla.org",  // SUPLA server address
                    "email@address",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
}

void loop() {

  if ( virtual_relay1->isOn() && X1 == false) {
    Serial.println("kanał 1 On");
    X1 = true;
    X0 = true;
    // jeżeli włączony 1 kanał to wyłącza pozostałe jeżeli któryś jest włączony //
    if ( virtual_relay2->isOn())  virtual_relay2->turnOff();
    if ( virtual_relay3->isOn())  virtual_relay3->turnOff();
    if ( virtual_relay4->isOn())  virtual_relay4->turnOff();
    if ( virtual_relay5->isOn())  virtual_relay5->turnOff();
    /* // włączenie wirtualnego kanału wyłącza RGBW // niestety użycie tego resetuje esp
        if (  R_G_B_W == true) {
          r_g_b_w->setRGBWValueOnDevice(0, 0, 0, 0, 150);
          // mirgbw->setRGBWValueOnDevice(hw_red, hw_green, hw_blue, hw_colorBrightness, hw_brightness);
          R_G_B_W = false;
        }
    */
    FUNKCJA = 1;  Serial.print(" FUNKCJA: "); Serial.print(FUNKCJA); Serial.println(" Confetti()");
  }
  if ( !virtual_relay1->isOn() && X1 == true) {
    X1 = false;
    Serial.println("kanał 1 Off");
  }

  if ( virtual_relay2->isOn() && X2 == false) {
    Serial.println("kanał 2 On");
    X2 = true;
    X0 = true;
    // jeżeli włączony 2 kanał to wyłącza pozostałe jeżeli któryś jest włączony //
    if ( virtual_relay1->isOn())  virtual_relay1->turnOff(); // jeżeli włączony 2 kanał to wyłącza pozostałe //
    if ( virtual_relay3->isOn())  virtual_relay3->turnOff();
    if ( virtual_relay4->isOn())  virtual_relay4->turnOff();
    if ( virtual_relay5->isOn())  virtual_relay5->turnOff();
    FUNKCJA = 2; Serial.print(" FUNKCJA: "); Serial.print(FUNKCJA); Serial.println(" ColorTemperature()");
    ON();
  }
  if ( !virtual_relay2->isOn() && X2 == true) {
    X2 = false;
    Serial.println("kanał 2 Off");
  }

  if ( virtual_relay3->isOn() && X3 == false) {
    Serial.println("kanał 3 On");
    X3 = true;
    X0 = true;
    // jeżeli włączony 3 kanał to wyłącza pozostałe jeżeli któryś jest włączony //
    if ( virtual_relay1->isOn())  virtual_relay1->turnOff();
    if ( virtual_relay2->isOn())  virtual_relay2->turnOff();
    if ( virtual_relay4->isOn())  virtual_relay4->turnOff();
    if ( virtual_relay5->isOn())  virtual_relay5->turnOff();
    FUNKCJA = 3; Serial.print(" FUNKCJA: "); Serial.print(FUNKCJA); Serial.println(" Pacifica()");
    ON();
  }
  if ( !virtual_relay3->isOn() && X3 == true) {
    X3 = false;
    Serial.println("kanał 3 Off");
  }

  if ( virtual_relay4->isOn() && X4 == false) {
    Serial.println("kanał 4 On");
    X4 = true;
    X0 = true;
    // jeżeli włączony 4 kanał to wyłącza pozostałe jeżeli któryś jest włączony //
    if ( virtual_relay1->isOn())  virtual_relay1->turnOff();
    if ( virtual_relay2->isOn())  virtual_relay2->turnOff();
    if ( virtual_relay3->isOn())  virtual_relay3->turnOff();
    if ( virtual_relay5->isOn())  virtual_relay5->turnOff();
    FUNKCJA = 4; Serial.print(" FUNKCJA: "); Serial.print(FUNKCJA);  Serial.println(" Fire2012()");
  }
  if ( !virtual_relay4->isOn() && X4 == true) {
    X4 = false;
    Serial.println("kanał 4 Off");
  }

  if ( virtual_relay5->isOn() && X5 == false) {
    Serial.println("kanał 5 On");
    X5 = true;
    X0 = true;
    // jeżeli włączony 5 kanał to wyłącza pozostałe jeżeli któryś jest włączony //
    if ( virtual_relay1->isOn())  virtual_relay1->turnOff();
    if ( virtual_relay2->isOn())  virtual_relay2->turnOff();
    if ( virtual_relay3->isOn())  virtual_relay3->turnOff();
    if ( virtual_relay4->isOn())  virtual_relay4->turnOff();
    FUNKCJA = 5; Serial.print(" FUNKCJA: "); Serial.print(FUNKCJA); Serial.println(" Fire2012WithPalette()");
  }
  if ( !virtual_relay5->isOn() && X5 == true) {
    X5 = false;
    Serial.println("kanał 5 Off");
  }

  if ( !virtual_relay1->isOn() && !virtual_relay2->isOn() && !virtual_relay3->isOn() && !virtual_relay4->isOn() && !virtual_relay5->isOn() && X0 == true) {
    Serial.println("kanał ALL Off");
    X0 = false;
    FUNKCJA = 0;
    Serial.println("lampa OFF");
  }

  SuplaDevice.iterate();

  // funkcje z biblioteki FastLed //
  switch (FUNKCJA) {
    case 0:
      FUNKCJA = 100;
      OFF();
      break;
    case 1:
      Confetti();
      FastLED.show();
      FastLED.delay(1000 / FRAMES_PER_SECOND);
      break;
    case 2:
      COLORTEMPERATURE();
      FastLED.show();
      FastLED.delay(1000 / FRAMES_PER_SECOND / 2);
      break;
    case 3:
      EVERY_N_MILLISECONDS( 20) {
        Pacifica_loop();
        FastLED.show();
      }
      break;
    case 4:
      Fire2012(); // run simulation frame
      FastLED.show(); // display this frame
      FastLED.delay(1000 / FRAMES_PER_SECOND * 2);
      break;
    case 5:
      Fire2012WithPalette(); // run simulation frame, using palette colors
      FastLED.show(); // display this frame
      FastLED.delay(1000 / FRAMES_PER_SECOND);
      break;
    case 100:
      break;
  }
}


void ON() {
  for ( int i = 0; i < 100; i++ ) {
    long Number0 = random(0, NUM_LEDS);
    long Number1 = random(0, 100);
    long Number2 = random(0, 100);
    long Number3 = random(0, 100);
    leds[Number0] = CHSV(Number1, Number2, Number3);
    FastLED.show();
    delay(1);
  }
}

// wyłączenie lampy//
void OFF() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[NUM_LEDS - i - 1] = CHSV(0, 0, 0);
    FastLED.show();
    delay(10);
  }
}

#define COOLING  55
#define SPARKING 120
void Fire2012()
{
  // Array of temperature readings at each simulation cell
  static byte heat[NUM_LEDS];

  // Step 1.  Cool down every cell a little
  for ( int i = 0; i < NUM_LEDS; i++) {
    heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
  }

  // Step 2.  Heat from each cell drifts 'up' and diffuses a little
  for ( int k = NUM_LEDS - 1; k >= 2; k--) {
    heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
  }

  // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
  if ( random8() < SPARKING ) {
    int y = random8(7);
    heat[y] = qadd8( heat[y], random8(160, 255) );
  }

  // Step 4.  Map from heat cells to LED colors
  for ( int j = 0; j < NUM_LEDS; j++) {
    CRGB color = HeatColor( heat[j]);
    int pixelnumber;
    if ( gReverseDirection ) {
      pixelnumber = (NUM_LEDS - 1) - j;
    } else {
      pixelnumber = j;
    }
    leds[pixelnumber] = color;
  }
}


void Fire2012WithPalette()
{
  // Array of temperature readings at each simulation cell
  static byte heat[NUM_LEDS];

  // Step 1.  Cool down every cell a little
  for ( int i = 0; i < NUM_LEDS; i++) {
    heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
  }

  // Step 2.  Heat from each cell drifts 'up' and diffuses a little
  for ( int k = NUM_LEDS - 1; k >= 2; k--) {
    heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
  }

  // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
  if ( random8() < SPARKING ) {
    int y = random8(7);
    heat[y] = qadd8( heat[y], random8(160, 255) );
  }

  // Step 4.  Map from heat cells to LED colors
  for ( int j = 0; j < NUM_LEDS; j++) {
    // Scale the heat value from 0-255 down to 0-240
    // for best results with color palettes.
    byte colorindex = scale8( heat[j], 240);
    CRGB color = ColorFromPalette( gPal, colorindex);
    int pixelnumber;
    if ( gReverseDirection ) {
      pixelnumber = (NUM_LEDS - 1) - j;
    } else {
      pixelnumber = j;
    }
    leds[pixelnumber] = color;
  }
}

void COLORTEMPERATURE() {
  // draw a generic, no-name rainbow
  static uint8_t starthue = 0;
  fill_rainbow( leds + 5, NUM_LEDS - 5, --starthue, 20);

  // Choose which 'color temperature' profile to enable.
  uint8_t secs = (millis() / 1000) % (DISPLAYTIME);
  if ( secs < DISPLAYTIME) {
    FastLED.setTemperature( TEMPERATURE_1 ); // first temperature
    leds[0] = TEMPERATURE_1; // show indicator pixel
  } else {
    FastLED.setTemperature( TEMPERATURE_2 ); // second temperature
    leds[0] = TEMPERATURE_2; // show indicator pixel
  }
}

void Confetti()
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}


CRGBPalette16 pacifica_palette_1 =
{ 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,
  0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x14554B, 0x28AA50
};
CRGBPalette16 pacifica_palette_2 =
{ 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,
  0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x0C5F52, 0x19BE5F
};
CRGBPalette16 pacifica_palette_3 =
{ 0x000208, 0x00030E, 0x000514, 0x00061A, 0x000820, 0x000927, 0x000B2D, 0x000C33,
  0x000E39, 0x001040, 0x001450, 0x001860, 0x001C70, 0x002080, 0x1040BF, 0x2060FF
};


void Pacifica_loop()
{
  // Increment the four "color index start" counters, one for each wave layer.
  // Each is incremented at a different speed, and the speeds vary over time.
  static uint16_t sCIStart1, sCIStart2, sCIStart3, sCIStart4;
  static uint32_t sLastms = 0;
  uint32_t ms = GET_MILLIS();
  uint32_t deltams = ms - sLastms;
  sLastms = ms;
  uint16_t speedfactor1 = beatsin16(3, 179, 269);
  uint16_t speedfactor2 = beatsin16(4, 179, 269);
  uint32_t deltams1 = (deltams * speedfactor1) / 256;
  uint32_t deltams2 = (deltams * speedfactor2) / 256;
  uint32_t deltams21 = (deltams1 + deltams2) / 2;
  sCIStart1 += (deltams1 * beatsin88(1011, 10, 13));
  sCIStart2 -= (deltams21 * beatsin88(777, 8, 11));
  sCIStart3 -= (deltams1 * beatsin88(501, 5, 7));
  sCIStart4 -= (deltams2 * beatsin88(257, 4, 6));

  // Clear out the LED array to a dim background blue-green
  fill_solid( leds, NUM_LEDS, CRGB( 2, 6, 10));

  // Render each of four layers, with different scales and speeds, that vary over time
  pacifica_one_layer( pacifica_palette_1, sCIStart1, beatsin16( 3, 11 * 256, 14 * 256), beatsin8( 10, 70, 130), 0 - beat16( 301) );
  pacifica_one_layer( pacifica_palette_2, sCIStart2, beatsin16( 4,  6 * 256,  9 * 256), beatsin8( 17, 40,  80), beat16( 401) );
  pacifica_one_layer( pacifica_palette_3, sCIStart3, 6 * 256, beatsin8( 9, 10, 38), 0 - beat16(503));
  pacifica_one_layer( pacifica_palette_3, sCIStart4, 5 * 256, beatsin8( 8, 10, 28), beat16(601));

  // Add brighter 'whitecaps' where the waves lines up more
  pacifica_add_whitecaps();

  // Deepen the blues and greens a bit
  pacifica_deepen_colors();
}

// Add one layer of waves into the led array
void pacifica_one_layer( CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)
{
  uint16_t ci = cistart;
  uint16_t waveangle = ioff;
  uint16_t wavescale_half = (wavescale / 2) + 20;
  for ( uint16_t i = 0; i < NUM_LEDS; i++) {
    waveangle += 250;
    uint16_t s16 = sin16( waveangle ) + 32768;
    uint16_t cs = scale16( s16 , wavescale_half ) + wavescale_half;
    ci += cs;
    uint16_t sindex16 = sin16( ci) + 32768;
    uint8_t sindex8 = scale16( sindex16, 240);
    CRGB c = ColorFromPalette( p, sindex8, bri, LINEARBLEND);
    leds[i] += c;
  }
}

// Add extra 'white' to areas where the four layers of light have lined up brightly
void pacifica_add_whitecaps()
{
  uint8_t basethreshold = beatsin8( 9, 55, 65);
  uint8_t wave = beat8( 7 );

  for ( uint16_t i = 0; i < NUM_LEDS; i++) {
    uint8_t threshold = scale8( sin8( wave), 20) + basethreshold;
    wave += 7;
    uint8_t l = leds[i].getAverageLight();
    if ( l > threshold) {
      uint8_t overage = l - threshold;
      uint8_t overage2 = qadd8( overage, overage);
      leds[i] += CRGB( overage, overage2, qadd8( overage2, overage2));
    }
  }
}

// Deepen the blues and greens
void pacifica_deepen_colors()
{
  for ( uint16_t i = 0; i < NUM_LEDS; i++) {
    leds[i].blue = scale8( leds[i].blue,  145);
    leds[i].green = scale8( leds[i].green, 200);
    leds[i] |= CRGB( 2, 5, 7);
  }
}
Soft zawiera 6 kanałów, 1 RGBW i 5 wirtualnych przekaźników
Kanał RGB służy do ustawiania kolorów na całej listwie natomiast wirtualne kanały służą do uruchamiania zaprogramowanych funkcji, w moim przypadku 5 wybranych funkcji z biblioteki FastLED.
Z kodem oryginalnym :(
kozus
Posts: 13
Joined: Tue Jun 07, 2022 9:15 am
Location: Katowice

Post

mrprezident14 wrote: Sat Dec 31, 2022 4:37 pm No powiem dramat tego nie moge przejść.
In file included from c:\Users\User\OneDrive\Dokumenty\Arduino\libraries\FastLED\src/FastLED.h:67,
from C:\Users\User\Desktop\ledy\ledy.ino:28:
c:\Users\User\OneDrive\Dokumenty\Arduino\libraries\FastLED\src/fastspi.h:145:23: note: '#pragma message: No hardware SPI pins defined. All SPI access will default to bitbanged output'
145 | # pragma message "No hardware SPI pins defined. All SPI access will default to bitbanged output"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\User\Desktop\ledy\ledy.ino: In function 'void setup()':
C:\Users\User\Desktop\ledy\ledy.ino:138:92: error: invalid new-expression of abstract class type 'RgbwLeds'
138 | r_g_b_w = new RgbwLeds(RED_PIN, GREEN_PIN, BLUE_PIN, COLOR_BRIGHTNESS_PIN, BRIGHTNESS_PIN); // kanał RGBW
| ^
C:\Users\User\Desktop\ledy\ledy.ino:67:7: note: because the following virtual functions are pure within 'RgbwLeds':
67 | class RgbwLeds : public Supla::Control::RGBWBase {
| ^~~~~~~~
In file included from C:\Users\User\Desktop\ledy\ledy.ino:22:
c:\Users\User\OneDrive\Dokumenty\Arduino\libraries\SuplaDevice\src/supla/control/rgbw_base.h:34:16: note: 'virtual void Supla::Control::RGBWBase::setRGBWValueOnDevice(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)'
34 | virtual void setRGBWValueOnDevice(uint32_t red,
| ^~~~~~~~~~~~~~~~~~~~

exit status 1

Compilation error: invalid new-expression of abstract class type 'RgbwLeds'
A taki problem mamy :(
radzik_r
Posts: 400
Joined: Sun Aug 11, 2019 5:32 pm

Post

kozus wrote: Fri Sep 15, 2023 11:15 am
mrprezident14 wrote: Sat Dec 31, 2022 4:37 pm No powiem dramat tego nie moge przejść.
In file included from c:\Users\User\OneDrive\Dokumenty\Arduino\libraries\FastLED\src/FastLED.h:67,
from C:\Users\User\Desktop\ledy\ledy.ino:28:
c:\Users\User\OneDrive\Dokumenty\Arduino\libraries\FastLED\src/fastspi.h:145:23: note: '#pragma message: No hardware SPI pins defined. All SPI access will default to bitbanged output'
145 | # pragma message "No hardware SPI pins defined. All SPI access will default to bitbanged output"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\User\Desktop\ledy\ledy.ino: In function 'void setup()':
C:\Users\User\Desktop\ledy\ledy.ino:138:92: error: invalid new-expression of abstract class type 'RgbwLeds'
138 | r_g_b_w = new RgbwLeds(RED_PIN, GREEN_PIN, BLUE_PIN, COLOR_BRIGHTNESS_PIN, BRIGHTNESS_PIN); // kanał RGBW
| ^
C:\Users\User\Desktop\ledy\ledy.ino:67:7: note: because the following virtual functions are pure within 'RgbwLeds':
67 | class RgbwLeds : public Supla::Control::RGBWBase {
| ^~~~~~~~
In file included from C:\Users\User\Desktop\ledy\ledy.ino:22:
c:\Users\User\OneDrive\Dokumenty\Arduino\libraries\SuplaDevice\src/supla/control/rgbw_base.h:34:16: note: 'virtual void Supla::Control::RGBWBase::setRGBWValueOnDevice(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)'
34 | virtual void setRGBWValueOnDevice(uint32_t red,
| ^~~~~~~~~~~~~~~~~~~~

exit status 1

Compilation error: invalid new-expression of abstract class type 'RgbwLeds'
A taki problem mamy :(
napisz priv lub whatsapp 505661721
Fryga
Posts: 54
Joined: Tue Oct 13, 2020 5:57 pm
Location: Mińsk Mazowiecki

Post

DZieki.

Ja to odpalilem na D1 mini - dodałem jeszcze jedną procedurę juggle() z FastLed. Działa fajnie. Nie musi być na długim led - wystarczy 30-100 ledów. Ja dodatkowo zrobiłem przełączenie kolejnej procedury na zapalenie drugiej taśmy LED (i zgodnie z intencją kolegi wyłączenie pozostałych).

Trzeba by dorobić (pomyślę):
1. regulację jasności - conajmniej z palca :-=)
2. usunięcie flickeringu - takiego migania jak ustawia się karuzelą w aplikacji konkretny kolor LED.
3. wyłączania LED bez dodatkowego migania.

Poza tym obudowa cool - ja mam inny pomysł na taką lampę :-)
stugraj
Posts: 28
Joined: Sun Nov 27, 2022 4:28 pm

Post

radzik_r wrote: Sat Dec 05, 2020 8:36 pm Ja podłączyłem zasilacz 12V 3A z przetwornicą ustawioną na 5V bo akurat taki zasilacz miałem.
Zasilanie podpiąłem do taśmy led 5V, i GND + kondensator 1000uF 6,3V.
A od taśmy przewodem około 5cm zasiliłem wemosa oraz pin D1(gpio5) podpiąłem przez rezystor 330 do DIN.
Pytanie laika, rezystor r330 jaki ma być 0,5 1 czy 2w? A może jeszcze inny? Kondensator przy pasku jest konieczny?
radzik_r
Posts: 400
Joined: Sun Aug 11, 2019 5:32 pm

Post

stugraj wrote: Wed Jan 03, 2024 2:29 pm
radzik_r wrote: Sat Dec 05, 2020 8:36 pm Ja podłączyłem zasilacz 12V 3A z przetwornicą ustawioną na 5V bo akurat taki zasilacz miałem.
Zasilanie podpiąłem do taśmy led 5V, i GND + kondensator 1000uF 6,3V.
A od taśmy przewodem około 5cm zasiliłem wemosa oraz pin D1(gpio5) podpiąłem przez rezystor 330 do DIN.
Pytanie laika, rezystor r330 jaki ma być 0,5 1 czy 2w? A może jeszcze inny? Kondensator przy pasku jest konieczny?
wystarczy 0,5w.
kondensator filtruje napięcie, nie wymagany ale zawsze można dołożyć dla stabilnej pracy. kwestia też długości taśmy lodowej
stugraj
Posts: 28
Joined: Sun Nov 27, 2022 4:28 pm

Post

radzik_r wrote: Wed Jan 03, 2024 3:04 pm
stugraj wrote: Wed Jan 03, 2024 2:29 pm
radzik_r wrote: Sat Dec 05, 2020 8:36 pm Ja podłączyłem zasilacz 12V 3A z przetwornicą ustawioną na 5V bo akurat taki zasilacz miałem.
Zasilanie podpiąłem do taśmy led 5V, i GND + kondensator 1000uF 6,3V.
A od taśmy przewodem około 5cm zasiliłem wemosa oraz pin D1(gpio5) podpiąłem przez rezystor 330 do DIN.
Pytanie laika, rezystor r330 jaki ma być 0,5 1 czy 2w? A może jeszcze inny? Kondensator przy pasku jest konieczny?
wystarczy 0,5w.
kondensator filtruje napięcie, nie wymagany ale zawsze można dołożyć dla stabilnej pracy. kwestia też długości taśmy lodowej

Dziękuję za odpowiedź, mam w planach dać 2,7m paska w profil

Return to “Projekty użytkowników”