Witam.
Parę lat temu "spłodziłem" poniższy kod do sterowania roletami. W puszkach przy oknach mam klasyczne wyłączniki oraz po dwa przekaźniki w każdej. Od puszek - na etapie budowy - poprowadziłem skrętki do centralki gdzie wszystkimi steruje arduino.
Wszystko działało prawie dobrze, ale coś musiałem poprawić oraz dodać i chyba coś przy okazji zepsułem. Obecnie mam problem z poprawnym odliczaniem czasu działania kolejnych przekaźników, a co za tym idzie - stopnia przysłonięcia. Na domiar złego, po odpaleniu zamykania/otwierania wszystkich rolet - te działają chyba z 10 razy dłużej niż zadeklarowano.
Na końcu postu cały kod, ale spróbuję wyłuszczyć co ostatnio zmieniałem, i gdzie podejrzewam, że jest błąd.
1. Zmieniłem zasadę podnoszenia/opuszczania wszytkich rolet na raz.
Wcześniej było wywoływane to przed setupem:
obecnie przed setupem przekazuję wartość "true" do loopa:
a w loopie:
2. Zmieniłem sposób naliczania czasu działania:
Było:
jest:
Teraz patrzę, że nic nie zmieniłem, ale znalazłem błąd, iż poprzednio wartość SuwakPrzyslonieciaPoprzedni[j] nie była przekazana do tego ifa, więc przy wejściu do ifa jego wartość była zawsze mniejsza niż aktualny millis() i warunek był spełniony.
I to tyle. Po analizie przy użyciu serial monitora wychodzi mi, że czas po lewej stronie od ">" w powyższym ifie jest dużo większy niż po prawej (czasami dziesięciokrotnie albo lepiej). No i do tego ifa wchodzi tylko raz na każdą roletę - czyli nie sprawdza co kilka milisekund, ale co kilkaset. Dodatkowo odpalanie kolejnych rolet wydłuża czas po lewej od ">".
Może ktoś z Was szybko wyłapie, gdzie jest błąd?
Poniżej pełen kod.
Parę lat temu "spłodziłem" poniższy kod do sterowania roletami. W puszkach przy oknach mam klasyczne wyłączniki oraz po dwa przekaźniki w każdej. Od puszek - na etapie budowy - poprowadziłem skrętki do centralki gdzie wszystkimi steruje arduino.
Wszystko działało prawie dobrze, ale coś musiałem poprawić oraz dodać i chyba coś przy okazji zepsułem. Obecnie mam problem z poprawnym odliczaniem czasu działania kolejnych przekaźników, a co za tym idzie - stopnia przysłonięcia. Na domiar złego, po odpaleniu zamykania/otwierania wszystkich rolet - te działają chyba z 10 razy dłużej niż zadeklarowano.
Na końcu postu cały kod, ale spróbuję wyłuszczyć co ostatnio zmieniałem, i gdzie podejrzewam, że jest błąd.
1. Zmieniłem zasadę podnoszenia/opuszczania wszytkich rolet na raz.
Wcześniej było wywoływane to przed setupem:
Kod: C / C++
obecnie przed setupem przekazuję wartość "true" do loopa:
Kod: C / C++
a w loopie:
Kod: C / C++
2. Zmieniłem sposób naliczania czasu działania:
Było:
Kod: C / C++
jest:
Kod: C / C++
Teraz patrzę, że nic nie zmieniłem, ale znalazłem błąd, iż poprzednio wartość SuwakPrzyslonieciaPoprzedni[j] nie była przekazana do tego ifa, więc przy wejściu do ifa jego wartość była zawsze mniejsza niż aktualny millis() i warunek był spełniony.
I to tyle. Po analizie przy użyciu serial monitora wychodzi mi, że czas po lewej stronie od ">" w powyższym ifie jest dużo większy niż po prawej (czasami dziesięciokrotnie albo lepiej). No i do tego ifa wchodzi tylko raz na każdą roletę - czyli nie sprawdza co kilka milisekund, ale co kilkaset. Dodatkowo odpalanie kolejnych rolet wydłuża czas po lewej od ">".
Może ktoś z Was szybko wyłapie, gdzie jest błąd?
Poniżej pełen kod.
Kod: C / C++