Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
f3dfilament.com

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

Autor Wiadomość
Wrona 



Posty: 18
Wysłany: 17-02-2017, 20:07   Proporcja czasu stanów LOW i HIGH na czujniku krańcowym

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.
Polecany artykuł z FORBOT.PL:
Detektory koloru w robotyce

Chciałbym zaprezentować dwa detektory koloru RGB wykonane w postaci układów scalonych. Są to: TCS3200 oraz TCS... Czytaj całość

Ostatnio popularny » Systemy kontroli wersji - Mercurial


Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7469
Pomógł: 113 razy
Otrzymał 490 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 19-02-2017, 12:56   

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:

Kod programu: Zaznacz cały
if (Czy drzwi są otwarte?) {
 drzwiOtwarte++;
}
 ileRazySprawdzono++;

Procentowy czas, gdy drzwi były otwarte będzie wtedy wyglądał tak:
Kod programu: Zaznacz cały
drzwiOtwarte / ileRazySprawdzono * 100%


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź! >> Kurs ARDUINOKurs podstaw elektronikiKurs STM32
Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Wrona
Wrona 



Posty: 18
Wysłany: 19-02-2017, 17:14   

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?

Postaw piwo autorowi tego posta
 
 
MirekCz 




Posty: 1159
Pomógł: 109 razy
Otrzymał 117 piw(a)
Programuję w:
Asm/C/C++/C#/LUA/...
Moje roboty:
LightDude

Wysłany: 19-02-2017, 20:12   

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ś...

Popularny artykuł » Kurs budowy robotów - #7 - line follower, czyli bolid F1



- WYPRZEDAŻ MAGAZYNU!
Postaw piwo autorowi tego posta
 
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Wrona
marek1707 



Posty: 3916
Pomógł: 420 razy
Otrzymał 564 piw(a)
Skąd: WAW
Programuję w:
C, asm

Wysłany: 19-02-2017, 20:14   

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

Zmień kolejność obliczeń:
Kod programu: Zaznacz cały
(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 :)

Ostatnio zmieniony przez marek1707 19-02-2017, 20:15, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Wrona
Wrona 



Posty: 18
Wysłany: 19-02-2017, 20:29   

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.

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7469
Pomógł: 113 razy
Otrzymał 490 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 20-02-2017, 13:37   

MirekCz, marek1707, racja, zapomniałem o tym wspomnieć, dziękuję za uzupełnienie tematu :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź! >> Kurs ARDUINOKurs podstaw elektronikiKurs STM32
Postaw piwo autorowi tego posta
 
 
Wrona 



Posty: 18
Wysłany: 23-02-2017, 12:30   

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.

Postaw piwo autorowi tego posta
 
 
buchbuch 



Posty: 105
Pomógł: 2 razy
Otrzymał 1 piw(a)
Skąd: ze wschodu
Ostrzeżeń:
 2/3/4
Wysłany: 25-02-2017, 03:38   

Wrona napisał/a:
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 :)


Polecam książki: Williams E. - "Programowanie układów AVR dla praktyków", Tomasz Francuz - "Język C dla mikrokontrolerów AVR"
Postaw piwo autorowi tego posta
 
 
Wrona 



Posty: 18
Wysłany: 25-02-2017, 07:29   

buchbuch napisał/a:
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.

buchbuch napisał/a:
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.


buchbuch napisał/a:
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 :)

Postaw piwo autorowi tego posta
 
 
buchbuch 



Posty: 105
Pomógł: 2 razy
Otrzymał 1 piw(a)
Skąd: ze wschodu
Ostrzeżeń:
 2/3/4
Wysłany: 25-02-2017, 16:19   

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.
Wrona napisał/a:
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 :D 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 :lol:

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


Polecam książki: Williams E. - "Programowanie układów AVR dla praktyków", Tomasz Francuz - "Język C dla mikrokontrolerów AVR"
Ostatnio zmieniony przez buchbuch 25-02-2017, 16:22, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1154
Pomógł: 82 razy
Otrzymał 206 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 25-02-2017, 16:33   

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.

Postaw piwo autorowi tego posta
 
 
buchbuch 



Posty: 105
Pomógł: 2 razy
Otrzymał 1 piw(a)
Skąd: ze wschodu
Ostrzeżeń:
 2/3/4
Wysłany: 25-02-2017, 17:02   

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.


Polecam książki: Williams E. - "Programowanie układów AVR dla praktyków", Tomasz Francuz - "Język C dla mikrokontrolerów AVR"
Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1154
Pomógł: 82 razy
Otrzymał 206 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 25-02-2017, 17:05   

A do czego ma się przydać reszta z dzielenia w tym przypadku?

Postaw piwo autorowi tego posta
 
 
buchbuch 



Posty: 105
Pomógł: 2 razy
Otrzymał 1 piw(a)
Skąd: ze wschodu
Ostrzeżeń:
 2/3/4
Wysłany: 25-02-2017, 17:20   

Też mnie to zastanawia.


Polecam książki: Williams E. - "Programowanie układów AVR dla praktyków", Tomasz Francuz - "Język C dla mikrokontrolerów AVR"
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Przysyłanie/Odbieran... Atmega - problem z b... Arduino i programowa... Arduino, problem z o...
lub przeszukaj forum po wybranych tagach: czasu, czujniku, high, krancowym, low, na, proporcja, stanow


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki