• 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
Zmiana trybów świecenia pasek RGB.
#1
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ć?
 
Odpowiedź
#2
http://www.forbot.pl/forum/topics50/c-zm...vt6955.htm
 
Odpowiedź
#3
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.
 
Odpowiedź
#4
Poczytaj o millis().
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ź
#5
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() )?
 
Odpowiedź
#6
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;
}
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości