Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)
 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

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
  • 3 miesiące później...

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

@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
  • 4 miesiące później...

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

@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
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
  • 2 miesiące później...

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

@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 😉

  • 1 miesiąc później...

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
  • 1 miesiąc później...

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
(edytowany)

@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

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() {
    
}

 

@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);

 

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