Skocz do zawartości

Licznik ilości na godzine (IR Breakbeam)


Sztuka_To_Tajfu

Pomocna odpowiedź

Witam, jestem początkującym programistą -ostatnimi czasy pracuję sobie nad urządzonkiem, które zliczałoby ile ludzi wchodzi do danego pokoju drzwiami X i ile wychodzi drugimi drzwiamy (powiedzmy Y).

Wykorzystuje do tego dwa czujniki przerwania wiązki IR, arduino UNO oraz konwerter i2C i wyświetlacz HD1602.

Zadanie tegoż "urządzonka" jest takie, aby pokazywało ono na wyświetlaczu ile osób weszło, ile wyszło, procent osób jakie zostały w pokoju oraz ile osób wychodzi z pokoju na godzine

Wszystko już działa - liczy ile osób weszło (IN:), ile wyszło (OUT:), pokazuje ile procent zostało w środku (?🙂, lecz tutaj się pojawia problem: nie wiem jak zrobić, aby pokazywało ile osób wychodzi z pokoju w czasie rzeczywistym na godzinę.

Układ musiałby robić obliczenia typu:

1. Policz ile osób wyszło w 10 sekund, pomnóż wynik razy 360.

Wynik wyszedłby w ilości/h. Tylko zastanawiam się jak napisać "Policz ile osób wyszło w 10 sekundach" - przecież arduino nie ma wbudowanego zegara.

Stąd moje pytanie: macie jakieś pomysły jak mogęto zrealizować ?

PS: Kod programu: http://pastebin.com/MRKbFdJX

Link do komentarza
Share on other sites

przecież arduino nie ma wbudowanego zegara

To dziwne masz to Arduino 😉 o millis i micros słyszałeś?

Po szybkim przemyśleniu nie da się tego o czym piszesz zrobić w bardzo prosty sposób. Ja najpierw spróbowałbym napisać klasę zawierającą bufor na 'timestampy' (czas wydarzenia). W momencie gdy ktoś wychodzi z pokoju wołasz na obiekcie metodę typu newEvent(). Obiekt zapisuje sobie w buforze czas (milisekundy) tego wydarzenia. Jak chcesz wyświetlić informację o tym ile osób wyszło w ciągu ostatnich 10 sekund to wołasz na obiekcie metodę countEvents(), która najpierw usuwa z bufora stare wydarzenia.

W tym kierunku bym zmierzał. Ale całkiem możliwe że się mylę i jest prostszy sposób na liczenie tego czego chcesz 🙂

Link do komentarza
Share on other sites

Ja bym to zrobił tak:

* bufor cykliczny na, powiedzmy, 60 liczb całkowitych

* globalna zmienna licząca ile ludzi przeszło w sumie od włączenia urządzenia

* funkcja uruchamiana co minutę, która:

- bierze z bufora najstarszą wartość, wstawiając po drugiej stronie aktualną wartość

- odejmuje od siebie te dwie wartości (z uwzględnieniem przepełnienia) i wyświetla na wyświetlaczu

Link do komentarza
Share on other sites

Trzeba by też sprecyzować czy ma to być średnia statystyczna aktualizowana od samego początku działania urządzenia czy też średnia z ostatniej godziny. W zasadzie nie ma powodu aby taki counter miał nie podawać przy okazji różnych rodzajów danych łącznie z logiem czasu wejścia/wyjścia każdej osoby.

Pomysł z mnożeniem uważam za formę "wróżenia z fusów" bo przecież może się zdarzyć, że przez kilka, kilkanaście minut nikt ani nie wejdzie ani nie wyjdzie... W tym wypadku lepszym rozwiązaniem będzie dzielenie faktycznie uzyskanych danych niż mnożenie domniemania 😉

Pomysł deshipu w kwestii użycia 60-cio elementowego bufora przesuwnego dla wyliczania średniej z bieżącej godziny powinien się sprawdzić. Można jeszcze zastosować zmienną aktualizowaną co godzinę za pomocą wyliczonej średniej z bufora w celu otrzymania uśrednionego ruchu na bramce Y na godzinę podczas całego czasu pracy urządzenia.

W zasadzie można by całość jeszcze zoptymalizować nieco ale nie komplikujmy 😉

Należy pamiętać, że wartość średniej będzie miarodajna dopiero po pierwszej godzinie.

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

@deshipu Wejście jest bardzo ruchliwe - to powinno być aktualizowane co 15 sekund. Tak jakby "wydajnościomierz". Czyli np. wychodzi z budynku w tym momencie około np. 30 osób/h. Gdybym np. sprawdził za 30 sekund to średnia by się zmieniła - w zależności od tego ile w danej chwili osób wychodzi z pomieszczenia - arduino robi obliczenie ile tym tempie osób wychodzi na godzine.

Link do komentarza
Share on other sites

@deshipu Dokładnie taki ! Nie ważne, że więcej osób się nie przeciśnie 🙂.

w 15 sekund powiedzmy 2 osoby. Mnoże razy 4 i potem wynik jeszcze mnoże razy 60 i mam wynik - gdyby tempo się utrzymało, wyjdzie 480 osób w ciągu h. I z napisaniem tego mam taki kłopot, że nie znam żadnej funkcji/żadnego polecenia które mogłoby mi to wykonać - to jest odmierzać np. te 15 sekund, mnożyć razy 4 a potem razy 60.

Link do komentarza
Share on other sites

Zastanów się chwilę. Przejdą 2 osoby, przez 15 sekund będzie pokazywać 480, a zaraz potem 0.

Nie znasz polecenia, które pomnoży ci liczbę przez drugą liczbę? Może operator mnożenia?

Czas ci poda wspomniana tu wcześniej funkcja millis().

Link do komentarza
Share on other sites

@deshipu Wiem, brzmi to idtioycznie ale taki jest mój zamysł 🙂 !

Znam polecenie które pomnoży mi liczbe przez drugą liczbe (przecież nawet w kodzie przy pozycji w której ma podzielić mi IN przez OUT a następnie pomnożyć wynik przez sto i odjąć od stu je wykorzystałem.

Bardzo przepraszam, ale z uwagi na moje bardzo małe doświadczenie z arduino chciałbym poprosić o pokazanie mi jak wykorzystaćtutaj funkcje millis().

Link do komentarza
Share on other sites

Jeśli jak nazwa wskazuje milis() zwraca czas w ms, to po ok. 49 dniach nastąpi przepełnienie. Wtedy ten program będzie zwracał bardzo dziwne rezultaty. Niby półtora miesiąca to dużo czasu, ale skoro to ma być urządzenie pracujące ciągle, w końcu jednak taki moment nastąpi.

Link do komentarza
Share on other sites

Może być ci łatwiej zamiast liczyć liczbę ludzi na 15s, liczyć odstępy pomiędzy nimi i w ten sposób szacować w jakim tempie przechodzą.

[ Dodano: 25-08-2016, 16:23 ]

Jeśli jak nazwa wskazuje milis() zwraca czas w ms, to po ok. 49 dniach nastąpi przepełnienie. Wtedy ten program będzie zwracał bardzo dziwne rezultaty. Niby półtora miesiąca to dużo czasu, ale skoro to ma być urządzenie pracujące ciągle, w końcu jednak taki moment nastąpi.

Nie będzie, bo takie samo przepełnienie nastąpi wówczas przy operacji odejmowania.

Link do komentarza
Share on other sites

@deshipu Ano i może faktycznie. Póki co, (jako, że jest to dopiero wersja alfa) spróbuje napisać taki program, aby w ogóle wykorzystywał tę funkcje millis(). Tak jak napisałem, jestem dopiero początkujący więc stanowi to dla mnie wyzwanie 🙂.

PS: To, że po 49 dniach ciągłego działania się zawiesi to nie problem - najwyżej zresetuje.

[ Dodano: 25-08-2016, 17:24 ]

Od godziny niestety nie mogę tego rozwiązać. Nie mogę ułozyć sobie w głowie kodu - może to wynika z nieznajomości do końca funkcji millis().

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.