• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Taśma LED WS2812B Zmiana animacji przyciskiem
#1
Witam serdecznie
Jest to mój pierwszy post na tym forum a więc witam szanowną Społeczność  Smile

Potrzebuję kodu który zmieniałby animacje na taśmie diod WS2812B po wciśnięciu przycisku chwilowego
Program miałby działać tak = 
LED;y OFF --> klik --> Animacja 1 --> klik --> Animacja 2 ---> klik --> N;ta Animacja --> klik --> Powrót do OFF

Programowałem już arduino używając biblioteki Adafruit NeoPixel i testowałem sobie różne animacje, liniowo jedna po drugiej, z tym nie mam problemu
W tej bibliotece jest również przykład ButtonCycler czyli zmiana animacji po wciśnięciu przycisku
Niestety problemy są 2
Przycisk zaczyna reagować dopiero po zakończeniu aktualnej animacji, wtedy można kliknąć po kolejną---- przycisk powinien działać natychmiast
Chciałbym też żeby animacje były zapętlone tzn.  Animacja 1 trwa w kółko --> klik --> Animacja 2 trwa w kółko

Ktoś ma pomysł jak zmodyfikować kod buttoncycler;a ? Będę wdzięczny za pomoc


Kod ButtonCycler;a

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   12    

#define PIXEL_PIN    11  

#define PIXEL_COUNT 12

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void setup() {
 pinMode(BUTTON_PIN, INPUT_PULLUP);
 strip.begin();
 strip.show(); // Initialize all pixels to 'off'
}

void loop() {
 // Get current button state.
 bool newState = digitalRead(BUTTON_PIN);

 // Check if state changed from high to low (button press).
 if (newState == LOW && oldState == HIGH) {
   // Short delay to debounce button.
   delay(20);
   // Check if button is still low after debounce.
   newState = digitalRead(BUTTON_PIN);
   if (newState == LOW) {
     showType++;
     if (showType > 9)
       showType=0;
     startShow(showType);
   }
 }

 // Set the last button state to the old state.
 oldState = newState;
}

void startShow(int i) {
 switch(i){
   case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
           break;
   case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
           break;
   case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
           break;
   case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
           break;
   case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
           break;
   case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
           break;
   case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
           break;
   case 7: rainbow(20);
           break;
   case 8: rainbowCycle(20);
           break;
   case 9: theaterChaseRainbow(50);
           break;
 }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
 for(uint16_t i=0; i<strip.numPixels(); i++) {
   strip.setPixelColor(i, c);
   strip.show();
   delay(wait);
 }
}

void rainbow(uint8_t wait) {
 uint16_t i, j;

 for(j=0; j<256; j++) {
   for(i=0; i<strip.numPixels(); i++) {
     strip.setPixelColor(i, Wheel((i+j) & 255));
   }
   strip.show();
   delay(wait);
 }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
 uint16_t i, j;

 for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
   for(i=0; i< strip.numPixels(); i++) {
     strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
   }
   strip.show();
   delay(wait);
 }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
 for (int j=0; j<10; j++) {  //do 10 cycles of chasing
   for (int q=0; q < 3; q++) {
     for (int i=0; i < strip.numPixels(); i=i+3) {
       strip.setPixelColor(i+q, c);    //turn every third pixel on
     }
     strip.show();

     delay(wait);

     for (int i=0; i < strip.numPixels(); i=i+3) {
       strip.setPixelColor(i+q, 0);        //turn every third pixel off
     }
   }
 }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
 for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
   for (int q=0; q < 3; q++) {
     for (int i=0; i < strip.numPixels(); i=i+3) {
       strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
     }
     strip.show();

     delay(wait);

     for (int i=0; i < strip.numPixels(); i=i+3) {
       strip.setPixelColor(i+q, 0);        //turn every third pixel off
     }
   }
 }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
 WheelPos = 255 - WheelPos;
 if(WheelPos < 85) {
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
 }
 if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
 }
 WheelPos -= 170;
 return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
 
Odpowiedź
#2
(25-03-2017, 17:23)Jamno napisał(a): Potrzebuję kodu który zmieniałby animacje na taśmie diod WS2812B po wciśnięciu przycisku chwilowego
Program miałby działać tak = 
LED;y OFF --> klik --> Animacja 1 --> klik --> Animacja 2 ---> klik --> N;ta Animacja --> klik --> Powrót do OFF

Niestety problemy są 2

Przycisk zaczyna reagować dopiero po zakończeniu aktualnej animacji, wtedy można kliknąć po kolejną---- przycisk powinien działać natychmiast
Chciałbym też żeby animacje były zapętlone tzn.  Animacja 1 trwa w kółko --> klik --> Animacja 2 trwa w kółko

Ktoś ma pomysł jak zmodyfikować kod buttoncycler;a ? Będę wdzięczny za pomoc
1. Przycisk musi być obsługiwany w przerwaniu.
2. W każdej funkcji wywoływanej w instrukcji case musisz sprawdzać naciśnięcie przycisku i wyjść z tej funkcji.
3. Aby animacja trwała w kółko to do każdej funkcji musisz dodać zewnętrzną pętlę(for lub while).
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Dziękuję za odpowiedź
Dopiero zaczynam z arduino i pisaniem programów , rozumiem co masz na myśli jednak na dziś dzień nie umiałbym prawidłowo zastosować tego o czym napisałeś :/ Umiem zamigać diodą pod przycisk więc rozumiesz mój obecny poziom ,)
Pomyślałem że może ktoś miał już podobny problem i wrzucił gotowca na Github'a, nie myliłem się i faktycznie znalazłem
Gdyby ktoś potrzebował tego programu podaję link, myślę że na pewno ktoś jeszcze będzie miał z niego pożytek
Poprawiony Kod ButtonCycler

Zostaje mi się pobawić z efektami, mam ze 20 różnych animacji więc muszę je tylko umiejętnie wkleić heh Smile
Jakby mi nie szło na pewno się odezwę


Dzięki bardzo
 
Odpowiedź
#4
O opcji z githuba nie chciałem pisać bo wydawała mi się trudniejsza do realizacji.
Moja opcja sprawdzi się tylko dlatego że delay jest w miarę krótkie, a po dodaniu wszystkich niezbędnych modyfikacji może się okazać że program będzie mało czytelny.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości