• 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
Podtrzymanie stanu wysokiego
#1
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    
}
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
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.
 
Odpowiedź
#4
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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości