Arduino Polska Forum
Zmiana trybów świecenia pasek RGB. - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Zmiana trybów świecenia pasek RGB. (/watek-zmiana-tryb%C3%B3w-%C5%9Bwiecenia-pasek-rgb)



Zmiana trybów świecenia pasek RGB. - hendrix_radek - 07-12-2016

Witam,
chciałbym stworzyć projekt, w którym będę mógł przyciskiem zmienić sposób świecenia diod.
Samo przełączanie między kolorami jest proste, ale gdy przechodzę do trybu fading nie wiem jak jednocześnie zmieniać wartości w PWM i sprawdzać czy przycisk został naciśnięty aby zmienić tryb. Czy muszę już tutaj wielowątkowość jakąś zastosować?


RE: Zmiana trybów świecenia pasek RGB. - Automatyk - 07-12-2016

http://www.forbot.pl/forum/topics50/c-zmiana-dzialania-programu-jednym-przyciskiem-vt6955.htm


RE: Zmiana trybów świecenia pasek RGB. - hendrix_radek - 07-12-2016

Nie o to mi chodzi.
Jeśli przejdę w tryb w którym w pętlach są z delayem zwiększane wartości PWM nie mogę sprawdzać w tej samej chwili czy przypadkiem nie został wciśnięty przycisk i nie zmienił się numer który ustawia jaki kawałek kodu ma pracować.
Chodzi mi o coś takiego jak nawet w lampkach choinkowych jest: wciskam przycisk, lampki migają, wciskam ponownie i powoli się rozjaśniają, potem gaszą. Wciskam znowu i świecą tylko na czerwono itp itd.


RE: Zmiana trybów świecenia pasek RGB. - namok - 07-12-2016

Poczytaj o millis().


RE: Zmiana trybów świecenia pasek RGB. - hendrix_radek - 09-12-2016

A nie można by tego załatwić przerwaniem, które odpalałoby funkcję która inkrementuję globalną zmienną, która steruje drugą funkcją zmieniającą tryb (wszystko napisane poza loop() )?


RE: Zmiana trybów świecenia pasek RGB. - JasQ - 09-12-2016

Możesz przy użyciu przerwania jak i możesz zrobić pętlę z millis() a nie delay i w samej pętli odwołanie do podprogramu sprawdzania stanu przycisku co sam często stosuję .

na przykład
Kod:
long pm;
byte status_przycisk = 0;

void setup() {

  Serial.begin(9600);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(2, INPUT_PULLUP);
}

void loop() {

przycisk();

}

void dioda1(){

for (int x=0; x<255 ; x=x){
  przycisk();
  long cm = millis();
  if (cm - pm > 10){x=x+1;pm=cm;}
  analogWrite(10,x);
  if (x==255)dioda1();
   }
}

void dioda2(){

for (int y=0; y<255 ; y=y){
  przycisk();
  long cm = millis();
  if (cm - pm > 10){y=y+1;pm=cm;}
  analogWrite(11,y);
  if (y==255)dioda2();
   }
}

void dioda3(){

  for (int z=0; z<255 ; z=z){
  przycisk();
  long cm = millis();
  if (cm - pm > 10){z=z+1;pm=cm;}
  analogWrite(9,z);
  if (z==255)dioda3();
   }
}
  
void dioda4(){

  przycisk();
  analogWrite(9,0);
  analogWrite(10,0);
  analogWrite(11,0);
  dioda4();
  
}

void przycisk(){

if (digitalRead(2) == LOW){
  status_przycisk=status_przycisk+1;
  Serial.println(status_przycisk);
  delay(500);
  if ( status_przycisk == 1 )dioda1();
  if ( status_przycisk == 2 )dioda2();
  if ( status_przycisk == 3 )dioda3();
  if ( status_przycisk == 4 )dioda4();
  if ( status_przycisk > 8 )status_przycisk = 0;
}
}