Dioda RGB płynna zmiana kolorów

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Dioda RGB płynna zmiana kolorów

Post autor: v-cu » 25 sty 2014, 23:46

Witam. Napisałem sobie kod w którym za pomocą potencjometru reguluję kolor diody RGB. Działa to super. Teraz do tego chciałbym dodać takie coś, że po wciśnięciu przycisku dioda sama zaczyna płynnie zmieniać kolory aż do ponownego wciśnięcia przycisku. Czyli będzie do wyboru, albo zmiana manualna potencjometrem albo automatyczna po wciśnięciu przycisku :)

kod:

Kod: Zaznacz cały

int redPin = 10;
int greenPin = 11;
int bluePin = 13;
int potPin = A0;
int val = 0;
int button = 2;

void setup()
{
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);
    pinMode(button, INPUT);

}

void loop()
{
    val = analogRead(potPin);
    if ( val <= 341 )
    {
        val = map(val, 0, 341, 0, 255);     
        analogWrite(redPin, val);
        analogWrite(greenPin, 255-val);
        analogWrite(bluePin, 255);
    }
    else if ( val <= 683 )
    {
        val = map(val, 341, 683, 0, 255);
        analogWrite(greenPin, val);
        analogWrite(bluePin, 255-val);
        analogWrite(redPin, 255);
    }

    else
    {
        val = map(val, 683, 1023, 0, 255);
        analogWrite(bluePin, val);
        analogWrite(redPin, 255-val);
        analogWrite(greenPin, 255);
    }
    delay(20);

/* if(digitalRead(2) == HIGH)
 {
   delay(20);
 
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    analogWrite(redPin, fadeValue);        
    delay(30);                            
  } 
  delay(500);
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
    analogWrite(greenPin, fadeValue);
    delay(30);
  }
  delay(500);
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    analogWrite(redPin, fadeValue);            
    delay(30);                            
  } 
  delay(500);
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
    analogWrite(bluePin, fadeValue);
    delay(30); 
  }
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    analogWrite(greenPin, fadeValue);            
    delay(30);
  }
   for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    analogWrite(bluePin, fadeValue);            
    delay(30);
  }
  delay(20); 
 }
*/
} 
Mam problem z przyciskiem , gdy kliknę przycisk to dioda sama zmieni kolor 3 razy a potem trzeba potencjometrem. Jak zrobić żeby migała sobie tak długo, dopóki nie kliknę drugi raz switcha?

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: Dioda RGB płynna zmiana kolorów

Post autor: Marhef » 26 sty 2014, 00:57

Za pomocą pętli while(). Tylko musisz odpowiednio dobrać warunek zakończenia jej wykonywania
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Dioda RGB płynna zmiana kolorów

Post autor: v-cu » 26 sty 2014, 22:04

Niezbyt mi to wychodzi;/ Jakoś tak ?
http://wklej.org/id/1251625/
Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: Dioda RGB płynna zmiana kolorów

Post autor: Marhef » 26 sty 2014, 22:58

Nie bardzo. W Twoim programie będzie się zmieniać samo dopóki masz wciśnięty przycisk.

Zrób tak, że przycisk podłączasz do pinu od przerwania. I w funkcji obsługi przerwania zwiększasz wartość zmiennej (np. "przycisk") o jeden.
I w pętli while() podajesz warunek zakończenia: while(przycisk<2)...

Będzie to wyglądało tak:
Na początku (przed setup()) dopisz volatile int przycisk = 0;
W sekcji setup():

Kod: Zaznacz cały

attachInterrupt(0,wcisniety,RISING)
I pod funkcją loop() (albo nad nią):

Kod: Zaznacz cały

void wcisniety(){
  przycisk = przycisk + 1;
  if (przycisk == 2) {przycisk = 0;}
}
A w tej linijce, gdzie masz while(digitalRead(2) == HIGH), zamiast tego wpisujesz:

Kod: Zaznacz cały

while(przycisk == 1)
Tylko jedna uwaga: zapoznaj się z czymś, co nazywa się po angielsku "debounce" (zapobieganie drgania styków przycisku). Bo może się okazać, że nacisnąłeś przycisk raz, a program wykrył kilka naciśnięć.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Dioda RGB płynna zmiana kolorów

Post autor: v-cu » 27 sty 2014, 11:58

Zrobiłem tak jak kazałeś.
http://wklej.org/id/1252063/

Zmiana kolorów potencjometrem działa, ale nie reaguje na przycisk, mogę klikać ile chcę i nic.
Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Dioda RGB płynna zmiana kolorów

Post autor: Malen » 27 sty 2014, 12:46

A zrób tak:

Zamiast

Kod: Zaznacz cały

void wcisniety(){
  przycisk = przycisk + 1;
  if (przycisk == 2) {przycisk = 0;}
}
Wpisz to:

Kod: Zaznacz cały

void wcisniety(){
  przycisk=~przycisk;
}
Zamiast

Kod: Zaznacz cały

volatile int przycisk = 2;
wpisz

Kod: Zaznacz cały

boolean przycisk=false;
'

i w zamiast

Kod: Zaznacz cały

 while(przycisk == 1) {
wpisz

Kod: Zaznacz cały

 while(przycisk==true) {
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Dioda RGB płynna zmiana kolorów

Post autor: v-cu » 27 sty 2014, 13:24

Nie reaguje w ogóle na przycisk.
http://wklej.org/id/1252142/
Tak sie zastanawiam i nie widzę żeby był on gdzieś teraz przypisany.
Coś typu:

Kod: Zaznacz cały

int przycisk = 2;
Próbowałem dodać ale nie wychodzi ;/
Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: Dioda RGB płynna zmiana kolorów

Post autor: Marhef » 27 sty 2014, 17:43

Zmień:
boolean przycisk=false; na volatile boolean przycisk=false; (musi być dodane volatile wg opisu funkcji attachInterrupt()).
I druga zmiana:
zamiast void wcisniety(){
przycisk=~przycisk;
}

ma być:
void wcisniety(){
przycisk=!przycisk;
}


I koniecznie zamień attachInterrupt(2,wcisniety,RISING); na attachInterrupt(0,wcisniety,RISING);.
I poczytaj o przerwaniach
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Dioda RGB płynna zmiana kolorów

Post autor: v-cu » 27 sty 2014, 20:54

OK przeczytałem to, i już kumam o co chodzi.

Tylko, że teraz dioda cały czas sama zmienia kolory. Nie reaguje na potencjometr ani przycisk :/.

http://wklej.org/id/1252780/

@[email protected]

Wszedłem na stronkę http://arduino.cc/en/Reference/AttachInterrupt i zobaczyłem że dla Leonardo trzeba by zmienić z

Kod: Zaznacz cały

attachInterrupt(0,wcisniety,RISING);
na

Kod: Zaznacz cały

attachInterrupt(1,wcisniety,RISING);
Teraz coś zaczęło się dziać. Najpierw reguluję sobie barwę potencjometrem. Potem klikam przycisk(nie zawsze zaskoczy i zrobi tylko jeden cykl), ale jak zaskoczy to dioda ciągle zmienia sobie sama kolory. Ale problem jest z wyłączeniem "trybu automatycznego" bo nie da się go wyłączyć ;/.

Chyba zrezygnuję z przycisku i w lampce będzie tylko regulacja barwy potkiem, bo tego sie chyba nie da zrobić tak jak ja chcę :P
Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: Dioda RGB płynna zmiana kolorów

Post autor: Marhef » 28 sty 2014, 19:42

Da się wyłączyć. Tylko, że wyłączy się dopiero po zakończeniu całego cyklu zmiany koloru (wg moich obliczeń ok. 11s od rozpoczęcia).
Nie zawsze zaskoczy, bo masz drgania styków w przycisku i wykrywa, jakbyś wcisnął kilkukrotnie.
ODPOWIEDZ

Strony partnerskie: