Arduino Polska Forum

Pełna wersja: Podtrzymanie stanu wysokiego
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć Wam Smile

Mam układ który po naciśnieciu przycisku ma mi rozjaśniać diodę do maksymalnej wartości i ma na maksie pozostać, po ponownym wciśnieciu przycisku ma się ściemnić do zera i na takiej wartości pozostać. Problem polega na tym że gdy wcisnę przycisk to dioda się rozjaśnia do maksimum i przeskakuje do zera aby ponownie się rozjaśnić (zapętla się), jeżeli nacisnę ponownie przycisk to dioda się ściemnia do zera ale po chwili znowu ma maksymalną wartość i powtarza ściemnienie i tak bez końca, a mi chodzi o podtrzymanie minimum lub maksimum zależnie od tego czy przycisk bistabilny jest wciśnięty czy nie.

Co mogę zrobić aby osiągnąć chciany efekt?
Dziękuje i pozdrawiam.
Kod:
int led = 9;           // do ktorego pinu pwm podlaczona jest dioda
int jasnosc = 0;    // wartosc poczatkowa jasnosci
int wypelnienie = 5;    // co ile punktow zwieksza sie wypelnienie
int swieci = 255;  //lampka swieci maksymalnym swiatlem
int stanPrzycisku = 0;

void setup() {
 // pin 9 diody jako wyjscie
 pinMode(led, OUTPUT);
 pinMode(2, INPUT_PULLUP);
}

void loop() {
 stanPrzycisku = digitalRead(2);
 
 if (stanPrzycisku == LOW) {  //jesli stan przycisku jest wysoki to

   analogWrite(led, jasnosc);   // wejscie pwm jest deklarowane na pin leda o okreslonej jasnosci rownej 0
 jasnosc = jasnosc + wypelnienie; //jasnosc jest zwiekszana o okreslona zmienna
 
}
 
else {       //jesli warunek nie jest spelniony to:
    analogWrite(led, jasnosc); // wejscie pwm deklarowane na pin led o jasnosci rownej 0
   jasnosc = jasnosc - wypelnienie; //zmniejszenie jasnosci o zadana zmienna
   }
 delay(100);  //odstep 100 ms aby byl widoczny efekt pwm    
}
Przerwij rozjaśnianie/ściemnianie gdy osiągniesz maksymalną/minimalna wartość świecenia. Co w tym trudnego?
Pozbądź się też tego delay. Czy istnieje na tym forum program bez delay?
Zrób też poprawny odczyt przycisku, bo teraz, program działa tylko dlatego, że ma delay.
Polecam kurs Arduino: https://forbot.pl/blog/kursy
A w samym Arduino znajdziesz mnóstwo przykładów DEMO do każdego elementu. Pamiętaj tylko, że to DEMO i wtedy używanie dalay jest OK, jak chcesz połączyć kilka szkiców w 1 program mający jakąś wartość użytkową, to należy się nauczyć jak zarządzać czasem w mikroprocku - millis, micros, timery.
Po co kurs?Wystarczy rzucić temat na kilkunastu forach i prawdopodobnie znajdzie się frajer, który napisze za free kod.
Czy tak nie jest prościej?
Po co tracić czas na naukę?
Nie lepiej w tym czasie pograć, pisać na FB lub posiedzieć w barze przy piwie ?

Ciekawi mnie,dlaczego zmienna "jasnosc" jest typu int? W ARM taka deklaracja ma czasem sens, bowiem najczęściej, operacja na liczbie 32bit wykonywane sa szybciej niż na 8 bit ale w AVT? Wystarcza bajt a deklarowana jest zmienna 2 bajtowa ze znakiem. Dziwne? Za dużo RAM jest w AVR?

Deklaracja "int led = 9;". Po co zmienna? Nie lepiej aby była to deklaracja stałej? Const albo przez define? Ale pewnie za dużo RAM w AVR. Deklarowanie pinów IO w postaci zmiennych,to kolejny, najczęstszy błąd po delay.

Dwie linijki kodu i już dwa błędy! Dalej
Kod:
int wypelnienie = 5;    // co ile punktow zwieksza sie wypelnienie
int swieci = 255;  //lampka swieci maksymalnym swiatlem
int stanPrzycisku = 0;
To samo, po co int? Może od razu float. Parę deklaracji i 2kB z UNO zniknie. O tym, ze "przyspiesza"to program, nie wspomnę. Właściwie, to "swieci " nie jest używane. Po co więc deklarować? Pięć linijek i sześć błędów! Chyba rekord?

Nr pinu w
Kod:
digitalRead(2);

powinien być zadeklarowany, oczywiście nie jako zmienna int.