Skocz do zawartości

Płynne włączanie i wyłączanie diody


Pomocna odpowiedź

Napisano

Witam, 
 robię kurs Arduino poziom 1. 
W trakcie kursu jest zadanie, żeby zapalić płynnie diodę wykorzystując PWM.  
Moje pytanie to jak zmodyfikować kod tak, żeby móc ją płynnie zgasić potem znowu zapalić i tak w kółko. 
 

Kod.png

18 minut temu, Patryk9111 napisał:

Moje pytanie to jak zmodyfikować kod tak, żeby móc ją płynnie zgasić potem znowu zapalić i tak w kółko. 

Aa sorki tobie chodzi o to żeby w ogóle w takim cyklu się to działo. No skoro jest kurs to dobrze by było pogłówkować nad tym samemu. Ja widzę pewien potencjał w zmiennej "zmiana". hmm a co gdyby miała minusową wartość.. 

  • Pomogłeś! 1
31 minut temu, Patryk9111 napisał:

Moje pytanie to jak zmodyfikować kod tak, żeby móc ją płynnie zgasić potem znowu zapalić i tak w kółko. 

Do tego celu idealnie nadaje się pętla for()...w pierwszej pętli rozjasniasz Leda, wychodzisz i wchodzisz w drugą pętlę która ma za zadanie ściemniać Leda...rozwiązanie dobre lecz trochę blokujące pozostały kod, ale na początku tak kombinuj żeby zrozumieć pętle...

  • Pomogłeś! 1
(edytowany)

A moim zdaniem, najlepiej nadaje się pętla while(). Nie trzeba więcej zmiennych. 🤗😛
 

//Nr. pinu LED
const uint8_t LEDpin = 10;
//Stan początkowy
uint8_t LEDPWM = 0;

void setup()
{
  pinMode(LEDpin, OUTPUT);
}

void loop()
{
  //Wykonuj, dopóki zmienna będzie mniejsza od 255
  while (LEDPWM < 255) {
	analogWrite(LEDpin, LEDPWM++);
	delay(50);
  }
  //Wykonuj, dopóki zmienna będzie większa od 0
  while (LEDPWM > 0) {
	analogWrite(LEDpin, LEDPWM--);
	delay(50);
  }
}


Wersja z krokiem zmiany:

//Nr. pinu LED
const uint8_t LEDpin = 10;
//Stan początkowy
uint8_t LEDPWM = 0;
//Krok zmiany
const uint8_t PWMstep = 5;

void setup()
{
  pinMode(LEDpin, OUTPUT);
}

void loop()
{
  //Wykonuj, dopóki zmienna będzie mniejsza od 255
  while (LEDPWM < 255) {
	analogWrite(LEDpin, LEDPWM+=PWMstep);
	delay(50);
  }
  //Wykonuj, dopóki zmienna będzie większa od 0
  while (LEDPWM > 0) {
	analogWrite(LEDpin, LEDPWM-=PWMstep);
	delay(50);
  }
}

 

Edytowano przez KatzePL
Dodano wersję z krokiem zmiany.

No to jeśli jedziemy z gotowcami 😉

    
int8_t skladnik = 1;
int licznik = 1;

while(1)
{
licznik+=skladnik;
  if(licznik >= 255){
         skladnik=-5;
     }else if(0 == licznik)skladnik = 5;
  
}

 

6 minut temu, _LM_ napisał:

No to jeśli jedziemy z gotowcami 😉

Niech będzie. Ja tylko poprawię. 🤭😺
 

int8_t skladnik = 5;
uint8_t licznik = 0;

while(1)
{
  licznik+=skladnik;
  if(licznik >= 255) skladnik=-5;
  else if(licznik <= 0) skladnik = 5;
}

 

  • Lubię! 1
(edytowany)

jak już poprawiasz to miałeś dać 

 if(licznik > 254) skladnik=-5;

lub

 if(licznik == 255) skladnik=-5;

🙂
Tak samo 

licznik < 0

też jest błędne w tym kontekście

Edytowano przez _LM_
(edytowany)
6 minut temu, _LM_ napisał:

jak już poprawiasz to miałeś dać 

 if(licznik >= 254) skladnik=-5;

A czemu? 🙂 unsigned int 8 bitowy ma 256 wartości. Od 0 do 255.
Drugie jest bardziej przekonujące. 🙂

6 minut temu, _LM_ napisał:
 if(licznik == 255) skladnik=-5;

 

int8_t skladnik = 5;
uint8_t licznik = 0;

while(1)
{
  licznik+=skladnik;
  ustawpwm(licznik);
  if(licznik == 255) skladnik=-5;
  else if(licznik == 0) skladnik = 5;
}

 

Edytowano przez KatzePL
2 minuty temu, KatzePL napisał:

Drugie jest bardziej przekonujące. 🙂

ale nadal podatne na błędy, co jak składnik będzie miał więcej niż 5?

1 minutę temu, _LM_ napisał:

ale nadal podatne na błędy, co jak składnik będzie miał więcej niż 5?

Oj, przekręci się! 😺

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...