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.

r   e   k   l   a   m   a

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