Poczatkujacy Napisano Styczeń 31, 2022 Udostępnij Napisano Styczeń 31, 2022 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); } } Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Luty 1, 2022 Udostępnij Luty 1, 2022 @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: Cytuj Link do komentarza Share on other sites More sharing options...
Poczatkujacy Luty 1, 2022 Autor tematu Udostępnij Luty 1, 2022 (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 Luty 1, 2022 przez Poczatkujacy Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Luty 1, 2022 Udostępnij Luty 1, 2022 1 minutę temu, Poczatkujacy napisał: 255,0,0 a wynikiem odczytu 16711680. a ja widzę 😉 255 to inaczej FF w systemie szesnastkowym, które w reprezentacji koloru RGB jest najstarszym bajtem. Dokumentacja: Przechodzi do konkretnych opisów parametrów: więc możesz użyć tego ze zmienną połączonych kanałów RGB. Jeżeli chodzi o funkcję get to masz to samo: 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Poczatkujacy Luty 1, 2022 Autor tematu Udostępnij Luty 1, 2022 @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. Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Luty 1, 2022 Udostępnij Luty 1, 2022 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: Funkcja konwertująca 3 kanały w 1. Zwróć uwagę narożne typy danych - różne wielkości liczone w bitach: 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. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!