ring ws2812b

User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

veeroos wrote: Mon Dec 08, 2025 11:35 am Dobra bo głupoty napisałem, bo odpisywałem komuś innemu na pytania związane z nierównomiernym zapalaniem się paska i się zamotałem :D . Nie wiem czy dokładnie o to Ci chodzi, ale zobacz jak ja to rozwiązałem w swoim programie, musiałem zapisać stan paska w jakim się on znajdował tak aby zaczęło się wygaszać od tego momentu do którego się zapaliło i na odwrót, musiałem stworzyć zmienną bool (trwa_animacja), która informowała czy animacja już się zakończyła, czy nie, wtedy odpowiednio układ reagował. Zauważ też, że w moim programie jak zapalają się diody i jak zmieniasz kolor w kanale RGB to od momentu włączenia danego koloru kolejne diody zapalają się na ustawiony kolor. Przeportuj mój program pod ESP8266 ustaw na sztywno prędkości reagowania na przycisk, czasy rozjaśniania i wygaszania, prędkość animacji i spróbuj stworzyć klasę uniwersalną pod pasek programowalny.
Zrobiłem odwrotnie Najpierw uruchomiłem Twój kod, a potem bazując na działaniu zrobiłem to samo w klasie, tylko z paroma poprawkami. Jedną z nich jest nieblokowanie zmiany koloru LEDów w trakcie zapalania (w trakcie gaszenia nie wiem czy to będzie działać, ze względu na to kiedy funkcja setRGBxxx jest wywoływana, sprawdzę jak wieczorem poprawię błąd, który zdiagnozował @klew). Obejrzyj moje iterateAlways() (odpowiednik Tasma_RGB() u Ciebie). Zamiast kilku zmiennych flagowych używam tylko licznika zapalonych LEDów
veeroos wrote: Mon Dec 08, 2025 11:35 am Zobacz na ten efekt, który później dorobiłem do tego programu:
https://youtube.com/shorts/W7bKKHs0sbk?feature=share
Pomyśl nad klasą która by mogła też takie efekty generować, ewentualnie zostawić klasę dziedziczącą w takiej formie jak mniej więcej ja i Radek zrobiliśmy, do tego użyć dedykowanej biblioteki i wywoływać tylko wewnątrz klasy zapalanie się konkretnego piksela, a nie generować w klasie efektów.
A którym kodzie piszesz?
veeroos wrote: Mon Dec 08, 2025 11:35 am coś na przykład takiego:

Code: Select all

RgbLeds->SetPixel(numPixel, ColorPixel);
No chyba, że źle myślę. Cała logika wtedy by była w programie, a obsługa pikseli w klasie. Ja właśnie tak sobie to wyobrażałem, chciałem też stworzyć taką klasę, ale brakuje wiecznie mi czasu.
Cały czas się zastanawiam nad sposobem zmiany efektów. Nie mam jeszcze pomysłów na sensowne rozwiązanie (łatwe do zmiany bez definiowana klasy pochodnej).
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
User avatar
veeroos
Posts: 1080
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

Kod do efektu nie został opublikowany, ale dodałem efekt Neopixel raibow LED jak to wygooglasz to jest to właśnie to.
Ale ogólnie rób rób bibliotekę chętnie skorzystam, najwyżej przerobię pod siebie , no i właśnie myślę żeby zrobić coś uniwersalnego żeby dodać dowolny efekt. Zresztą zobacz na moim kanale YT bo tam parę efektów wrzuciłem (kod też nie jest opublikowany, ale jak coś mogę go podesłać)
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

Dla tych co chcieliby sobie potestować klasę do obsługi WS2812b (i podobnych, obsługiwanych przez Adafruit Neopixel

wersja poprawiona sprzed kilku postów:

Code: Select all

/*
 Copyright (C) malarz
*/
#include <supla/control/rgb_base.h>
#include <Adafruit_NeoPixel.h>

class RgbLeds : public Supla::Control::RGBBase {
  public:
    RgbLeds(uint16_t number, int16_t pin) {
          numberOfLeds = number;
          pixels = new Adafruit_NeoPixel(numberOfLeds, pin, NEO_GRB + NEO_KHZ800);

          pixels->begin();
    }
    void setRGBWValueOnDevice(uint32_t red,
                              uint32_t green,
                              uint32_t blue,
                              uint32_t colorBrightness,
                              uint32_t brightness) {

      red   = red   * colorBrightness / 4 / 1023;
      green = green * colorBrightness / 4 / 1023;
      blue  = blue  * colorBrightness / 4 / 1023;
      
      RGBcolor = pixels->Color(red, green, blue);
    }

  void iterateAlways() {
    RGBBase::iterateAlways();

    // włączanie kolejnych LEDów
    if (isOn() && lightedLeds<numberOfLeds && (millis()-lastTime >= OneLedTime) || (millis() < lastTime)) {
      lastTime = millis();
      SUPLA_LOG_DEBUG("TASMA RGB zapalanie diody %d", lightedLeds);
      pixels->setPixelColor(lightedLeds, RGBcolor);
      pixels->show();
      lightedLeds++;
    }

    // zmiana koloru LEDów
    if (lightedLeds) {
      for (int i=0; i<lightedLeds; i++){
        pixels->setPixelColor(i, RGBcolor);
      }
      pixels->show();
    } 

    // wyłączanie kolejnych LEDów
    if (!isOn() && lightedLeds>0 && (millis()-lastTime >= OneLedTime) || (millis() < lastTime)) {
      lastTime = millis();
      lightedLeds--;
      SUPLA_LOG_DEBUG("TASMA RGB gaszenie diody %d", lightedLeds);
      pixels->setPixelColor(lightedLeds, 0);
      pixels->show();
    }
  }

  private:
    Adafruit_NeoPixel *pixels;
    uint16_t numberOfLeds;
    uint16_t lightedLeds = 0;
    uint32_t RGBcolor = 0;

    int OneLedTime = 200;
    uint32_t lastTime = 0;
};
W kodzie funkcji setup należy ją użyć:

Code: Select all

  auto strip = new RgbLeds(RGB_RING_NUM_LEDS, RGB_GPIO);
  strip->setFadeEffectTime(20000);
  strip->setMinMaxIterationDelay(20000);
zmieniając parametry w razie potrzeby.

Teraz pracuję nad efektami. Uwagi mile widziane.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.

Return to “Pomoc”