Wrona Napisano Luty 17, 2017 Udostępnij Napisano Luty 17, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 19, 2017 Udostępnij Luty 19, 2017 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% 1 Cytuj Link do komentarza Share on other sites More sharing options...
Wrona Luty 19, 2017 Autor tematu Udostępnij Luty 19, 2017 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? Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Luty 19, 2017 Udostępnij Luty 19, 2017 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ś... 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
marek1707 Luty 19, 2017 Udostępnij Luty 19, 2017 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 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Wrona Luty 19, 2017 Autor tematu Udostępnij Luty 19, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 20, 2017 Udostępnij Luty 20, 2017 MirekCz, marek1707, racja, zapomniałem o tym wspomnieć, dziękuję za uzupełnienie tematu 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Wrona Luty 23, 2017 Autor tematu Udostępnij Luty 23, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Luty 25, 2017 Udostępnij Luty 25, 2017 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Wrona Luty 25, 2017 Autor tematu Udostępnij Luty 25, 2017 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Luty 25, 2017 Udostępnij Luty 25, 2017 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 Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Luty 25, 2017 Udostępnij Luty 25, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Luty 25, 2017 Udostępnij Luty 25, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Luty 25, 2017 Udostępnij Luty 25, 2017 A do czego ma się przydać reszta z dzielenia w tym przypadku? Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Luty 25, 2017 Udostępnij Luty 25, 2017 Też mnie to zastanawia. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!