Skocz do zawartości

Kurs Arduino II - #2 - diody RGB (tradycyjne oraz WS2812)


Pomocna odpowiedź

 

11 godzin temu, ethanak napisał:

jeśli diody są programowalne to trzeba je po prostu odpowiednio zaprogramować

Dzięki wcześniej na to nie wpadłem.😆   Czyli wystarczy w programie zmniejszyć jasność wszystkich używanych kolorów?

50 minut temu, StefanekP napisał:

Czyli wystarczy w programie zmniejszyć jasność wszystkich używanych kolorów?

Jeśli chcesz uzyskać równomierne rozłożenie kolorów konieczne jest użycie korekcji gamma, inaczej wraz ze zmianą jasności będzie zmieniała się barwa paska.

link1 i dość obszerny artykuł

 

  • Lubię! 1
25 minut temu, _LM_ napisał:

konieczne jest użycie korekcji gamma

Na początek wystarczy zwykłe zmniejszenie jasności, a czy korekcja będzie potrzebna to zależy od uzyskanego efektu.

 

  • 3 tygodnie później...

 Taki mix wszystko działa tak jak chciałem ale :

 

#include <Adafruit_NeoPixel.h> //Dołączenie biblioteki

//Konfiguracja linijki
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);

void setup() {
  linijka.begin(); //Inicjalizacja
  linijka.show();
}

void loop() {
  int i = 0;
  int a = 0;
  int b = 0;
  int c = 0;
  int q = 0;

  for (q = 0; q < 10; q++) { // pętla wykona się 10 razy diody migają
    for (i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(0, 0, 55)); //Dioda nr i świeci na wybrany kolor

    }
    linijka.show();
    delay(200);

    for (i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(55, 0, 0)); //Dioda nr i świeci na wybrany kolor
    }

    linijka.show();
    delay(200);

    for (i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(0, 55, 0)); //Dioda nr i świeci na wybrany kolor

    }
    linijka.show();
    delay(200);


  }
  linijka.clear();
  for (i = 0; i < 8; i++) {
    for (a = 0; a < 255; a = a + 15) {

      linijka.setPixelColor(i, linijka.Color(a, 0, 0)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(0, linijka.Color(10, 0, 0));
    linijka.show();


    for (b = 0; b < 255; b = b + 15) {

      linijka.setPixelColor(i, linijka.Color(0, b, 0)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(1, linijka.Color(0, 10, 0));
    linijka.show();

    for (c = 0; c < 255; c = c + 15) {

      linijka.setPixelColor(i, linijka.Color(0, 0, c)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(2, linijka.Color(0, 0, 10));
    linijka.show();


    for (a = 0; a < 255; a = a + 15) {

      linijka.setPixelColor(i, linijka.Color(a, 0, 0)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(3, linijka.Color(10, 0, 0));
    linijka.show();


    for (b = 0; b < 255; b = b + 15) {

      linijka.setPixelColor(i, linijka.Color(0, b, 0)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(4, linijka.Color(0, 10, 0));
    linijka.show();


    for (c = 0; c < 255; c = c + 15) {

      linijka.setPixelColor(i, linijka.Color(0, 0, c)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(5, linijka.Color(0, 0, 10));
    linijka.show();


    for (a = 0; a < 255; a = a + 15) {

      linijka.setPixelColor(i, linijka.Color(a, 0, 0)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(6, linijka.Color(10, 0, 0));
    linijka.show();


    for (b = 0; b < 255; b = b + 15) {

      linijka.setPixelColor(i, linijka.Color(0, b, 0)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(7, linijka.Color(0, 10, 0));
    linijka.show();


    for (c = 0; c < 255; c = c + 15) {

      linijka.setPixelColor(i, linijka.Color(0, 0, c)); //Dioda nr i świeci na wybrany kolor i zmienia jasność
      linijka.show();
      delay(10);
    }
    linijka.clear();
    linijka.setPixelColor(8, linijka.Color(0, 0, 10));
    linijka.show();


  }
  linijka.clear();
  
  for (i = 8; i >= 0; i--) {
    if (i < 3) {
      linijka.setPixelColor(i, linijka.Color(0, 0, 55)); //Zapalają się 2 diody
    } else {
      linijka.setPixelColor(i, linijka.Color(55, 0, 0)); //Zapalają się 3 diody
    }

    if (i > 5) {
      linijka.setPixelColor(i, linijka.Color(0, 55, 0)); //Zapalają się 3 diody
    }

    linijka.show();
    delay(500);
  }
  linijka.clear();
  for (int i = 0; i < 8; i++) {  // zapalają się pokolei 3 kolory
    linijka.setPixelColor(i, linijka.Color(0, 55, 0));

    linijka.show();

    delay(500);
  }
  for (int i = 8; i >= 0; i--) {
    linijka.setPixelColor(i, linijka.Color(55, 0, 0));

    linijka.show();

    delay(500);
  }
  for (int i = 0; i < 8; i++) {
    linijka.setPixelColor(i, linijka.Color(0, 0, 55));

    linijka.show();

    delay(500);
  }
}

Ma ktoś pomysł jak zastąpić powtarzający się kod (chodzi mi o część odpowiedzialną za rozjaśnianie diody i jednoczesne kolejne zapalanie się diod)

 

 

 

  • 9 miesiące później...

Okej zaliczone YT 1 YT 2 i mały bonusik od panów ze wschodu , podobno jestem zadłużony 😄 

oczywiście jak jak bywa w takich scamach nie przechodzi dalej jak się wymyślony kod potw. próbuje wpisać na końcu tej ściemy z linku

123.jpg

       for(int i=255; i>100 ; i--)
       {
          strip2.setBrightness(i);
          strip2.show();
          delay(10);
       }

wie ktoś dlaczego jasność zamiast spadać do 100 spada do zera? getBrightness niby wykrywa 100, ale ledy gasną całkiem. Dopiero przy 150 świecą jak przy 50 wywołanych nie przez pętle for tylko normalnie. 

(edytowany)
39 minut temu, zsakul009 napisał:

wie ktoś dlaczego jasność zamiast spadać do 100 spada do zera? getBrightness niby wykrywa 100, ale ledy gasną całkiem. Dopiero przy 150 świecą jak przy 50 wywołanych nie przez pętle for tylko normalnie. 

Nie używałem tej biblioteki, ale z ciekawości popatrzyłem w jej kod i setBrightness(). Z tego co widzę, tak jak to jest zaimplementowane w niej, po prostu nie ma szans działać. Ustawianie jasności w niej polega na w rzeczywistości na zmianie wartości zapalonych "pikseli". Obliczenia są z zaokrągleniami. I z każdym wywołaniem narasta błąd tych obliczeń. Przykładowo dla piksela, którego kolor był ustawiony na (155, 155, 155), wywołanie setBrightness(50) da w pamięci wartość (30, 30, 30). Ale gdy zacznie się wywoływać w pętli setBrightness() od 255 w dół, to wartość (30, 30, 30) zostanie osiągnięta już przy setBrightness(130).

Można użyć metody getPixels(), by dostać się do jej tablicy pikseli i wyświetlać sobie wartości z niej, by zaobserwować to zjawisko w praktyce.

Zresztą jest na ten temat uwaga w kodzie:

Cytat

This was intended for one-time use in one's setup() function, not as an animation effect in itself. Because of the way this library "pre-multiplies" LED colors in RAM, changing the brightness is often a "lossy" operation -- what you write to pixels isn't necessary the same as what you'll read back. Repeated brightness changes using this function exacerbate the problem. Smart programs therefore treat the strip as a write-only resource, maintaining their own state to render each frame of an animation, not relying on read-modify-write.

 

Edytowano przez trainee
  • Pomogłeś! 1

Dzięki! Rozwiązałem wczoraj problem poprzez dodanie fill() w pętli. Nie wiedziałem dlaczego nie działa to bez tego, a ty mi to wyjaśniłeś za co badzo ci dziękuję! 

  • 7 miesiące później...

@Verg witam na forum 🙂 Kondensator najlepiej podłączyć przy samej linijce z diodami - konkretnie do GND oraz 4-7V, czyli po prostu do zasilania tego modułu.

  • 5 miesiące później...

Super ćwiczenie na początek kursu! Jako informatyk z wykształcenia i zawodu muszę powiedzieć, że taka praca z Arduino, która jest bardziej "software-driven" zdecydowanie bardziej mi odpowiada 🙂 Jak tylko zobaczyłem, że układ wystarczy zestawić raz, a jego pracę można dowolnie dostosowywać z poziomu IDE, do głowy przyszła mi masa pomysłów. A pierwszy z nich - dyskoteka 😄
361856425_6793035174042748_3039682097345044263_n.thumb.gif.b3a632d9fb2ac93fd49f4192f9135728.gif

  • Lubię! 1
  • 5 miesiące później...

Link do filmu - mój efekt LED

Poniżej kod: 

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);

void setup() {
  linijka.begin();
  linijka.show();  // put your setup code here, to run once:

  linijka.setPixelColor(0, linijka.Color(0, 255, 0));
  linijka.show();
}

void loop() {
  int i = 0;
  for (i = 0; i < 10; i++) {
    if (i < 3) {
      linijka.setPixelColor(i, linijka.Color(50, 0, 0));
    }
    else if (i >= 3 && i < 5) {
      linijka.setPixelColor(i, linijka.Color(0, 50, 0));
    }
    else {
      linijka.setPixelColor(i, linijka.Color(0, 0, 50));
    }
    linijka.show();
    linijka.setPixelColor(i - 2, linijka.Color(0, 0, 0));
    delay(100);
  }
  linijka.clear();
}

 

  • Lubię! 1

W końcu znalazłem chwilę, to czas lecieć z dalszą częścią kursu. 😄

Mój potworek do linijki:

 

#include <Adafruit_NeoPixel.h>

// Konfiguracja linijki
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);

void setup() {
  linijka.begin();
  linijka.show();
}

void loop() {
  int kroki[24][8] = { //Tablica przechowująca jasności diod na poszczególnych etapach
    {255, 15, 15, 15, 15, 15, 15, 15},
    {100, 255, 15, 15, 15, 15, 15, 15},
    {50, 100, 255, 15, 15, 15, 15, 15},
    {25, 50, 100, 255, 15, 15, 15, 15},
    {15, 25, 50, 100, 255, 15, 15, 15},
    {15, 15, 25, 50, 100, 255, 15, 15},
    {15, 15, 15, 25, 50, 100, 255, 15},
    {15, 15, 15, 15, 25, 50, 100, 255},
    {15, 15, 15, 15, 15, 25, 50, 100},
    {15, 15, 15, 15, 15, 15, 25, 50},
    {15, 15, 15, 15, 15, 15, 15, 25},
    {15, 15, 15, 15, 15, 15, 15, 15},
    {15, 15, 15, 15, 15, 15, 15, 255},
    {15, 15, 15, 15, 15, 15, 255, 100},
    {15, 15, 15, 15, 15, 255, 100, 50},
    {15, 15, 15, 15, 255, 100, 50, 25},
    {15, 15, 15, 255, 100, 50, 25, 15},
    {15, 15, 255, 100, 50, 25, 15, 15},
    {15, 255, 100, 50, 25, 15, 15, 15},
    {255, 100, 50, 25, 15, 15, 15, 15},
    {100, 50, 25, 15, 15, 15, 15, 15},
    {50, 25, 15, 15, 15, 15, 15, 15},
    {25, 15, 15, 15, 15, 15, 15, 15},
    {15, 15, 15, 15, 15, 15, 15, 15}
  };

  for (int step = 0; step < 24; step++) { //pętla wykonująca 24 kroki
    linijka.clear();
    for (int i = 0; i < 8; i++) { //pętla zapalająca kolejne diody w każdym kroku
      linijka.setPixelColor(i, linijka.Color(kroki[step][i], 0, 0)); //wartości jasności diody pobrane z tablicy dla aktualnej wartości zmiennych w pętli
    }
    linijka.show();
    delay(50);
  }

  for (int b = 0, b2 = 15; b < 15; b++, b2--) { //pętla płynnie zmieniająca kolory, b2 jasność bieżąca, b jasność zadana
      linijka.clear();
    for (int i = 0; i < 8; i++) {
        linijka.setPixelColor(i, linijka.Color(b2, b, 0));
    }
      linijka.show();
      delay(50);
    }

  for (int step = 0; step < 24; step++) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(0, kroki[step][i], 0));
    }
    linijka.show();
    delay(50);
  }
  
  for (int b = 0, b2 = 15; b < 15; b++, b2--) {
      linijka.clear();
    for (int i = 0; i < 8; i++) {
        linijka.setPixelColor(i, linijka.Color(0, b2, b));
    }
      linijka.show();
      delay(50);
  }
  
  for (int step = 0; step < 24; step++) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(0, 0, kroki[step][i]));
    }
    linijka.show();
    delay(50);
  }
  
  for (int b = 0, b2 = 15; b < 15; b++, b2--) {
      linijka.clear();
    for (int i = 0; i < 8; i++) {
        linijka.setPixelColor(i, linijka.Color(b, b, b2));
    }
      linijka.show();
      delay(50);
  }
  
  for (int step = 0; step < 24; step++) {
    linijka.clear();

    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(kroki[step][i], kroki[step][i], 0));
    }
    linijka.show();
    delay(50);
  }
  
  for (int b = 0, b2 = 15, c = 15; b < 15; b++, b2--) { //Przy 3 diodach musiały nastąpić 3 zmienne... c zmienna dla jasności, której nie będziemy zmieniać w pętli
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(c, b2, b));
    }
    linijka.show();
    delay(50);
  }
  
  for (int step = 0; step < 24; step++) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(kroki[step][i], 0, kroki[step][i]));
    }
    linijka.show();
    delay(50);
  }
  
  for (int b = 0, b2 = 15, c = 15; b < 15; b++, b2--) {
      linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(b2, b, c));
    }
    linijka.show();
    delay(50);
  }
  
  for (int step = 0; step < 24; step++) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(0, kroki[step][i], kroki[step][i]));
    }
    linijka.show();
    delay(50);
  }
  
  for (int b = 0, b2 = 15, c = 15; b < 15; b++, b2--) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(b, c, c));
    }
    linijka.show();
    delay(50);
  }
  
  for (int step = 0; step < 24; step++) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(kroki[step][i], kroki[step][i], kroki[step][i]));
    }
    linijka.show();
    delay(50);
  }

  for (int b = 0, b2 = 15, c = 15; b < 15; b++, b2--) {
    linijka.clear();
    for (int i = 0; i < 8; i++) {
      linijka.setPixelColor(i, linijka.Color(c, b2, b2));
    }
    linijka.show();
    delay(50);
  }
}

 

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...