Skocz do zawartości
Komentator

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

Pomocna odpowiedź

uint32_t kolor = 0;

domyślam się, że to jest jakas zmienna, może mi ktoś wyjaśnić dokładniej co to jest i dlaczego zostało zastosowane? dzieki

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

}

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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 😉

Udostępnij ten post


Link to post
Share on other sites

Zastanawia mnie dlaczego mogłem pobrać bibliotekę bezpośrednio z poziomu Arduino, skoro mam org, a nie cc

Udostępnij ten post


Link to post
Share on other sites

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 😉

Udostępnij ten post


Link to post
Share on other sites

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?

Udostępnij ten post


Link to post
Share on other sites

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 😉

Udostępnij ten post


Link to post
Share on other sites
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?

Udostępnij ten post


Link to post
Share on other sites

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?

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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 😉

Udostępnij ten post


Link to post
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...