Do układu trzeba jeszcze dołączyć przycisk, za pomocą którego będzie można zmienić tryb pracy. Należy podłączyć go do pinu 2. Podłączenie przycisku należy wykonać jak na poniższym zdjęciu:
Rysunek 4. Przycisk monostabilny na płycie stykowej podłączony do płytki KAmduino UNO
Teraz można przejść do napisania programu prostego sterownika dla taśmy z diodami adresowanymi WS2812. Przyciśniecie przycisku będzie powodowało przejście do następnego efektu. Gdy lista efektów się skończy, sterownik wróci do pierwszego efektu.
Na początku programu załączone są niezbędne biblioteki NeoPixel do sterowania diodami WS2812. Następnie znajdują się definicje: pinu obsługującego komunikacje z diodami (w tym przypadku jest to pin 6) oraz ilości diod, które są sterowane (czyli ilości diod znajdujących się na pasku, w tym przypadku jest to 60 diod).
1 2 3 4 5 6 7 8 9 10 11 |
//[PROJEKT] Prosty sterownik listwy z diodami LED WS2812 // Autor: Patryk Mądry // Mikrokontroler.pl #include <Adafruit_NeoPixel.h> // Biblioteka do sterowania diodami #define PIN 6 // Pin do sterowania diodami ws2812 #define NUMPIXELS 60 // Ilość diod ws2812 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int licznik = 1; |
Obsługa przycisku jest realizowana w przerwaniu – po naciśnięciu wyzwalana jest funkcja przycisk. Po 200 milisekundach sprawdzany jest stan przycisku – czy nadal jest wciśnięty (ma to zapobiec drganiom styków przycisku), a następnie zmienna licznik jest zwiększana o 1. Gdy zmienna osiągnie wartość większą niż 5 (ilość efektów), jej wartość wróci do 1.
1 2 3 4 5 6 7 8 9 10 11 12 |
void przycisk() { delay(200); if (digitalRead(2)== LOW) { licznik++; if (licznik > 6) { licznik=1; } } } |
Następnie w kodzie znajdują się funkcje obsługujące kolejne efekty (są one opisane poniżej). W funkcji konfiguracyjnej setup() znajdują się ustawienia pinu 2 jako wejście, ustawienia dotyczące pracy portu szeregowego oraz pinu 2 jako tego, od którego jest generowane przerwanie.
1 2 3 4 5 6 7 |
void setup() { Serial.begin(9600); strip.begin(); // Uruchomienie działania biblioteki Adafruit_NeoPixel pinMode(2, INPUT); attachInterrupt(0, test, FALLING); } |
W pętli głównej programu sprawdzana jest zmienna licznik i w zależności od jej wartości wywoływana jest odpowiednia funkcja odpowiedzialna za tryb pracy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
void loop() { switch (licznik) { case 1: efekt_1(); break; case 2: efekt_2(); break; case 3: efekt_3(); break; case 4: efekt_4(); break; case 5: efekt_5(); break; } } |
Teraz przejdę do omówienia funkcji, które będą realizować efekty świetlne. W pierwszym efekcie wszystkie diody świecą kolejno na czerwono, niebiesko oraz zielono, a kolor zmienia się co 1 sekundę. Realizuje to następujący kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void efekt_1() // Zmiana 3 kolory { Serial.println("Efekt 1"); for(int i=0;i <NUMPIXELS ;i++) // Zapalenie całego paska na czerwono { strip.setPixelColor(i, 150, 0, 0); } strip.show(); delay(1000); for(int i=0;i <NUMPIXELS ;i++) // Zapalenie całego paska na niebiesko { strip.setPixelColor(i, 0, 0, 150); } strip.show(); delay(1000); for(int i=0;i <NUMPIXELS ;i++) // Zapalenie całego paska na zielono { strip.setPixelColor(i, 0, 150, 0); } strip.show(); delay(1000); } |
W drugiem efekcie po pasku ledowym „wędruje” pojedyncza dioda. W jedną stronę dioda ma kolor czerwony, natomiast w drugim kierunku kolor zielony. Realizuje to kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void efekt_2() // Zapalanie rosnąco { Serial.println("Efekt 2"); for(int i=0;i <NUMPIXELS ;i++) { strip.setPixelColor(i, 0, 150, 0); strip.show(); delay(20); strip.setPixelColor(i-1, 0, 0, 0); strip.show(); delay(20); } for(int i=NUMPIXELS;i >0 ;i--) { strip.setPixelColor(i, 150, 0, 0); strip.show(); delay(20); strip.setPixelColor(i+1, 0, 0, 0); strip.show(); delay(20); } } |
Trzeci efekt to stroboskop, czyli szybkie zapalanie i gaszenie całego paska ledowego (barwa biała). Oto kod realizujący ten efekt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void efekt_3() // stroboskop { Serial.println("Efekt 3"); for(int i=0;i <NUMPIXELS ;i++) // Zapalenie całego paska na biało { strip.setPixelColor(i, 100, 100, 100); } strip.show(); delay(500); for(int i=0;i <NUMPIXELS ;i++) // Zapalenie całego paska na biało { strip.setPixelColor(i, 0, 0, 0); } strip.show(); delay(500); } |
Kolejny efekt to zapalanie kolejnych diod na kolor zielony, następnie gaszenie ich w odwrotnej kolejności:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void efekt_4() // Zapalanie rosnąco { Serial.println("Efekt 4"); for(int i=0;i <NUMPIXELS ;i++) // Zapalenie stopniowo całego paska na zielono { strip.setPixelColor(i, 0, 150, 0); strip.show(); delay(20); } for(int i=NUMPIXELS;i >0 ;i--) // Gaszenie stopniowo całego paska na zielono { strip.setPixelColor(i, 0, 0, 0); strip.show(); delay(20); } } |
W ostatnim efekcie, pasek również jest zapalany stopniowo, a następnie nie jest gaszony, lecz zapala się stopniowo na kolejny kolor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void efekt_5() // Zapalanie rosnąco { Serial.println("Efekt 4"); for(int i=0;i <NUMPIXELS ;i++) { strip.setPixelColor(i, 150, 0, 0); strip.show(); delay(20); } for(int i=0;i <NUMPIXELS ;i++) { strip.setPixelColor(i, 0, 0, 150); strip.show(); delay(20); } for(int i=0;i <NUMPIXELS ;i++) { strip.setPixelColor(i, 0, 150, 0); strip.show(); delay(20); } } |
To tylko przykładowe efekty – oczywiście do kodu można dodać własne pomysły. Można np. uzależnić szybkość działania efektu od odczytu czujnika.
Powyższe efekty zaprezentowane są na materiale wideo: