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

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...

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.