logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kod sterowania roletami na Blynk'u - błąd w odliczaniu czasu i stopnia przysłonięcia

cherry34 02 Sie 2021 11:11 450 0
  • #1 19545996
    cherry34
    Poziom 13  
    Posty: 269
    Pomógł: 1
    Ocena: 17
    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:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    obecnie przed setupem przekazuję wartość "true" do loopa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a w loopie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    2. Zmieniłem sposób naliczania czasu działania:
    Było:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jest:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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++
    Zaloguj się, aby zobaczyć kod
REKLAMA