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.

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

}

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

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

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 😉

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 😉

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 😉

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?

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?

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

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

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.