(24-08-2023, 20:17)kaczakat napisał(a): Bardziej precyzyjnie można mierzyć czas między impulsami, jeśli jest ich kilka/s, bo inaczej, by to miało sens, trzeba wydłużyć czas pomiarowy i czas reakcji mocno rośnie.
To jest właściwa uwaga - do pomiaru czasu pomiędzy impulsami można wykorzystać wejście (funkcję) timerów - ICP - czyli możliwość zapamiętania stanu licznika/timera w momencie zmiany stanu wejścia ICP. Wartość ta jest pamiętana w dedykowanym rejestrze (i tak tkwi - więc jest sporo czasu na reakcję) i dodatkowo zgłaszane może być przerwanie. Potrzeba jeden z timerów ustawić na pracę w maksymalnym zakresie w kółko i podłączyć sygnał z przepływomierza na jego wejście ICP. W przerwaniu odczytuje się rejestr ICP, odejmuje poprzednią wartość a aktualną zapamiętuje. Gdy impulsy mogą mieć przerwy dobrze jest zabezpieczyć się wprowadzając przerwania od przepełnienia licznika - będą odmierzały "kolejne cykle licznika" i ewentualnie obsługiwały braki impulsów. Trochę podobnie działa licznik od roweru lub odbiornik IR. Konkretne nastawy timera można obliczyć na podstawie tego, czego spodziewasz się na wejściu - jakich przepływów oczekujesz.
Z kolei przy sterowaniu wiatraka można zastosować histerezę - różne wartości progów dla włączania i wyłączania. Jest pewien zakres gdy "nic się zmienia, obojętnie czy wiatrak jest włączony czy nie.". W ten sposób unikniesz "szamotania" wiatrakiem, co zwykle szybko niszczy różne urządzenia.
Natomiast co do pokazanego pierwotnie kodu: jest tam błąd (przynajmniej ja taki zauważyłem):
- w jednej linii (uwaga do adminów - czy kody mogą mieć numerowanie linii) czyta się zmiennią flowCount: woda = flowCount;
- Potem coś tam jest wypisywane serialem (co trwa).
- Znowy trochę dalej jest sprawdzenie czasu i ewentualne zerowanie flowCount.
Tak na szybko należy zamienić miejscami czynności 2 i 1. A najlepiej byłoby wprowadzić symetrie - skoro w przerwaniu inkremetuje się, to w kodzie powinno się dekrementować. Ale to wymaga większych zmian.
I jeszcze drobiazg - nie należy wołać funkcji sprawdzających czas wielokrotnie w "jednym obiegu pętli" - wynik może się w międzyczasie zmienić. Przeczytać raz i skopiować już uzyskany wynik.