Witam, mam pewien problem w odniesieniu do tego zadania z artykułu
Zadanie domowe 9.1
Napisz funkcję, która sprawia, że dioda będzie pulsować (stopniowe przygaszanie i rozjaśnianie). Skorzystaj oczywiście z wiadomości zdobytych podczas lekcji o sygnale PWM.
chciałem to trochę rozbudować o funkcje stopniowego przygaszania i rozjaśniana po wciśnięci guzika i napisałem program:
int pwm;
int zmiana = 5;
void setup() {
pinMode(5, INPUT_PULLUP); // przypisanie pinu 5 na guzik
pinMode(11, OUTPUT); //wyście LED
}
void loop() {
delay(100);
if(digitalRead(5) == LOW){ //jeżeli przycisne guzik zostanie wywołana funkcja
funkcjaLED();
}
}
void funkcjaLED(){
analogWrite(11,pwm); //przypisanie wwjscia sygnalu pwm
pwm += zmiana;
delay(10);
if(pwm == 255 || pwm ==0){
zmiana = 0-zmiana; //zmiana znaku na przeciwny jezeli osiagnie próg 0 lub 255
}
}
kod ten nie działa, bo dioda przygasza się i rozbłyska tylko gdy trzymam guzik, więc go przerobiłem i rozbudowałem o potencjometr który reguluje ilość błyśnięć:
int pwm;
int zmiana = 5;
int q;
void setup() {
pinMode(5, INPUT_PULLUP); // przypisanie pinu 5 na guzik
pinMode(11, OUTPUT); //wyście LED
}
void loop() {
int ilosc = analogRead(A0); //odczytanie wartosci z potencjometru
int ile =map(ilosc,0,1023,1,10); //podzielenie wartosc z potencjometru na 10 rozjasnien
delay(200);
digitalWrite(11, LOW); //wylaczenie diody po skonczonym obiegu, bo inaczej by sie ciagle żarzyła
if(digitalRead(5) == LOW){ //po nacisnieciu guzika...
ulepsz(ile); //okresla "ile" razy sygnal pwm ma powodowac rozjasnienie z odczytanej i zmapowanej wartosci potencjometru
}
}
void ulepsz(int ile){
q= 2*ile; //okreslenie ilosci blysniec x2 bo za kazdym przejscie przez 0 i 255 daje 1, więc przy 10 byłoby 5 gdyby nie x2
while(q != 0){ //zatrzymanie w pętli while
funkcjaLED();
}
}
void funkcjaLED(){
analogWrite(11,pwm); //przypisanie wwjscia sygnalu pwm
pwm += zmiana;
delay(10);
if(pwm == 255 || pwm ==0){
zmiana = 0-zmiana; //zmiana znaku na przeciwny jezeli osiagnie próg 0 lub 255
q--; //odjęcie
}
}
Ten kod działa wyśmienicie ale czy da się ten kod uprościć?
Zastanawia mnie fakt dlaczego w pierwszym kodzie dioda mruga tylko wtedy gdy trzymam guzik. Dla "for" kod mi nie działał, dopiero gdy zatrzymałem w while działa.
Moje ostatnie pytanie dlaczego jak pwm jest na 0 dioda ciągle się "żarzy" i nie wygasza, gdy pętla się skończy, muszę ją zawsze po pętli wyłączyć?
Dziękuje z góry za odpowiedzi mnie nękające 🙂