25-11-2019, 19:04
Póki co walczę ze stanami prawda i fałsz, trochę przerobiłem kod timera, prawie udaje mi się osiągnąć to co chciałem, no właśnie prawie. Załóżmy że Godzina ON to 10:00 a godzina OFF to godzina 20:00, mam aktualnie godzinę 15:00 czyli mieszczę się w przedziale. W tej sytuacji mogę bez problemu zapalać i gasić lampkę przyciskami. Wystarczy że aktualny czas przekroczy godzinę 20:00 i już lampka się sama nie wyłączy bo podczas jej pracy ją wyłączyłem przyciskiem czyli ustawiłem stan na false a potem włączyłem i ustawiłem stan na true. Właśnie te ponowne włączenie przyciskiem spowodowało to że program ignoruje już godzinę wyłączenia a jako priorytet traktuje stan true podyktowany przez naciśnięcie przycisku. Tego właśnie nie mogę obejść. Jeżeli rozwiązałbym problem w przypadku gdzie mieszczę się z aktualną godziną w przedziale włączenia i wyłączenia to pozostaje jeszcze przypadek gdzie aktualny czas jest już poza zakresem przedziału działania lampki oraz przypadek gdzie czas włączenia jest większy od czasu wyłączenia.
Niestety nie dam rady zrobić jak polecił mi kolega Semi, mogę spróbować metodą kolegi Agregacika. Tak czy inaczej, bardzo dziękuję Wam za odpowiedzi do mojego posta.
Aktualnie przerobiony kod timera z problemem opisanym wyżej to:
boolean timer(int tPin, byte hOn, byte mOn, byte sOn, byte hOff, byte mOff, byte sOff) {
long czWL = (long(hOn) * 3600) + (long(mOn) * 60) + long(sOn);
long czWYL = (long(hOff) * 3600) + (long(mOff) * 60) + long(sOff);
boolean Stan = false;
if (zmierzch == true) {
Stan = false;
}
if (swit == true) {
Stan = true;
}
// Przypadek gdzie czas wlaczenia jest mniejszy od wylaczenia ale aktualny czas miesci sie w tym przedziale
if (czWL < czWYL) {
if (AktualnyCzas >= czWL && AktualnyCzas < czWYL) {
Stan = true;
if (zmierzch == true) {
Stan = false;
}
if (zmierzch == false) {
Stan = true;
}
if (swit == true) {
Stan = true;
}
}
}
//przypadek gdzie czas wlaczenia jest mniejszy od wylaczenia ale aktualny cza jest juz poza zakresem wlaczenia i wylaczenia
if (czWL < czWYL) {
if (AktualnyCzas >= czWL && AktualnyCzas >= czWYL) {
Stan = false;
if(swit == true){
Stan = true;
}
if(zmierzch == true){
Stan = false;
}
}
}
if (czWL > czWYL) {
if (AktualnyCzas >= czWL && AktualnyCzas <= 86399) {
Stan = true;
if (zmierzch == true) {
Stan = false;
} else {
Stan = true;
}
}
if (AktualnyCzas >= 0 && AktualnyCzas < czWYL) {
Stan = true;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (Stan == true) {
analogWrite(led, jasnosc); // wejscie pwm jest deklarowane na pin leda o okreslonej jasnosci rownej 0
jasnosc += wypelnienie;
if (jasnosc > 255) //jesli jest powyzej 255, to ustalamy spowrotem 255
jasnosc = 255;
}
if (Stan == false) {
analogWrite(led, jasnosc); // wejscie pwm deklarowane na pin led o jasnosci rownej 0
jasnosc -= wypelnienie;
if (jasnosc < 0) //jesli spadlo nam ponizej zera, to wracamy na wartosc 0.
jasnosc = 0;
}
}
Niestety nie dam rady zrobić jak polecił mi kolega Semi, mogę spróbować metodą kolegi Agregacika. Tak czy inaczej, bardzo dziękuję Wam za odpowiedzi do mojego posta.
Aktualnie przerobiony kod timera z problemem opisanym wyżej to:
boolean timer(int tPin, byte hOn, byte mOn, byte sOn, byte hOff, byte mOff, byte sOff) {
long czWL = (long(hOn) * 3600) + (long(mOn) * 60) + long(sOn);
long czWYL = (long(hOff) * 3600) + (long(mOff) * 60) + long(sOff);
boolean Stan = false;
if (zmierzch == true) {
Stan = false;
}
if (swit == true) {
Stan = true;
}
// Przypadek gdzie czas wlaczenia jest mniejszy od wylaczenia ale aktualny czas miesci sie w tym przedziale
if (czWL < czWYL) {
if (AktualnyCzas >= czWL && AktualnyCzas < czWYL) {
Stan = true;
if (zmierzch == true) {
Stan = false;
}
if (zmierzch == false) {
Stan = true;
}
if (swit == true) {
Stan = true;
}
}
}
//przypadek gdzie czas wlaczenia jest mniejszy od wylaczenia ale aktualny cza jest juz poza zakresem wlaczenia i wylaczenia
if (czWL < czWYL) {
if (AktualnyCzas >= czWL && AktualnyCzas >= czWYL) {
Stan = false;
if(swit == true){
Stan = true;
}
if(zmierzch == true){
Stan = false;
}
}
}
if (czWL > czWYL) {
if (AktualnyCzas >= czWL && AktualnyCzas <= 86399) {
Stan = true;
if (zmierzch == true) {
Stan = false;
} else {
Stan = true;
}
}
if (AktualnyCzas >= 0 && AktualnyCzas < czWYL) {
Stan = true;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (Stan == true) {
analogWrite(led, jasnosc); // wejscie pwm jest deklarowane na pin leda o okreslonej jasnosci rownej 0
jasnosc += wypelnienie;
if (jasnosc > 255) //jesli jest powyzej 255, to ustalamy spowrotem 255
jasnosc = 255;
}
if (Stan == false) {
analogWrite(led, jasnosc); // wejscie pwm deklarowane na pin led o jasnosci rownej 0
jasnosc -= wypelnienie;
if (jasnosc < 0) //jesli spadlo nam ponizej zera, to wracamy na wartosc 0.
jasnosc = 0;
}
}