Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Języki skryptowe na co dzień | cz. 3. | strażnik w telefonie

W trzeciej części przedstawię skrypt pełniący funkcję detektora bezruchu. Detektor bezruchu, to takie urządzenie, które wykorzystują np. strażacy, gdy wyjeżdżają na akcje. Zadaniem detektora, jest informowanie, najczęściej dźwiękiem, o stanie zagrażającym życiu, gdy strażak nie porusza się przez określony czas.

Przygotowany przez mnie skrypt będzie miał możliwość informowania o bezruchu za pomocą informacji wyświetlanej na ekranie (na potrzeby filmu) lub wykonania połączenia głosowego na zaprogramowany wcześniej numer telefonu. To tylko przykładowe sposoby informowania o bezruchu. Inne, takie jak np. informowanie dźwiękiem, wysłanie wiadomości tekstowej czy inne też są możliwe.

Skrypt napisany jest w pythonie i testowany był na Nokii N95 (Symbian s60). Po drobnych przeróbkach powinien działać na dowolnym urządzeniu z zainstalowanym pythonem i wyposażonym w przyspieszeniomierz.

Na urządzeniu jest zainstalowany python w wersji 1.4.5. Dodatkowy moduł, który musiałem zainstalować, to aXYZ. Daje on dostęp do odczytu wartości z wbudowanego przyspieszeniomierza. Wbudowany przyspieszeniomierz jest trójosiowy. Dzięki czemu będziemy mierzyli przyspieszenie w przestrzeni.

Założenia są następujące.
Wartości mierzonego przyspieszenia są odczytywane i przypisywane do odpowiednich zmiennych. Następnie porównywane są z wcześniej zapisanymi wartościami. Jeśli wartość bezwzględna z różnicy tych dwóch pomiarów dla każdej osi z osobna jest większą niż zapisana wcześniej tolerancja, to znaczy, że jest ok - człowiek się porusza. Jeśli jednak otrzymana wartość bezwzględna z różnicy będzie mniejsza niż założona wcześniej tolerancja, oznacza to, że w tym czasie nastąpił bezruch. Musimy określić jeszcze, w jakim czasie bezruch będzie oznaczał sytuację zagrożenia życia. Zwykle przyjmuje się wartości 15 - 20 s. Skrypt poprosi o podanie czasu zaraz po uruchomieniu.

Oto kod źródłowy: import appuifw, time, axyz, telephone x1 = y1 = z1 = czas1 = czas2 = przelacznik = 0 tole = 2 def odczyt_xyz(x, y, z): global x1, y1, z1, tole, czas1, czas2, czas, przelacznik if czas2 - czas1 < alarm: print x, y, z if abs(x - x1) > tole or abs(y - y1) > tole or abs(z - z1) > tole: przelacznik = 0 else: if przelacznik == 0: czas1 = time.time() przelacznik = 1 czas2 = time.time() czas = alarm - (czas2 - czas1) if czas > 0: print (u'Pozosta\u0142o: ' + str(czas) + ' s') if czas2 - czas1 >= alarm: print('ALARM!!!') # telephone.dial(u'+48000000000') x1 = x y1 = y z1 = z alarm = appuifw.query(u'Po ilu sekundach w\u0142\u0105czy\u0107 alarm? ','number') axyz.connect(odczyt_xyz)

Na początku, skrypt importuje potrzebne moduły: appuifw - gdy korzystamy z interfejsu telefonu; time - wszystko, co jest związane z czasem w systemie; axyz - odczyt wartości z przyspieszeniomierza; telephone - gdy chcemy wykonać połączenie lub wysłać sms.

Następnie ustawiamy wartości początkowe dla zmiennych oraz wartość tolerancji, która w tym skrypcie pełni rolę wyznacznika czułości przyspieszeniomierza - im większa wartość tole, tym łatwiej o alarm.

W dalszej kolejności zdefiniowana jest funkcja, w której został zawarty najważniejszy algorytm skryptu detektora. Zanim jednak funkcja zostanie wywołana, użytkownik jest proszony o podanie czasu, po którym zostanie włączony alarm.

Podczas wywołania funkcji są odczytywane wartości przyspieszenia i przypisywane do zmiennych x, y, z. Następnie, wyświetlane są na ekranie wartości przyspieszenia w trzech osiach, dopóki czas, który upłynął jest mniejszy od wartości czasu podanego na początku (czasu, po którym włączy się alarm). W pierwszej pętli czas1 i czas2 mają wartość 0.

Następnie sprawdzane jest czy zmiana przyspieszenia w poszczególnych kierunkach jest większą niż wartość tolerancji, która została wcześniej określona (tole = 2). Jeśli warunek jest spełniony, tzn. jeśli chociaż w jednym kierunku bezwzględna wartość różnicy dwóch kolejnych przyspieszeń jest większa od zadeklarowanej tolerancji, to znaczy, że człowiek porusza się. Można wówczas ustawić wartość 0 dla zmiennej przełącznik (przelacznik). Zmienna przelacznik informuje skrypt o tym, kiedy trzeba zacząć zliczać czas bezruchu.

Następnie jest warunek odpowiedzialny za wyświetlanie informacji o czasie pozostałym do alarmu.

Ostatni warunek sprawdza, czy czas, który upłynął jest większy lub równy od zadeklarowanego czasu po którym ma włączyć się alarm. Jeśli jest spełniony - włącza alarm.

Na samym końcu, wartości przyspieszeń w trzech osiach są przypisywane do nowych zmiennych, po to, żeby ponownie można było sprawdzić różnicę przyspieszeń dla pobranych nowych wartości x, y, z.

A tak działa detektor bezruchu na N95

Odpowiednio zaprogramowany przyspieszeniomierz może mieć inne ciekawe zastosowania. Może np. być detektorem wstrząsów, badać zachowanie się ciał, analizować ukształtowanie terenu, pełnić rolę keylogera i wiele innych. 

porady programowanie

Komentarze

0 nowych
w.p.   3 #1 15.02.2014 14:58

Fajny temat.
Jedyne do czego mogę się przyczepić to używanie polskojęzycznych nazw zmiennych - to bardzo brzydki nawyk którego lepiej szybko się pozbyć ;)
Polacy nie gęsi, ale na tym poletku jednak trzymajmy się angielskobrzmiącego nazewnictwa.

  #2 15.02.2014 15:03

w.p.: Programowanie, szczególnie w Pythonie to fajna zabawa, a nie korpo-rytuały.
Więc przestań zmuszać kogoś kto się dobrze bawi, by frustrował się w wymyślanie nazw po angielsku. Kiedyś stanie się to dla niego naturalne i wygodne, ale na razie niech tworzy jak lubi.

emilekm2   1 #3 15.02.2014 15:27

A jest interpreter pythona na androida?

  #5 15.02.2014 17:22

Dzięki za fajne artykuły dotyczce pythona. A czy jest szansa, że przedstawisz jakieś ciekawe rozwiązania w Ruby? Dopiero zaczynam poznawać Ruby dlatego pytam :)

entat   6 #6 15.02.2014 18:16

@emilekm2
Ja korzystam z Python for Android (Py4A) http://code.google.com/p/python-for-android/.

iluzion   5 #7 15.02.2014 18:40

Warto wspomnieć jeszcze o Kivy http://kivy.org/.

  #8 15.02.2014 22:32

Dzięki za ciekawy artykuł.
Mam tylko pytanie czy będzie jakiś ciekawy atykuł dla programujących w Ruby? Wiem, że to konkurencja dla Pythona, jednak to też język skryptowy :)
Pozdrawiam

entat   6 #9 16.02.2014 09:28

@w.p., Anonim (niezalogowany)
w.p. rozumiem o czym piszesz. Ja jednak staram się pilnować, żeby gdzie tylko jest to możliwe, używać polskiego języka, nawet w programowaniu:)

@Amibot/BigViking (niezalogowany)
Nie planowałem używać Ruby, choć jest on jak najbardziej językiem skryptowym (został stworzony na podstawie kilku języków, m.in. pythona). Nie znam niestety na tyle składni tego języka, żeby w miarę szybko pisać w nim skrypty.

Berion   14 #10 16.02.2014 11:53

@w.p.
Niby czemu brzydki nawyk? Dla mnie na przykład, czytelniej jest kiedy właśnie zmienne są po polsku. Co innego kiedy oddajesz komuś kod, a co innego kiedy piszesz dla siebie.

  #11 17.02.2014 15:48

@Amibot/BigViking (niezalogowany)
Nie sadzicisz, ze to troche bez sensu? Jesli entat zajmie sie konwertowaniem wszystkiego na Ruby to nie powstanie nic nowego na pythona. Moze ktos inny "przelozy" te przyklady z pythona na ruby, a koledze entat nie zawracalbym tym glowy. A skoro sie uczysz Ruby to tu masz fajne przyklady w stylu "co mozna zrobic w ruby". Skladnie sobie sam zastosuj i mozesz pisac - to chyba lepsze niz tylko czytanie jak ktos cos zrobil...