Skocz do zawartości

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


Komentator

Pomocna odpowiedź

 for (a = 255 ; a > 0; a --) {
   linijka.setPixelColor(0, linijka.Color(0,0,a));
   linijka.setPixelColor(1, linijka.Color(0,0,a));
   linijka.setPixelColor(2, linijka.Color(0,0,a));
   linijka.setPixelColor(3, linijka.Color(0,0,a));
   linijka.setPixelColor(4, linijka.Color(0,0,a));
   linijka.setPixelColor(5, linijka.Color(0,0,a));
   linijka.setPixelColor(6, linijka.Color(0,0,a));
   linijka.setPixelColor(7, linijka.Color(0,0,a));
   linijka.show();
delay(10);

Witam , zależny mi na krótszym zapisie . Jak załączyć diody w jednej linijce zapisu .Proszę o pomoc.

Edytowano przez pawelkucz
Link do komentarza
Share on other sites

Przede wszystkim przejrzyj funkcje dostępne w tej bibliotece. Jeżeli nie ma takiej która np. ustawia ten sam kolor wszystkim diodkom (lub jakiemuś ich zakresowi), to pozostaje używanie tej pojedynczej, co najwyżej możesz skrócić zapis przez użycie którejś konstrukcji pętli:

for (a = 255; a > 0; a --) {
  for (uint8_t n = 0; n <= 7; n++)
    linijka.setPixelColor(n, linijka.Color(0, 0, a));
  linijka.show();
}
delay(10);

 

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

Witam 

Tego w poradniku nie było 

Już umiem zapalac dany kolor aby "szedł" w lewą strone 

Ale jak zapalac diody od prawej strony? Jedna po drugiej? 

Będzie jeszcze kontynuacja kursu o diodach ws2812? Gdyż ten jest lekko okrojony :(

Pozdrawiam

Link do komentarza
Share on other sites

@Piro, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
1 godzinę temu, Piro napisał:

Ale jak zapalac diody od prawej strony? Jedna po drugiej? 

Będzie jeszcze kontynuacja kursu o diodach ws2812? Gdyż ten jest lekko okrojony 😞

To nie był kurs pisany z myślą tylko o diodach, w każdym odcinku opisywane było coś innego. Rozwiązanie Twojego problemu nie jest związane bezpośrednio z diodami. Zapoznaj się z kursem podstaw Arduino, jak opanujesz dobrze temat pętli to żadne włączanie diod (w dowolnym kierunku) nie będzie już stanowiło problemu 😉 Możesz do tego wykorzystać np. pętlę forKurs Arduino – #8 – Sterowanie silnikami DC, pętla for

  • Pomogłeś! 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

A ja się pochwalę tym co zrobiłem. Program powinien działać (chyba, nie mam jak sprawdzić) w zasadzie z dowolną ilością LED pod warunkiem zdefiniowania tej ilości w "LEDcount". Pewnie jest sporo błędów ale nie zajmuje się programowaniem na co dzień. Inspiracja: kaukaskie wieżowce 😛

 

#include <Adafruit_NeoPixel.h>
#define LEDcount 8
#define background 10
#define diff 150
#define maximum 255
Adafruit_NeoPixel RGBstrip= Adafruit_NeoPixel(LEDcount, A0, NEO_GRB + NEO_KHZ800);

#define opoznienie 100
int i = 0;
int j = 0;

void setup() {
  RGBstrip.begin();
  for(i = 0; i < LEDcount; i++){
    RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, background));
  }
  RGBstrip.show();
}

void loop() {
  for(int i = 0; i < LEDcount; i++){  
    for(int j = 0; j < 255; j++){
      if(i == 0){
        RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum)));
        RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff)));
        RGBstrip.setPixelColor(LEDcount-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff)));
        RGBstrip.setPixelColor(LEDcount-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background)));
      }
      else if(i == 1){
        RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum)));
        RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff)));
        RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff)));
        RGBstrip.setPixelColor(LEDcount-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background)));
      }
      else if((i > 1) && (i < (LEDcount-2))){
        RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum)));
        RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff)));
        RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff)));
        RGBstrip.setPixelColor(i-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background)));    
      }
      else if(i == LEDcount - 2){
        RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum)));
        RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff)));
        RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff)));
        RGBstrip.setPixelColor(i-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background)));
      }
      else if(i == LEDcount - 1){
        RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum)));
        RGBstrip.setPixelColor(0, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff)));
        RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff)));
        RGBstrip.setPixelColor(i-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background)));
      }
      RGBstrip.show();
      delayMicroseconds(opoznienie);
    }
  }
}

 

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

@Rogal bardzo fajny efekt 🙂 Jeśli chodzi o program to proponowałbym tylko dodać trochę komentarzy. Wiem, że teraz dla Ciebie każda linijka jest oczywista, ale jak wrócisz do swojego kodu za jakiś czas to sam będziesz miał problemy z przypomnieniem sobie o co tam chodziło. Z takich drobiazgów można się jeszcze tylko doczepić nazewnictwa stałych/zmiennych. Jeśli większość jest w języku angielskim to wypadałoby w takiej samej konwencji nazwać stałą "opoznienie". Jednak to są już takie detale 😉

  • Pomogłeś! 1
Link do komentarza
Share on other sites

2 godziny temu, Treker napisał:

Z takich drobiazgów można się jeszcze tylko doczepić nazewnictwa

Też o tym myślałem. Problem był taki, że "delay" jest już wykorzystane w innym kontekście jako komenda a nic innego na szybko nie wymyśliłem. Co do komentarzy to nie pomyślałem wcześniej. W sumie to mój pierwszy kod do którego mam szanse kiedyś wrócić 🙂

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

Dla zainteresowanych płynnym zmienianiem kolorów. Stworzyłem bardzo krótki (chyba krótszego się już nie da :-)) programik:

void loop()
{
  k1 = ceil(x / 3);
  m1 = ceil(x / 5);
  n1 = ceil(x / 7);
  k = (255 - (2 * (abs((k1 % 255) - 127))));
  m = (255 - (2 * (abs((m1 % 255) - 127))));
  n = (255 - (2 * (abs((n1 % 255) - 127))));
  analogWrite(blue, k);
  analogWrite(green, m);
  analogWrite(red, n);
  delay(10);
  x++;
}

Oczywiście zdefiniowanie odpowiednich wyjść zależy od modelu płytki. Zmieniając dzielniki w k1, m1 i n1 zmieniamy "okresy" przebiegów dla poszczególnych składowych RGB. Opóźnienie też można dowolnie zmieniać (oczywiście w sensownych dla oka granicach). 

Link do komentarza
Share on other sites

@robertSzczecin witam na forum i dziękuję za podzielenie się fragmentem kodu. Może dodasz trochę komentarza lub rozszerzysz swój opis? Dla wielu osób taki kod raczej nie będzie od razu zrozumiały 🙂

PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku 😉

Link do komentarza
Share on other sites

Witam wszystkich, ja akurat potrzebowalem zrobic taki efekt jak na filmiku ponizej i moze komus sie akurat tez przyda wiec podrzucam 🙂

void loop() {
  int i = 0;
  //w petli zapalamy kolejno co dwie diody
  for(i = 0; i < 8; i++) {
    //nieparzyste wywolanie petli jest pomijane
    if(i%2!=0) {
      continue;
    }
    //po kazdym przebiegu cala linijka jest gaszona
    linijka.clear();
    //ustawiamy na dwie kolejne diody kolor rozowy
    linijka.setPixelColor(i, linijka.Color(223, 82, 134));
    linijka.setPixelColor(i + 1, linijka.Color(223, 82, 134));
    linijka.show();
    delay(250);
  }
}

Pozdrawiam!

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

Ruszam z druga częścią kursu :). 
Lubie jak projekty są w jakimś stopniu interaktywne. Zatem użyłem dwóch potencjometrów do manipulowania wartościami dwóch kolorów. Wartość trzeciego koloru manipulowana jest z wykorzystaniem fotorezystora aby nadać "trochę przypadkowości". Dodałem tez dwa przyciski, jeden pozwala zmienić tryb świecenia - stałe vs zapalnie kolejnych Ledów po kolei. Drugi z przycisków ma swoje zastosowanie w trybie "stałym". Z jego wykorzystaniem możemy zmienić ilość zapalonych diod.

Poniżej kod i film z działania układu.

#include <Adafruit_NeoPixel.h> //dołączenie bilioteki dla paska LED
#define fotorezystor A1 //definicje dla komponentów
#define potencjometr1 A5
#define potencjometr2 A4
#define przyciskTrybu 2
#define przyciskIlosci 3

boolean tryb = false; //zmienna określająca aktualny tryb pracy
int fotorezystorW; //zmienna dla fotorezystora
int potencjometr1W; //zmienne dla potencjometrow
int potencjometr2W;

int kolor1; //zmienna dla koloru pierwszego
int kolor2; //zmienna dla koloru drugiego
int kolor3; //zmienna dla koloru trzeciego
int ilosc = 8; //ide diod ma sie świecić


//konfiguracja linijkki

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

void setup()
{
  
    pinMode(przyciskTrybu, INPUT_PULLUP); //zdefiniowanie piny dla przycisku trybu
    pinMode(przyciskIlosci, INPUT_PULLUP); //zdefioniowanie pinu dla przycisku
    linijka.begin(); //Inicjalizacja paska LED
    linijka.show();
    
}

void loop()
{

    if (ilosc <= 8 && ilosc >= 0)
    { //sprawdzenie czy wartosc ilosci diod miescie sie w zakresie
        wczytanieKolorow(); //wywołanie funkcji wczytującej kolory z ADC

        if (tryb == true) 
        { //sprawdzenie, którego trybu chcemy użyć

            kilkaNaRaz(ilosc); //wywołanie funkcji kilku diod świecących na raz
            zmianaIlosci(); //wywołanie funkcji dla zmiany ilości diod

        }
        else
        {
            wszystkiePoKolei(); //wywołanie funkcji dla kolejno zapalających się diod
        }

    }
    else
    { //gdy ilosc wyjscie z zakresu
        ilosc = 8;
    }

    zmianaTrybu(); //wywołanie funkcji pozwalającej na zmianę trybu

}

void wczytanieKolorow()
{ //funkcja wczytująca kolotry z ADC
    potencjometr1W = analogRead(potencjometr1);
    potencjometr2W = analogRead(potencjometr2);
    fotorezystorW = analogRead(fotorezystor);

    kolor1 = map(potencjometr1W, 0, 1024, 0, 255);
    kolor1 = constrain(kolor1, 0, 255);

    kolor3 = map(fotorezystorW, 0, 1024, 0, 255);
    kolor3 = constrain(kolor3, 0, 255);

    kolor2 = map(potencjometr2W, 0, 1024, 0, 255);
    kolor2 = constrain(kolor2, 0, 255);
}

void kilkaNaRaz(int ile)
{ //funkcja zapewniająca świecene kilku diod jednocześnie
    int i = 0;

    for (i = 0; i < ile; i++)
    {
        linijka.setPixelColor(i, kolor1, kolor2, kolor3);

    }

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

}

void wszystkiePoKolei()
{//funkcja zapewniająca zapalanie diod po kolei
    int i = 0;

    for (i = 0; i < 8; i++)
    {
        linijka.setPixelColor(i, kolor1, kolor2, kolor3);
        linijka.show();
        delay(200);

    }

    linijka.clear();
}

void zmianaTrybu()
{ //funkcja zapewniajaca zmianę trybu
    while (digitalRead(przyciskTrybu) == LOW)
    {
        tryb = !tryb;
        delay(1500);
    }
}

void zmianaIlosci()
{ //funkcja zapewniające zmianę ilości świecących diod
    while (digitalRead(przyciskIlosci) == LOW)
    {
        ilosc--;
        delay(1500);
    }
}

 

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

@BHBmacieg fajnie, że starasz się poeksperymentować coś więcej, takie doświadczenia pomagają lepiej zrozumieć temat 🙂 

Musze pochwalić cię za całkiem ładny kod programu, polecam tylko nieco wyróżnić "definy" np pisząc je wyłącznie wielkimi literami oddzielając wyrazy podkreślnikami _, poprawi to czytelność większych kodów. A tak to super, tak trzymaj! 🙂 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Czy coś źle mogłem podłączyć (choć upewniłem się kilka razy...), gdyż kolory działają mi inaczej, zamieniony mam kolor zielony z czerwonym. Bo powinna być chyba kolejność Czerwony, Zielony, Niebieski...

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel diody = Adafruit_NeoPixel(8, A0, NEO_RGB + NEO_KHZ800);

void setup() {
    diody.begin();
    diody.show();

    diody.setPixelColor(0, diody.Color(255, 0, 0)); //świeci na zielono
    diody.setPixelColor(1, diody.Color(0, 255, 0)); //świeci na czerwono
    diody.setPixelColor(2, diody.Color(0, 0, 255)); //świeci na niebiesko
    diody.show();
}

void loop() {
    
}

 

Link do komentarza
Share on other sites

@radziopoke Chyba troszkę nakręciłeś. Tu masz fragment kodu źródłowego, w opisie parametrów jest kolejność: r, g, b:

void Adafruit_NeoPixel::setPixelColor(
 uint16_t n, uint8_t r, uint8_t g, uint8_t b) {

  if(n < numLEDs) {
    if(brightness) { // See notes in setBrightness()
      r = (r * brightness) >> 8;
      g = (g * brightness) >> 8;
      b = (b * brightness) >> 8;
    }
    uint8_t *p;
    if(wOffset == rOffset) { // Is an RGB-type strip
      p = &pixels[n * 3];    // 3 bytes per pixel
    } else {                 // Is a WRGB-type strip
      p = &pixels[n * 4];    // 4 bytes per pixel
      p[wOffset] = 0;        // But only R,G,B passed -- set W to 0
    }
    p[rOffset] = r;          // R,G,B always stored
    p[gOffset] = g;
    p[bOffset] = b;
  }
}

W kursie jest tak samo. 🙂 

 

  • linijka.setPixelColor(0, linijka.Color(255, 0, 0)) - dioda nr 1 świeci na czerwono
  • linijka.setPixelColor(0, linijka.Color(0, 255, 0)) - dioda nr 1 świeci na zielono
  • linijka.setPixelColor(0, linijka.Color(0, 0, 255)) - dioda nr 1 świeci na niebiesko

Ale widzę teraz że różnica jest w konstruktorze, używasz innego sposobu reprezentacji koloru. Podmień na to (NEO_GRB) i powinno działać:

Adafruit_NeoPixel waz_swietlny= Adafruit_NeoPixel(8, 3, NEO_GRB + NEO_KHZ800);

 

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.