Skocz do zawartości

Pasek diod RGB - falowanie kolorów


Pomocna odpowiedź

WItam,
Robię projekt polegający na ,,falowym" miganiu diodami RGB, używam zestawu i schematu montażowego z pierwszego odcinka drugiej częsci kursu Arduino (https://forbot.pl/blog/kurs-arduino-ii-diody-rgb-tradycyjne-oraz-ws2812-id15495). Chciałbym osiągnąć wynik w postaci:
dioda1 zaczyna zmieniać kolor z niebieskiego na czerwony,
czekamy 10ms (ale nie przerywamy zmieniania koloru)
dioda2 zaczyna zmieniać kolor,
czekamy 10ms, itd.
Robię z millis(), żeby uniknąć zatrzymywania wszystkiego przez delay().
Nie umiem jeszcze zrobić inwersji koloru (z czerwonego na niebieski).
Miałem pomysł, żeby użyć funkcji getPixelColor() z Adafruit_NeoPixel, ale nie umiem zaimplementować . Wydaje mi się, że to rozwiązałoby problem (sprawdzamy kolor i zmieniamy na odwrotny). Proszę o pomoc, może być też w inny sposób.

#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel RGB = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);
void setup() {
  // put your setup code here, to run once:
  RGB.begin();
  RGB.show();
  Serial.begin (9600);
}
int i = 0;
unsigned long aktualny_czas = 0;
unsigned long zapisany_czas = 0;
void loop() {
  // put your main code here, to run repeatedly:
     aktualny_czas = millis();
      
        if (aktualny_czas - zapisany_czas >=10)
      {
      zapisany_czas = aktualny_czas;
      i++;
      RGB.setPixelColor(0, RGB.Color(i, 0, 255-i));
      RGB.show();
      Serial.println (i);
      }

}


 

Link do komentarza
Share on other sites

@Poczatkujacy witam na forum 🙂 przejrzyj temat dotyczący projektu który realizuję, jest tam trochę o efektach na paskach LED. Akurat używam do tego FastLED ale w bibliotece od Adafruita znajdziesz podobne funkcje:

 

 

Link do komentarza
Share on other sites

(edytowany)

@Gieneq  Realnie muszę tylko zrozumieć jak przekonwertować wartości wypluwane przez funkcję
getPixelColor() na te podawane w setPixel Color (n, Color (x, y, z)). Nie są to te same schematy, a ja nie widzę podobieństwa między podaniem kolorów 255,0,0 a wynikiem odczytu 16711680. Tutaj kod jakim testuję obie funkcje:

#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel RGB = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);
void setup() {
  // put your setup code here, to run once:
  RGB.begin();
  RGB.show();
  Serial.begin (9600);
}
int color = 0;
void loop() {
  // put your main code here, to run repeatedly:
  RGB.setPixelColor (0, RGB.Color(255,0, 0));
  RGB.show();
  Serial.println ("Od razu");
  Serial.println (RGB.getPixelColor (0));
  color = RGB.getPixelColor (0);
  Serial.println ("zmienna");
  Serial.println (color);
}

 

Edytowano przez Poczatkujacy
Link do komentarza
Share on other sites

1 minutę temu, Poczatkujacy napisał:

255,0,0 a wynikiem odczytu 16711680.

a ja widzę 😉 

image.thumb.png.3cde63eb9d7e7e992644a4611c791dac.png

255 to inaczej FF w systemie szesnastkowym, które w reprezentacji koloru RGB jest najstarszym bajtem.

Dokumentacja:

image.thumb.png.423d9edcb3069fab450ec25ccde50394.png

Przechodzi do konkretnych opisów parametrów:

image.thumb.png.4740670de8cd3a7a47b0c8b6c46bc271.png

więc możesz użyć tego ze zmienną połączonych kanałów RGB.

Jeżeli chodzi o funkcję get to masz to samo:

image.thumb.png.2b431951982efc7ba7667df8d813a093.png

3 kanały  jednej zmiennej.

Jak odczytać poszczególne kanały? Pewnie jest do tego funkcja, ale wystarczy że zrobisz przesunięcie bitowe i operacje maskowania bitów. Np kolor niebieski jest na najmłodszym bajcie. Więc dla przykładowego kolory RGB: 1C22F1, kanał:

  • niebieski to 1C22F1 & FF = 0000F1 (hex),
  • zielony to (1C22F1>>8) & FF = 001C22 & FF = 22 (hex),
  • czerwony to (1C22F1>>16) & FF = 00001C & FF = 22 (hex).

W kolorze czerwonym możnaby uprościć i zostawić samo: 1C22F1>>16, ale jeżeli mamy zmienną 32 bitową czyli 4 bajtową to na najstarszym bajcie może się coś zdarzyć i wtedy: 101C22F1>>16 = 0000101C.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@GieneqA czy jest jakiś sposób żeby z systemu dziesiątkowego (w którym zwraca wartości funkcja getColor, jak rozumiem po pierwszym obrazku) przejść do 32-bitowego (czyli podawanego w setColor)? Kiedy spróbowałem dodać wartości podane wyżej (0000101C) wyskakuje błąd.

Forbot.png

Link do komentarza
Share on other sites

23 minuty temu, Poczatkujacy napisał:

przejść do 32-bitowego

@Poczatkujacy tu mylisz pojęcia. Liczby w C++ masz w postaci zmiennych i domyślnie operujesz w systemie dziesiętnym, ale że reprezentacja zmiennych jest w systemie dwójkowym to możemy odnieść się do bitów, a że pisanie 32 bitów jest trudne, to programista może sobie operować na 4 bitów czyli w systemie szesnastkowym. 

Błąd który robisz wynika z nieznajomości biblioteki i składni języka. To co robisz wygląda jakbyś używał konstruktor tworzący instancję (obiekt) jakiejś klasy. W opisie funkcji masz napisane, że setColor przyjmuje zmienną 32 bitową reprezentującą kolor rgb. Więc taki trzeba tam wrzucić.

A RGB.Color to:

image.thumb.png.a12baff7cff163d12ae7aaff31b25ca6.png

Funkcja konwertująca 3 kanały w 1. Zwróć uwagę narożne typy danych - różne wielkości liczone w bitach:

image.thumb.png.5eb8fc7bdea517f4fc9a8b0cac44d02f.png

Jej implementacji można sie łatwo domyśleć - coś odwrotnego do algorytmu który ci opisałem.

Więc skoro masz przeciążoną funkcję setColor to czy wpiszesz jej zlepione kanały, czy oddzielne kanały to na jedno wyjdzie:

 RGB.setPixelColor (0, RGB.Color(255,0, 0));
 RGB.setPixelColor (0, 255, 0, 0);
 RGB.setPixelColor (0, 255<<16);
 RGB.setPixelColor (0, 0xFF<<16);

Wszystko robi to samo.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.