Skocz do zawartości

Proporcja czasu stanów LOW i HIGH na czujniku krańcowym


Wrona

Pomocna odpowiedź

Czekając na kolejną część kursu Arduino kombinuje różne różności (oczywiście na poziomie swych umiejętności czyli jeszcze na niskim).

Wymyśliłem sobie takie coś ... na pinie cyfrowym mam czujnik krańcowy, może być dowolny byleby dawał stan wysoki i niski. Załóżmy że będzie to czujnik zamontowany w drzwiach wskazujący czy są otwarte czy zamknięte. Program będzie wykonywał inne czynności ale co jakiś czas pętla wróci do czujnika tych drzwi i będzie miała za zdanie przez kilka minut monitorować ten czujnik by na koniec podać proporcje czasu stanu wysokiego i niskiego. Przykładowo 1 (100%) to drzwi cały czas otwarte a 0 (0%) to drzwi cały czas zamknięte.

Wyniki będą więc od 0% do 100%.

Jak szanowni koledzy by się do tego zabrali? bo mi jeszcze brakuje swobody w temacie.

Link do komentarza
Share on other sites

Wrona, najwygodniej byłoby co pewien czas (zawsze taki sam) sprawdzać stan drzwi i zapisywać go w zmiennej. Jeśli "1" będzie oznaczało drzwi otwarte, a "0" będzie oznaczało drzwi zamknięte, to można liczyć "ile razy" drzwi były w stanie otwartym, a na końcu policzyć wartość procentową z całego działania programu. Np. tak:

if (Czy drzwi są otwarte?) {
drzwiOtwarte++;
}
ileRazySprawdzono++;

Procentowy czas, gdy drzwi były otwarte będzie wtedy wyglądał tak:

drzwiOtwarte / ileRazySprawdzono * 100%
  • Lubię! 1
Link do komentarza
Share on other sites

Dobre ... pomyśle nad tym. Dałbym pomiar co pół sekundy i stałoby się to uniwersalne dla każdego czujnika krańcowego. Dodałbym kod by działanie to wykonywało się 600 razy i miałbym 5 minutowy pomiar.

Dzięki wielkie.

[ Dodano: 19-02-2017, 19:10 ]

Wykorzystałem pomysł i działa .... prawie

Na serial monitorze odczytuje pięknie ilość otwarć drzwi i ilość pomiarów ale dzielenia już nie jest poprawne. Jeśli jest 10 na 10 to mam wynik 100% ale jeśli jest 9/10 lub mniej to wynik zawsze jest 0. O czym zapomniałem albo co bardziej prawdopodobne o czym nie wiem?

Link do komentarza
Share on other sites

Jakiego typu zmienne uzywasz?

Jak robisz np. 9/10*100 w domyślnie procent to masz 9/10=0.9 , ale jak uzywasz liczb całkowytych typu int to daje to 0, więc 0*100 = nadal 0...

Masz dwa rozwiązania:

1. Użyj typu float (ciężkie dla mikrokontrolera)

2. Rób to na PC z typem float itd.

3. Zmień kolejność obliczeń na iloscwykryc * 100 / ilerazysprawdzono , ale pamiętaj, że zmienna musi być wstanie przyjąć liczbę iloscwykryc * 100 , czyli jak masz unsigned int z maksymalna wartoscia 32tyś z groszem to maksymalnie mozesz robic w jednej serii ok.320 pomiarow, bo 320*100=32tyś...

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bo w dziedzinie liczb całkowitych 9/10=0 🙁

Zmień kolejność obliczeń:

(100 * drzwiOtwarte) / ileRazySprawdzono

Musisz też uważać, by nie przekraczać zakresów. Dla liczb 16-bitowych wynik pierwszego mnożenia będzie poprawny jedynie dla drzwiOtwarte<=655. Jeżeli więc chcesz sprawdzać co pół sekundy, czas pomiaru nie może być dłuższy niż 327 sekund. Na szczęście 5 minut w tym się mieści 🙂 W przypadku dłuższych okresów musisz przejść na zmienne typu uint32_t lub float.

Metoda trekera jest prosta, ale dostarcza wyników bardzo rzadko. Gdybyś chciał mieć raporty na bieżąco, np. za ostatnie 10 minut, to załóż tablicę przechowującą całą historię pomiarów, np. ostatnie 10 minut czyli 600 wyników. Wrzucaj do niej najnowszy pomiar jednocześnie usuwając najstarszy. Mając taką kroczącą "bazę danych" możesz np. co sekundę aktualizować swój wynik i zawsze będzie on obejmował całą zgromadzoną historię 🙂

Możesz zrobić jeszcze inaczej: pamiętać dokładne czasy otwarcia i zamknięcia. Wymaga to więcej liczenia żeby otrzymać wynik, ale nie potrzebuje tyle pamięci i mógłbyś trzymać historię np. ostatnich 100 otwarć lub ograniczyć to do czasu i te otwarcia, które "wypadają" z okienka czasowego - zapominać.

EDIT: Pisaliśmy razem 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Super dzięki. Problem był przy "int" i przy float" ale teraz dzięki wam znam powód i go wyeliminowałem. Znów palnąłem się w czoło gdy przeczytałem wasze odpowiedzi. Od czasu gdy zainteresowałem się Arduino i C++ mam tak prawie codziennie. Może kiedyś się ogarnę 🙂

Dzięki za pomoc.

Link do komentarza
Share on other sites

Wszystko działa doskonale więc czas rozwinąć projekt. Interesuje mnie bezprzewodowe wysyłanie danych do pliku tekstowego. Poczytałem i rozwiązań jest dostępnych chyba sporo ale mnie przytłoczyły. Na tą chwilę Arduino wysyła dane co minutę do laptopa przez USB. Dane przechwytuje program CoolTerm i mam zapisane dane w pliku tekstowym. Mój pomysł jest taki zamiast kabla USB wpiąć do Arduino nadajnik WiFi i wysyłać dane do routera do którego podpięty będzie laptop. Czyli marzy mi się proste rozwiązanie w którym zastępuje kabel USB nadajnikiem i odbiornikiem WiFi. To dobry pomysł czy można to zrobić prościej innym rozwiązanem które jedynie wydaje mi się zbyt skomplikowane. Nadajnik z Arduino musi być zasilany bateryjnie/akumulatorowo a router i laptop to już normalnie z sieci elektrycznej.

Link do komentarza
Share on other sites

To dobry pomysł czy można to zrobić prościej innym rozwiązanem które jedynie wydaje mi się zbyt skomplikowane.
Można, przez BF chyba, że zależy ci na zasięgu.

Co do tego zliczania procentowego to chyba nie jest ostateczne rozwiązanie tylko takie ćwiczenie? Po mojemu nie ma zbyt wielkiego sensu. Jeśli chcesz monitorować stan drzwi to po pierwsze lepiej do tego użyć przerwań - zapewne koledzy chętnie ci wytłumaczą jak. po drugie lepiej by było wykorzystać do tego jakiś układ RTC albo samemu coś napisać do timera i będziesz miał dzięki temu niezależny moduł monitorujący z możliwością zapisu nie tylko informacji o zdarzeniu ale również dokładnej daty i godziny zdarzenia i co najważniejsze nie blokujący procesora. A co do dzielenia to polecam poczytać coś o programowaniu w języku c. Napiszę tylko, że problem z dzieleniem jaki miałeś można w tym wypadku rozwiązać za pomocą jednego operatora ale nie chce się wymądrzać więc nie napiszę jakiego. Mądrzejsi ode mnie zapewne chętnie ci pomogą w kilku prostych zdaniach 🙂

Link do komentarza
Share on other sites

Można, przez BF chyba, że zależy ci na zasięgu.

Co to BF? Zasięg im większy tym lepszy, ale nawet 20 czy 30 metrów by mnie zadowoliło jeśli dzięki temu komunikacja byłaby prosta do ogarnięcia nawet dla mnie.

Co do tego zliczania procentowego to chyba nie jest ostateczne rozwiązanie tylko takie ćwiczenie? Po mojemu nie ma zbyt wielkiego sensu. Jeśli chcesz monitorować stan drzwi to po pierwsze lepiej do tego użyć przerwań - zapewne koledzy chętnie ci wytłumaczą jak. po drugie lepiej by było wykorzystać do tego jakiś układ RTC albo samemu coś napisać do timera i będziesz miał dzięki temu niezależny moduł monitorujący z możliwością zapisu nie tylko informacji o zdarzeniu ale również dokładnej daty i godziny zdarzenia i co najważniejsze nie blokujący procesora.

Znam przerwanie na tyle na ile wykorzystuje je do przerwania minitoringu drzwi na rzecz czujnika alarmowego. Natomiast napisz proszę dlaczego zliczenie procentowe jest bez sensu? Celem jest uzyskanie odpowiedzi na pytanie "przez jaki czas w ciągu godziny drzwi są otwarte?" Czyli jeśli monitorujemy drzwi przez godzinę to interesuje mnie jaki czas drzwi były otwarte i wychodzi mi np. 50% albo 37, albo 84%. Dlaczego to bez sensu?

Co do zegara to w przyszłości planuje się nim zająć i miałby on na celu podawać czas rozpoczęcia i zakończenia pomiaru. Z tego co piszesz rozumiem że można cały ten pomiar zlecić zegarowi a Arduino zajmie się czymś innym? Tylko w sumie wtedy nie będzie miało co robić 😉 ale oczywiście jeśli skusisz się na przedstawienie swojego pomysłu to jestem zainteresowany.

A co do dzielenia to polecam poczytać coś o programowaniu w języku c. Napiszę tylko, że problem z dzieleniem jaki miałeś można w tym wypadku rozwiązać za pomocą jednego operatora ale nie chce się wymądrzać więc nie napiszę jakiego. Mądrzejsi ode mnie zapewne chętnie ci pomogą w kilku prostych zdaniach 🙂

Napisz. Tym właśnie różni się dzielenie wiedzą od przemądrzania się. Pisząc że coś wiesz ale nie powiesz właśnie się przemądrzasz. Ale piszesz też, że chcesz wymądrzania uniknąć, więc skoro masz do przekazania mi (kompletnemu laikowi) coś co dla Ciebie jest banalnie proste, to zrób to, by nie czuć że się wymądrzasz a nic z tego nie wynika.

Wyciągam do Ciebie pomocną rękę. Ty mnie podszkolisz z programowania a ja pozwolę Ci uniknąć kompleksu wymądrzania 🙂

Link do komentarza
Share on other sites

Za bardzo się przejąłeś moją wypowiedzią. Wybacz przyjacielu, ale stałeś się nieświadomą ofiarą pewnych "nieporozumień" mających miejsce na tym forum i przykro mi z tego powodu. Mimo, że chciałbym Ci pomóc najlepiej jak potrafię to niestety nie podam Ci gotowca na talerzu. Rozumiem, że skoro takie rozwiązanie Ci wystarcza to ok, możesz nie przejmować się moim postem.

Napisz. Tym właśnie różni się dzielenie wiedzą od przemądrzania się. Pisząc że coś wiesz ale nie powiesz właśnie się przemądrzasz.
Pod h.. to my a nie nas 😃 Polecam poczytać o operatorach chociaż na wikipedii, nie ma ich tam dużo więc szybko połapiesz który może się nadać a przynajmniej tak myślę. Na wikipedii jest również kompletny kurs programowania w c więc korzystaj do woli i pozwól mi hodować moje kompleksy w spokoju 🤣

edit: rzecz jasna miało być BT czyli blue tootch

Link do komentarza
Share on other sites

buchbuch, napisz jakie rozwiązanie masz na myśli zamiast roztaczać jakieś dziwne tajemnice. Sam jestem ciekaw co miałeś na myśli.

A co do reszty wypowiedzi, to nawet wykropkowany wulgaryzm był tutaj zupełnie niepotrzebny. Nikt Cię nie obrażał, więc chyba nie masz powodu "rzucać mięsem". Poza tym sprawdź w słowniku co chciałeś wykropkować, bo raczej powinno być ch..., więc nie dość że niepotrzebnie przeklinasz to jeszcze z błędami ortograficznymi.

Link do komentarza
Share on other sites

Elvis, gdybyś nie był w błędzie to bym zapadł chyba na schizofremię (czy coś tam) myśląc, że czytasz mi w myślach. To nie był "wykropkowany wulgaryzm" i w zasadzie być może niesłusznie to wykropkowałem.

Nie ma w tym przypadku zbyt wielu opcji więc żadna to tajemnica jak odzyskać resztę z dzielenia nie używając typów zmiennoprzecinkowych. Co do reszty "pomysłu" to zdaje się nieistotne skoro koledze Wrona, wystarcza takie najprostsze rozwiązanie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.