Skocz do zawartości

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


Pomocna odpowiedź

Rutusowiec, dobrze, że to wyłapałeś 😉 Musiałem z przyzwyczajenia wpisać taki typ. Zapis uint32_t oznacza zmienną bez znaku (mówi o tym pierwsze "u" od unsigned), która zajmuje w pamięci 32 bity, czyli 4 bajty. W Arduino typ ten najczęściej nazywamy "unsigned long", ale wpisana tutaj wersja również zadziała. Analogicznie występują typy int32_t, uint8_t itd. Zapis taki stosuje się głównie, aby mieć pewność ile bitów informacji będzie mogła pomieścić zmienna.

  • 2 miesiące później...

Jako zadanie domowe postanowiłem zrobić koguty policyjne z wykorzystaniem linijki i dwóch diod led, mniejsza o to, wyszło tak jak chciałem, postanowiłem więc trochę zmodyfikować ten program i dodać brzęczyk (prowizorka syreny policyjnej ), i tutaj nasuwają się pytania:

1. Jak to zrobić żeby brzęczyk wydawał jakąś tam konkretną melodyjkę podczas działania linijki, niezależnie od niej. Chodzi o to aby linijka i brzęczyk działały niezależnie od siebie, linijka pokazuje swoje podczas gdy brzęczyk ciągle gra. Pytanie dotyczy również tych dwóch diod, które chcę żeby świeciły w na swój sposób.

2. Dołączamy switcha. Jak zrobić aby po jego wciśnięciu program się uruchamiał (diody świecą, brzęczyk gra) , zaś po kolejnym wduszeniu program się wyłączał (nic nie świeci i nie gra).

3. Jest jakiś sposób na wyłączenie arduino gdy jest podłączone do zasilania?

Załączam kod który obsługuje tylko linijkę WS2812.

#include <Adafruit_NeoPixel.h> //Dołączenie biblioteki

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

void setup() {
 linijka.begin(); //Inicjalizacja
 linijka.show(); 

}

void loop() 
{
for(int i=0; i<8; i++){                                     //Kolor czerwony na całej linijce
linijka.setPixelColor(i, linijka.Color(25,0 , 0));    
}
linijka.show();



for(int i=0;i<8;i++){                                       //Niebieski impuls do góry 
 if(i==0){
   linijka.setPixelColor(i, linijka.Color(0, 0, 200)); 
     linijka.show();
 }
 else if(i==8){
      linijka.setPixelColor(i, linijka.Color(0, 0, 200));
     linijka.setPixelColor(i-1, linijka.Color(25, 0, 0));
       linijka.show();

 }
else{
     linijka.setPixelColor(i, linijka.Color(0, 0, 200));
     linijka.setPixelColor(i-1, linijka.Color(25, 0, 0));
       linijka.show();
         delay(50);
 }


}
for(int i=7;i>0;i--){                                        //Niebieski impuls w dół

     linijka.setPixelColor(i-1, linijka.Color(0, 0, 200));
     linijka.setPixelColor(i, linijka.Color(25, 0, 0));
       linijka.show();
         delay(50);
 }

}

MrSnowman24688, zaczynając od końca - jeśli Arduino jest podłączone do zasilania, to nie ma możliwości, aby fizycznie odłączyć je od zasilania. Jedyna opcja, to wyciągnięcie przewodu zasilającego... Aby zrealizować zadania, które opisałeś w pytaniu nr 1 i 2 powinieneś zrezygnować z opóźnień wykonywanych przez funkcję delay, która zatrzymuje całkowicie program. Zagadnienie to jest jednak trochę bardziej zawiłe i na ten moment nie było poruszane w tym kursie. Jeśli chcesz samemu podziałać w tym kierunku, to polecam zapoznać się z funkcją milis. Opis na stronie Arduino: https://www.arduino.cc/en/Reference/Millis

  • 4 miesiące później...

Cześć,
Mam ARDUINO.ORG, a jak wejdę w Szkic > Dodaj bibliotekę > Zarządzaj bibliotekami i wpiszę "Adafruit_NeoPixel" to mi to wyskakuje, że mogę pobrać, więc pobrałem i... nie działa. Mam taki sam kod jak przy pierwszym ćwiczeniu (powinna się świecić pierwsza dioda na zielono) z WS2812, a wszystkie diody świecą się na czerwono, więc zgaduję, że coś nie działa. Teraz pytania:

1. Czyli jednak muszę pobrać tę bibliotekę z GitHub'a?

2. Mam w komputerze dwa dyski, na jednym © mam Arduino, a na drugim (D) zapisuję programy w nim zapisane. Czy to nie powoduje jakiś konfliktów? Czy to przez to "świruje" WS2812?

Z góry dziękuję,
Pzdr

P.S. Zauważyłem też, że zapisuje mi biblioteki na dwóch dyskach, więc te z (D) przeniosłem do odpowiedniego folderu w ©. Nie wiem, czy jeszcze bardziej nie skomplikowałem sprawy..

Ja_Robot, aktualnie nie mam dostępu do swojego komputera z Arduino, aby to przetestować. Możliwe, że faktycznie masz coś u siebie "namieszane" i używasz innej biblioteki niż Ci się wydaje... Przykład z tego kursu (z migającymi diodami) uruchamiałem dosłownie tydzień temu i wszystko działało poprawnie 😉

Ja_Robot, dlatego, że dwie wersje Arduino, to efekt wojny autorów tej platformy (w pewnym momencie zrobili dwa osobne środowiska). Teraz wszystko powoli wychodzi na prostą, więc pojawiają się pewne zmiany. Do ostatecznego zjednoczenia jeszcze trochę im zostało 😉

Treker, to bardzo dobrze, że zaczynają się dogadywać, bo dwie wersje tego samego, to trochę słaba opcja.

Kiedy będziesz miał dostęp do komputera z Arduino?

Ja_Robot, aby przetestować to w praktyce niestety dopiero za tydzień (poniedziałek). Jeśli nie chcesz tyle czekać, to najszybciej byłoby pewnie jeśli usuniesz z komputera wszystkie wersje Arduino, usuniesz pliki bibliotek i sprawdzisz całość od nowa. Może wtedy przestaną się dziać dziwne rzeczy z bibliotekami 😉

  • 1 miesiąc później...
Gość es2
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);

rezerwuje pamięć. Ile bajtów na diodę? Pewnie trzy?

linijka.show(); 

uruchamia transmisję do diod. W tym czasie przerwania sa pewnie zawieszone?

  • 2 miesiące później...

Hej, mam pytanie, jeśli między listwą led programowalnych, a arduino mam 9m, to kondensator 100uF równolegle na linii zasilania, lepiej wpiąć bliżej arduino czy bliżej listwy led?

Moja linijka LED działa tak pokazał bym filmik ale kamera nie radzi sobie z światłem LED

#include <Adafruit_NeoPixel.h>// inicjalizujemy  bibliotekę
Adafruit_NeoPixel LED = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);//dane paska LED
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int los = 0;
int d = 100;
void setup() {
 LED.begin();// połączenie z paskiem LED
 LED.show();// uruchomienie działania paska
 randomSeed(analogRead(A5)); //ustawiam pin dla losowania
}

int losowosc(){
 int wybór = random(1,4);
 return wybór;// zwracamy wylosowana liczbę
}
void Kolor(){// wybieramy kolor
 los = losowosc();
 switch(los){
   case 1:
   a = 255;
   break;
   case 2:
   b = 255;
   break;
   case 3:
   c = 255;
   break;
 }
}
void Minuskolor(){// wybieramy ujemny kolor
 los = losowosc();
 switch(los){
   case 1:
   a = 1;
   break;
   case 2:
   b = 1;
   break;
   case 3:
   c = 1;
   break; 
 }
}
void wGore(){// pasek led idzie do gory
 Kolor();
 for(i = -1; i < 8; i++){
   LED.setPixelColor(i, LED.Color(a,b,c));
   LED.show();
   delay(150); 
 }
 a = 0;
 b = 0;
 c = 0;
}

void wDol(){// pasek led idzie w dol
 Kolor();
 for(i = 8; i > -1; i--){
   LED.setPixelColor(i, LED.Color(a,b,c));
   LED.show();
   delay(150);
 }
 a = 0;
 b = 0;
 c = 0;
}

void PulsacjaWdol(){// zanikanie led
 Kolor();
 while( a > 0){
   for (i = -1; i < 8; i ++){
     LED.setPixelColor(i ,LED.Color(a,b,c));
     }
 LED.show();
 delay(150);
 a = a - 20;
 LED.clear();
}
while( b > 0){
   for (i = -1; i < 8; i ++){
     LED.setPixelColor(i ,LED.Color(a,b,c)); 
     }
 LED.show();
 delay(150);
 b = b - 20;
 LED.clear();
}
while( c > 0){
   for (i = -1; i < 8; i ++){
     LED.setPixelColor(i ,LED.Color(a,b,c)); 
     }
 LED.show();
 delay(150);
 c = c - 20;
 LED.clear();
}
a = 0;
b = 0;
c = 0;
}

void PulsacjaWgore(){// pojawianie sie led
 a = 0;
 b = 0;
 c = 0;
 Minuskolor();
 while( d > 0){
   while((a < 254)&&(a > 0)){
   for (i = -1; i < 8; i ++){
     LED.setPixelColor(i ,LED.Color(a,b,c));
     }
 LED.show();
 delay(150);
 a = a + 20;
 d = d - 10;
 LED.clear();
}
while(( b < 254)&&(b > 0)){
   for (i = -1; i < 8; i ++){
     LED.setPixelColor(i ,LED.Color(a,b,c)); 
     }
 LED.show();
 delay(150);
 b = b + 20;
 d = d - 10;
 LED.clear();
}
while(( c < 254)&&(c > 0)){
   for (i = -1; i < 8; i ++){
     LED.setPixelColor(i ,LED.Color(a,b,c)); 
     }
 LED.show();
 delay(150);
 c = c + 20;
 d = d - 10;
 LED.clear();

}
}
a = 0;
b = 0;
c = 0;
d = 100;
}

void wGore2color(){// pasek LED dodaje się i idzie w gore
 Kolor();
 for(i = -1; i < 8; i++){
   LED.setPixelColor(i, LED.Color(a,b,c));
   LED.show();
   delay(150); 
 }
}

void wDol2color(){// pasek LED dodaje się i idzie w dol
 Kolor();
 for(i = 8; i > -1; i--){
   LED.setPixelColor(i, LED.Color(a,b,c));
   LED.show();
   delay(150);
 }
}

void MieszankaWgore(){// kolorowość paska LED i idzie do góry
   LED.setPixelColor(0, LED.Color(255,b,c));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(1, LED.Color(0,0,255));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(2, LED.Color(255,b,0));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(3, LED.Color(a,255,c));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(4, LED.Color(a,0,255));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(5, LED.Color(0,255,0));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(6, LED.Color(a,0,c));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(7, LED.Color(255,0,0));
   LED.show();
   delay(500);
   a = 0;
   b = 0;
   c = 0;
}

void MieszankaWdol(){// kolorowość paska LED i idzie w dol
   LED.setPixelColor(7, LED.Color(255,b,c));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(6, LED.Color(0,0,255));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(5, LED.Color(255,b,0));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(4, LED.Color(a,255,c));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(3, LED.Color(a,0,255));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(2, LED.Color(0,255,0));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(1, LED.Color(a,0,c));
   LED.show();
   delay(150);
   Kolor();
   LED.setPixelColor(0, LED.Color(255,0,0));
   LED.show();
   delay(500);
   a = 0;
   b = 0;
   c = 0;
}

void Opcje(){// wybiera co ma wykonać z paskiem LED
 int wybór = random(1,9);
 switch(wybór){
   case 1:
   wGore();
   break;
   case 2:
   wDol();
   break;
   case 3:
   PulsacjaWdol();
   break;
   case 4:
   PulsacjaWgore();
   break;
   case 5:
   wGore2color();
   break;
   case 6:
   wDol2color();
   break;
   case 7:
   MieszankaWgore();
   break;
   case 8:
   MieszankaWdol();
   break;
 }
}
void loop() {
 uint32_t kolor = 0;// nadanie koloru 32 bitów
 losowosc();
 Opcje();
}
  • 4 tygodnie później...

Dzięki czemu, po pierwsze dioda taka może świeci na 3 podstawowe kolory, po drugie możliwe jest oczywiście mieszanie kolorów. (świecić)?

Tutaj oczywiście zastosowanie znają LEDy programowalne, które od teraz zaczniemy używać. (znajdą)?

Na rynku dostępne jest wiele podobnie wyglądających modułów, nie mogę zagwarantować, że zawsze wyprowadzenia będą ułożone tak samo. (dostępnych)?

Pierwszy kod; na końcu mamy komentarz, że wyłączamy wszystkie diody. Mimo tego od razu następuje powtórzenie sekwencji i w efekcie dostajemy czerwony kolor zamiast wyłączenia wszystkich diod. Może lepiej na końcu dopisać delay(2000)?

Trzeci kod; nie lepiej zmiennej i przypisać zero tylko w pętli for, zamiast to robić dwa razy? Lub też zadeklarować poza pętlą?

-------

Dlaczego listwa jest programowana przez pin A0? Niby wcześniej pojawiła się odpowiedź, ale nie rozwiała wątpliwości. Sugeruje to to, że musi to być pin analogowy, żeby zmieniać wartość od 0 do 255. Zatem nie może to być klasyczny pin stan niski/stan wysoki. Czyli PWM też nie może być, gdyż zapewnia tylko zmienne wypełnienie sygnału prostokątnego. Zatem?

__________

Komentarz dodany przez: Treker

Dziękuję, zmiany wprowadzone. Kwestia przypisywania "zera" dwa razy do zmiennej i nic w programie nie zmieni, mam wyrobiony nawyk zerowania zmiennych, więc niech już tak zostanie 😉

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