• 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
ws2812 - przyciski przełączające animacje(jak ?)
#11
Dobra, pomyślałem że zrobię wszystko na nowa bo był już bałagan. Zrobiłem  nowy kod i działa wszystko dobrze. Ale jest jeden problem że jak chcę więcej przycisków to więcej zmiennych muszę (teraz mam 2 zmienne do przycisków czyli P1 i P2). W dalszym ciągu nie wiem jak zrobić tą jedną zmienną. Jeżeli można to napisz fragment kodu gdzie co wpisać. Przerwa działa na animacji RAIBOW oraz COLORWIPE.

Kod:

Kod:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(25, PIN, NEO_GRB + NEO_KHZ800);



//przyciski
#define switch_0 0
#define switch_1 1
volatile int stan;
volatile int P1;
volatile int P2;
void setup() {
 pinMode(switch_0, INPUT_PULLUP);
 pinMode(switch_1, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(switch_0), animation_0, FALLING);
 attachInterrupt(digitalPinToInterrupt(switch_1), animation_1, FALLING);

 strip.begin();
 strip.show();
}

void loop() {
}

void animation_0() {
 stan = 0;
 przyciski(stan);
}
void animation_1() {
 stan = 1;
 przyciski(stan);
}

void przyciski(volatile int i) {
 switch (i) {
   case 1: P2 = 0;
     rainbow(20);
     break;
   case 0: P1 = 0;
     colorWipe(strip.Color(255, 0, 0), 50);
     break;
 }

}

void colorWipe(uint32_t c, uint8_t wait) {
 P2 = 1;
 for (uint16_t i = 0; i < strip.numPixels(); i++) {
   strip.setPixelColor(i, c);
   strip.show();
   delay(wait);
   if (P1 == 1) {
     return;
   }
 }
}

void rainbow(uint8_t wait) {
 P1 = 1;
 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);
   if (P2 == 1) {
     return;
   }
 }
}


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


void theaterChase(uint32_t c, uint8_t wait) {
 for (int j = 0; j < 10; j++) {
   for (int q = 0; q < 3; q++) {
     for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
       strip.setPixelColor(i + q, c);
     }
     strip.show();

     delay(wait);

     for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
       strip.setPixelColor(i + q, 0);
     }
   }
 }
}


void theaterChaseRainbow(uint8_t wait) {
 for (int j = 0; j < 256; j++) {
   for (int q = 0; q < 3; q++) {
     for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
       strip.setPixelColor(i + q, Wheel( (i + j) % 255));
     }
     strip.show();

     delay(wait);

     for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
       strip.setPixelColor(i + q, 0);
     }
   }
 }
}


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ź
#12
(18-06-2019, 19:56)Jakub428 napisał(a): W dalszym ciągu nie wiem jak zrobić tą jedną zmienną.
W AVR (przeciwieństwie do 8051 i niektórych ARM STM32) najmniejszą jednostką informacji, którą można zapamiętać w zmienej (pomijam rejestry bitowe dostępne w różnej liczbie i nie we wszystkich AVR) jest bajt. Bajt ma 8 bitów, więc w jednym bajcie możesz przechowywać stan 8 przycisków.

(18-06-2019, 19:56)Jakub428 napisał(a): Jeżeli można to napisz fragment kodu gdzie co wpisać. Przerwa działa na animacji RAIBOW oraz COLORWIPE.
Pomagam na free, natomiast za pisanie programów pobieram wynagrodzenie.
 
Odpowiedź
#13
Z jednym przerwaniem możesz zrobić to tak, że nieważne który przycisk wciśniesz to do pary podajesz sygnał na pin z przerwaniem, w tym przerwaniu sprawdzasz, który to faktycznie przycisk jest wciśnięty. Trzeba więc dorobić jakiś osprzęt przy pinach.
Możesz też zrobić cykliczny wybór efektu, przyciskiem zmieniasz zmienną w przerwaniu 1-20 i masz do wyboru 20 efektów. Dwoma przyciskami możesz zmieniać jej wartość w górę i w dół. Na dwa przerwania możesz też podłączyć enkoder obrotowy.

Kod:
volatile int8_t numerAnimacji=0;
volatile uint8_t przerwij=1;

void animation_0() {
przerwij=1;
numerAnimacji++;
if (numerAnimacji>20) numerAnimacji=0;
}
void animation_1() {
przerwij=1;
numerAnimacji--;
if (numerAnimacji<0) numerAnimacji=20;
}
Nie musisz mieć różnych zmiennych do przerwania różnych animacji, zawsze gdy ktoś użyje przycisku + czy -przerywasz aktualną.
 
Odpowiedź
#14
(18-06-2019, 20:25)kaczakat napisał(a): Z jednym przerwaniem możesz zrobić to tak, że nieważne który przycisk wciśniesz to do pary podajesz sygnał na pin z przerwaniem, w tym przerwaniu sprawdzasz, który to faktycznie przycisk jest wciśnięty. Trzeba więc dorobić jakiś osprzęt przy pinach.
Bez bramki AND o liczbie wejść takiej jak liczba przycisków się nie obejdzie. Po co dodawać scalaki (diody / tranzystory) jak można wykorzystać kilka wejść uC?
 
Odpowiedź
#15
Okej, reszta zrobią ale jak teraz podłączyć te 20 przycisków?
Mogę matrycę podłączyć 5x4 ale wyjścia mogą mieć 4 różne napięcia bo raczej nie zrobisz aby miały tylko high każdy przycisk.
 
Odpowiedź
#16
Zawsze można zrobić dodatkowo przycisk kilku funkcyjny i da nam sporo.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#17
(18-06-2019, 21:45)Jakub428 napisał(a): Okej, reszta zrobią ale jak teraz podłączyć te 20 przycisków?
Mogę matrycę podłączyć 5x4 ale wyjścia mogą mieć 4 różne napięcia bo raczej nie zrobisz aby miały tylko high każdy przycisk.
Jakie 4 napięcia? Co kombinujesz? Wystarczy ustawić 5 portów na wejścia, 4 na wyjścia lub na odwrót. Dalej już banał, skanowanie w przerwaniu, likwidacja drżenia styków, wynik do bufora i to wszystko. Tak z godzinka roboty. Możesz też szukać gotowych bibliotek, ale jaka jest ich jakość? Ja bibliotekom Arduino i to nie bez powodu, nie ufam. KAŻDĄ analizuję, poprawiam mnóstwo błędów i upraszczam. Taki banał jak klawiatura matrycowa, najlepiej zrobić samemu i to z wielu powodów. Przykłady znajdziesz praktycznie w każdej książce o programowaniu AVR w C.
 
Odpowiedź
#18
Jeśli chcesz mieć koniecznie 20 przycisków "luzem" to albo szukasz płytki z 20 wolnymi pinami (nawet MEGA2560 nie uzbierałaby tyle PCINT) albo używasz klawiatury matrycowej.
Do PCINT i do klawiatur (matrix) są gotowe biblioteki. Może nie najlepsze, ale mają kilka zalet - np. są, są darmowe i wystarczy nauczyć się ich obsługiwać. Wejdź do managera bibliotek, zainstaluj, pobaw się przykładami.
Problemem może być płytka Arduino 101, jest mało popularna, do zwykłych Arduino i tych zaimportowanych przez pasjonatów znajdziesz tysiące przykładów, do 101 będziesz się uczył na swoich błędach.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości