Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 13:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 30 cze 2012, o 23:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Obrazek
Witam, w ofercie Atnel do nabycia jest moduł bluetooth. Chciałbym przedstawić przykład wykorzystania tego modułu do komunikacji z telefonami opartymi o system operacyjny symbian, który znajduje się na pokładzie flagowych modeli noki z serii Exx Nxx i wybranych Cxx. Ja będę przykłady opisywał na E72, świetny model z fizyczną klawiaturą qwerty. Jestem zapalonym praktykiem więc będzie mało opisów i dużo praktyki. Żeby zacząć trzeba mieć hardware tzn jakiś mikrokontroler AVR, moduł BT i nokię. Pomijam sprawy obsługi transmisji dla avr ponieważ jest to doskonale opisane w książce Pana Mirka i nie o tym jest ten wątek, pominę też parametryzację modulu BT ponieważ ja używam produktu Bluegiga WT12, ważne żeby ustawić sobie 9600 8n1 i nadać modułowi dowolną nazwę oraz pin. To co tutaj opiszę dotyczy głównie obsługi telefonu czyli napisanie sobie programu na telefonie. Są dwie możliwości, pierwsza to instalowanie na komputerze środowiska Carbide C++ oraz całego API odpowiedniego dla wybranej wersji symiana i poświęcenie czasu na naukę, albo zastosowanie czegoś prostego do czego wystarczy windowsowy notatnik. Ja wybrałem to drugie ponieważ nie będę nigdy pisał gier i innych aplikacji na nokie, chcę tylko w prosty sposób komunikować się z mikrokontrolerem. Do tego wykorzystamy prosty język skryptowy python. Od razu możemy ściągnąć sobie dwie najważniejsze rzeczy na telefon, tzn zestaw bibliotek pythona i konsolę w której będziemy uruchamiali skrypty. Z tego linku https://garage.maemo.org/projects/pys60/ ściągamy archiwum PythonForS60_2.0.0.tar.gz. Po rozpakowaniu z katalogu PyS60Dependencies wyciągamy Python_2.0.0.sis oraz PythonScriptShell_2.0.0_3_2.sis, reszta archiwum jest nam nie potrzebna. Dwa wyciągnięte pliki to instalki, pierwsza to zestaw bibliotek, druga to konsola do uruchamiania naszych skryptów. Obie wrzucamy na telefon i instalujemy, telefon sam poprowadzi nas przez proces instalacyjny, kiedy będziemy zapytani czy instalować w pamięci telefonu czy na karcie pamięci to wybieramy pamięć telefonu ponieważ jest szybsza i zawsze dostępna. Po zainstalowaniu obu narzędzi w menu telefonu znajdziemy nową ikonkę reprezentującą konsolę. W niektórych modelach noki może się zdarzyć że przy uruchamianiu konsoli zobaczymy komunikat o braku bibliotek PIPS, w takim przypadku należy je doinstalować, instalka była tam skąd wzięliśmy dwie pierwsze instalki. To tyle jeśli chodzi o przygotowanie telefonu. W komputerze jak już wspomniałem wcześniej wystarczy zwykły notatnik.
Obrazek
Python to taki wdzięczny język, łatwy i przydatny do prostych celów, składnią przypomina trochę pascala trochę basica. My mamy przygotowane biblioteki czyli moduły które dostosowane są konkretnie do sprzętowej obsługi telefonów. No to żeby nie przynudzać napiszemy coś szybko na telefonie. Może zacznijmy tak że uruchomimy sobie konsolę w telefonie, zobaczymy białe pole tekstowe i zgłoszenie pythona gotowego do pracy, z menu lewego klawisza funkcyjnego wybieramy Interactive Console, teraz zobaczymy znak zachęty gdzie można już coś pisać, ja to nazywam wydawać zaklęcia. Wydanie zaklęcia 2+2 i potwierdzenie środkowym klawiszem dżojstika spowoduje że python odpowie 4, na 2+2*2 odpowie 6 więc jest inteligentna ta bestia.
Obrazek Obrazek Obrazek
Czas na skorzystanie z modułów, podstawowy moduł to appuifw, napiszmy więc
Kod:
import appuifw
i zatwierdzamy dżojem, python zaimportował ten moduł. Teraz zobaczmy co tam w tym module się znajduje, rzucamy zaklęcie
Kod:
dir(appuifw)
i zatwierdzamy, python wypisał co tam siedzi w module i z czego teraz możemy korzystać. Weźmy za przykład okienko informacyjne note, czyli piszemy
Kod:
appuifw.note(u'to jest okienko note')
i zatwierdzamy. Literka u przed stringiem mówi pythonowi że to unicode i w ten sposób zawsze będziemy pisali stringi.
Obrazek Obrazek
To teraz trochę z zasobów sprzętowych, zaimportujemy moduł sysinfo czyli
Kod:
import sysinfo
i zobaczmy co tam w module jest fajnego czyli
Kod:
dir(sysinfo)
i zatwierdzamy zawsze dżojem każde zaklęcie. Python wypisał dobrodziejstwa modułu sysinfo. Spróbujemy zapytać pythona o poziom baterii
Kod:
sysinfo.battery()
zobaczymy w konsoli procent naładowania baterii. Możemy to zrobić w okienku informacyjnym
Kod:
appuifw.note(str(sysinfo.battery()+u'%'))
teraz jest fajny efekt. Niezbędne było użycie str() ponieważ wartość poziomu baterii jest typu int, a do okienka informacyjnego trzeba dać stringa, dodatkowo dodaliśmy sobie znak procenta.
Obrazek Obrazek
Starczy tego pisania w konsoli. Teraz to samo napiszemy jako skrypt żeby wygodnie to sobie odpalać w dowolnej chwili. Tworzymy na pulpicie nowy dokument tekstowy i w nim piszemy
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zapisujemy taki plik tekstowy i zmieniamy mu nazwę np na bateria i rozszerzenie na *.py Mamy gotowy skrypt, trzeba go wrzucić na telefon do jednej z dwóch lokalizacji, albo do pamięci telefonu do katalogu c/data/python/ albo na kartę pamięci e/python/ Jeśli ktoś nie ma żadnego rozsądnego menadżera plików to polecam x-plore, najlepszy z najlepszych, ma wiele funkcji, może też edytować pliki tekstowe i kiedyś z tego korzystałem pisząc skrypt pythona w autobusie w drodze z pracy, na uszach słuchawki i czas mijał szybko mimo korków ulicznych. Oprócz edycji plików tekstowych X-plore ma także możliwość edycji plików w trybie hexadecymalnym, kopiowanie przenoszenie zmienianie nazwy tworzenie plików katalogów naprawdę fajne narzędzie. X-plore możemy ściągnąć ze strony producenta http://www.lonelycatgames.com/?app=xplore Domyślnie startuje w angielskiej wersji językowej, ale w opcjach programu jest możliwość wyboru języka polskiego. Po wrzuceniu skryptu w odpowiednie miejsce do telefonu uruchamiamy konsole i z menu wybieramy Run script. W tej chwili skończę ten post ze względu na późną godzinę i czas którego wiecznie mam za mało, będę jednak systematycznie uzupełniał ten temat codziennie nowymi postami. Chciałbym to tak zorganizować żeby posty były kolejno jeden po drugim, więc jeśli to możliwe to prosiłbym na razie o nie pisanie w tym temacie, w razie czego na PW, ale myślę że jak na razie wszystko pójdzie lekko jak z płatka. Na zachętę pokażę kilka moich filmików na których używałem pythona i avr.

Dla lubiących czytać dwa fajne polskojęzyczne pdf'y o pythonie
- lamerskie wprowadzenie do pythona http://pl.python.org/view/kursy/lwdp.pdf
- zanurkuj w pythonie http://upload.wikimedia.org/wikibooks/p ... thonie.pdf
W archiwum które ściągaliśmy jest anglojęzyczny pdf napisany pod kątem telefonów noki.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 22:29 przez ariek44, łącznie edytowano 3 razy

Góra
 Zobacz profil  
 
PostNapisane: 1 lip 2012, o 11:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Witam, w poprzednim poście użyliśmy okienka informacyjnego w domyślnej formie z ikonką literki i czyli informacji. Jest możliwość użycia tego okienka z ikonką wykrzyknika które informuje nas że coś jest nie tak jak powinno oraz możliwość okienka z tzw ptaszkiem które informuje nas że coś zostało zatwierdzone. Pisząc skrypty które nawiązują z nami kontakt przydaje się używanie wszystkich tych rodzajów. żeby nie pisać za dużo na sucho od razu spróbujemy rzucić zaklęcie dla każdego typu okienka. Możemy zrobić to bezpośrednio w konsoli, dla przypomnienia uruchamiamy konsolę i wybieramy Opcje -> Interactive Console
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
lub przygotować skryp który będziemy mogli wiele razy uruchamiać za pomocą konsoli pythona Opcje -> Run Script Pamiętamy że skrpt ma mieć rozszerzenie *.py i na telefonie musi znajdować się w odpowiedniej lokalizacji o czym pisałem w poprzednim poście
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oprócz okienek informacyjnych przydatne będą okienka pytające, najczęściej korzystać będziemy z okienek pytających o liczbę, o tekst, lub decyzję tak/nie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
W przypadku okienek pytających zwracane jest to co zostało do nich wprowadzone i można od razu przypisać tą wartość do zmiennej, zmienne w pythonie określane są automatycznie tzn jeśli napiszemy a='' to zmienna a będzie zmienną przechowującą string, jeśli napiszemy a=0 to zmienna a będzie przechowywać integer, jeśli napiszemy a=True to zmienna a będzie określała prawdę lub fałsz. To teraz napiszemy skrypt który będzie dokonywał prostego działania matematycznego, zapyta nas o dwie liczby i wyliczy ich sumę
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Przy podawaniu liczby jeśli naciśniemy prawy klawisz funkcyjny Anuluj to zostanie zwrócona wartość None czyli wartość nie liczbowa, możemy więc nasz skrypt zabezpieczyć przed błędem dodawania wartości nie liczbowej na kilka sposobów. Pierwszy sposób sprawdzi czy zmienna a i b jest różna od None, jeśli tak to zostanie wykonane obliczanie, jeśli zmienna a lub b ma wartość None to python pokaże fajny komunikat błędu w postaci okienka error
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek Obrazek
Ważnym elementem powyższego skryptu są wcięcia w kodzie, wcięcia to spacje na początku linijek kodu, jest to coś na kształt nawiasów klamrowych w C, jeśli mamy np warunek if to wszystko co ma się wykonać w tym warunku musi mieć przynajmniej jedno wcięcie w kodzie więcej niż linia w której określony jest warunek, myślę że to jest zrozumiałe. Innym sposobem na zabezpieczenie się przed błędem jest wykorzystanie instrukcji try. To bardzo fajna instrukcja która sprawdza za nas czy to co się wydarzy będzie posiadało błąd i jeśli tak to łagodnie ominie ten fragment żeby nie przerywać pracy całego skryptu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Powyższa instrukcja try próbuje wykonać c=a+b, jeśli a i b są wartościami liczbowymi to da się je sumować, jeśli nie są to nie można sumować tych liczb i wystąpi błąd, taki błąd możemy obsłużyć w instrukcji except, jeśli jednak błędu nie będzie to skrypt przechodzi do wykonania instrukcji po słowie else.Zrobimy jeszcze jeden skrypt który ma reakcje z użytkownikiem, tym razem zdecydujemy czy chcemy zobaczyć stan naładowania baterii i np siłę sygnału gsm
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek
To samo można napisać bez użycia zmiennych w poniższy sposób
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jeśli wykonujemy jedną instrukcję w warunku to można też tak napisać
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Inne przykładowe informacje jakie możemy wyciągnąć z modulu sysinfo poniżej, więcej zobaczymy w zaklęciu dir(sysinfo) w konsoli, wartości zwracane jako stringi nie trzeba już zamieniać na string przez str(), gdybyśmy potrzebowali zamienić odwrotnie z string na integer to pisalibyśmy int()
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To tyle jeśli chodzi o prostą reakcję pythona z użytkownikiem. W projektach z avr często będziemy chcieli rozmawiać z mikrokontrolerem i dzięki użyciu okienek informacyjnych i pytających będzie to możliwe. Na koniec tego postu przedstawię jeszcze łatwy sposób wrzucenia skryptu na telefon i przeniesienie do odpowiedniej lokalizacji za pomocą wspomnianego w poprzednim poście programu x-plore. Po uruchomieniu x-plore zobaczymy główne okno aplikacji, w Menu -> Konfiguracja jest kilka rzeczy które warto na początku sobie ustawić tzn pokazywanie ukrytych plików, plików systemowych, dysku RAM, dysku ROM i przede wszystkim polski język programu.
Obrazek Obrazek
Obrazek Obrazek
Dysk C to napęd systemowy i nie polecam dokonywania tam zmian plików ponieważ może to się skończyć tak że telefon się wyłączy i już nie włączy, wtedy trzeba będzie wykonać format lub wgrać nowy firmware, dysk D to ram, dysk Z to rom, nas interesuje tylko dysk E który oznacza kartę pamięci. Jeśli nie mamy na karcie katalogu Python do którego trzeba wrzucić skrypty to sobie go możemy utworzyć rozwijając dysk E i wybierając z Menu -> Plik -> Utwórz folder.
Obrazek Obrazek Obrazek
Teraz wrzucimy skrypt z komputera, można to zrobić kablem w trybie pamięci masowej bezpośrednio na kartę albo przez bluetooth. W tym drugim przypadku na komputerze prawym przyciskiem myszy klikamy na skrypt z rozszerzeniem *.py i wybieramy Wyślij do -> Urządzenie bluetooth, dalej postępujemy intuicyjnie, wyszukujemy swój telefon w oknie urządzeń bluetooth i wysyłamy plik.
Obrazek
Kiedy plik dotarł już na telefon to w x-plore wybieramy Menu -> Narzędzia -> Widomości, zobaczymy tam nasz przesłany plik, zaznaczamy go i wybieramy Menu -> Edytuj -> Przenieś i wskazujemy katalog Python, zatwierdzamy środkowym przyciskiem dżoja, jeśli taki plik już istnieje bo wcześniej już go wysłaliśmy i dokonaliśmy zmiany to x-plore zapyta czy nadpisać, naturalnie zgadzamy się.
Obrazek Obrazek
Obrazek Obrazek
Obrazek Obrazek Obrazek
Żeby przejść teraz do konsoli nie musimy zamykać x-plore i odwrotnie, nasz telefon potrafi przełączać się pomiędzy uruchomionymi zadaniami, przytrzymujemy dłużej przycisk domku w telefonie i zobaczymy listę otwartych aplikacji, w ten sposób możemy się przełączać pomiędzy nimi. W x-plore mamy możliwość bezpośredniej edycji plików tekstowych, w tym także naszych skryptów, żeby zobaczyć jak to działa zaznaczamy nasz skrypt i wybieramy Menu -> Plik -> Edytuj.
Obrazek Obrazek
Obrazek Obrazek
Proszę się nie przerażać ilością przekazanych teraz informacji, obsługa x-plore przyda się nam nie tylko do obsługi skryptów, możemy tam wygodnie zarządzać swoimi danymi typu zdjęcia muzyka itd. W dalszych postach nie będę już wracał do x-plore, a skrypty będą coraz ciekawsze.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 22:09 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 1 lip 2012, o 15:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Mamy za sobą temat okienek informacyjnych dzięki którym będziemy powiadamiani o różnych zdarzeniach podczas wykonywania skryptów, mamy też przerobione metody wprowadzania danych liczbowych i tekstowych, a także sprawy podejmowania decyzji tak/nie. Ostatnią już rzeczą dotyczącą reakcji z użytkownikiem jaką warto przerobić to możliwość wyboru elementów zaproponowanych przez pythona. Od razu zaczynamy od skryptu żeby było łatwiej to zrozumieć
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
W ten sposób utworzyliśmy listę, lista to coś na kształt tablicy w C, możemy przechowywać w niej łańcuchy znaków i liczby. Zaklęcie popup_menu daje nam możliwość wyboru jednego z elementów listy, wartością zwracaną jest indeks w postaci liczbowej, przy czym pierwszy element ma indeks zero. Okienko informacyjne pokaże nam numer pozycji czyli indeks jak wybraliśmy, jest to wartość liczbowa więc trzeba użyć zaklęcia str() żeby zamienić to na stringa bo w takiej postaci trzeba podać wartość do okienka note. Na podstawie indeksu możemy pobrać sobie element z listy
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Kiedy przy wyborze naciśniemy prawy klawisz funkcyjny Wróć czyli nie wybierzemy żadnej z pozycji listy to popup_menu zwróci wartość None. Wtedy w okienku note wystąpi błąd i skrypt zatrzyma się na tym błędzie. Możemy się zabezpieczyć na kilka sposobów, dwa najprostsze przedstawię poniżej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
W pierwszym sposobie sprawdziliśmy czy popup_menu ma watość różną od None, w drugim sposobie spróbowaliśmy wywołać okienko informacyjne i kiedy skrypt będzie chciał się posypać bo nie można wybrać indeksu None to łagodnie przejdzie do obsługi błędu w except. Widać że posługiwanie się listami jest naprawdę fajne w pythonie, mamy do dyspozycji różne operacje jakie możemy na nich przeprowadzać np sortować listy, usuwać elementy, dodawać itd, jeśli ktoś chce zobaczyć możliwości list w pythonie to wystarczy rzucić znane już nam zaklęcie
Kod:
lista = [u'jeden', u'dwa', u'trzy']
dir(lista)

Poniżej kilka przydatnych operacji na liscie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Istnieje inna odmiana okna wyboru z listy w którym mamy możliwość wybierania wielokrotnego i funkcję szukania elementu w liście. Poniżej przykład użycia.
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Podobnie jak przy popup_menu python zwraca nam indeks jaki wybraliśmy z listy, jeśli nie wybierzemy niczego to zwrócona zostanie wartość None. W powyższym przykładzie drugim argumentem jest opcja pola wyszukiwania, gdy ma wartość 1 to pole jest aktywne i można wyszukać element, gdy ma wartość 0 to pole szukania nie będzie dla nas dostępne. Mamy także możliwość wyboru wielokrotnego, przykład poniżej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
W powyższym przykładzie python utworzył dla nas listę wielokrotnego wyboru typu checkbox czyli z kwadracikami zaznaczania i dostępnym polem szukającym, zwrócona wartość jest listą zawierającą te elementy które sobie wybraliśmy, możemy więc zobaczyć w okienku note ile pozycji zaznaczyliśmy pobierając ilość elementów listy zaklęciem len() i przerabiamy to na stringa zaklęciem str() Jeśli ktoś czyta zamieszczone przeze mnie posty i testuje zaklęcia na swoim telefonie to z pewnością zupełnie inaczej teraz dostrzega swój telefon i to za zasługą tego sympatycznego wężyka python. Jeśli czas mi dziś jeszcze pozwoli to zaczniemy pisać skrypty które mają dłuższe życie niż kolejno wykonywane linie kodu i przejdziemy do tworzenia graficznego interfejsu użytkownika, nie ma co się martwić, zaręczam że to bajecznie proste.

Jako ciekawą niespodziankę zamieszczę na koniec zaklęcie gadające tzn takie po którym nasz telefon przemówi do nas głosem syntezatory mowy, dzięki temu możemy urozmaicić skrypty przez potwierdzanie głosowe wykonywanych zadań w telefonie.
Kod:
import audio
audio.say(u'Gotowy do pracy')


Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 22:22 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 1 lip 2012, o 20:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Pisane do tej pory skrypty miały krótkie życie, wykonało się kolejno kilka linijek kodu i skrypt się zakończył. Nam będzie zależało żeby skrypty działały tak długo jak będziemy chcieli i sami zdecydujemy kiedy ma nastąpić ich koniec. skrypt który się wykonuje musi także posiadać jakiś interfejs graficzny żebyśmy mogli poruszać się w nim i wybierać dowolne czynności. Zaczniemy od interfejsu użytkownika, w pythonie dla noki może on przybrać jedną z trzech postaci, pierwsza postać to taka że cały ekran telefonu pracuje dla nas jako wyświetlacz graficzny, możemy na takim wyświetlaczu zamieszczać grafiki i rysować, druga postać to taka kiedy cały ekran telefonu jest dla nas polem tekstowym i możemy tam pisać w dostępnych kolorach i czcionkach, trzecia postać jest podobna do listy wyboru i opiera się na wyborach konkretnych pozycji, przy czym nie możemy korzystać z wszystkich trzech postaci jednocześnie, ale możemy używać ich naprzemiennie. Dla każdej z trzech postaci mamy możliwość wyboru wielkości przestrzeni ekranu określanej jako 'normal', 'large' i 'full'. W tym poście postaram się przedstawić postać graficzną w której będziemy rysować jak na wyświetlaczu graficznym ale nie podpiętym do mikrokontrolera, podpięcie go będzie omówione później i będą to druty niewidzialne czyli bluetooth. Pracę na takim wyświetlaczu będę opisywał na tyle uniwersalnie żeby było to kompatybilne z każdym modelem noki bez względu na rozdzielczość i rodzaj ekranu tzn zwykły lub dotykowy. Python pozwala oczywiście w łatwy sposób obsłużyć ekrany dotykowe, obsłużyć sprzętowe czujniki ruchu, magnetyczne itp, ale na ten czas będziemy pisali w taki sposób żeby wszystko działało na każdym telefonie. Zacznijmy więc od razu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W powyższym skrypcie zdefiniowaliśmy funkcję koniec w której podamy sygnał do odblokowania skryptu. Zostanie on zablokowany w blokada.wiat(), blokada ta polega na tym ze skrypt nie zakończy działania i pozostanie czekający na sygnał odblokowania. Żebyśmy mogli wywołać funkcję koniec musimy ją do czegoś podczepić, ja podczepiłem ją do prawego klawisza funkcyjnego. Teraz po uruchomieniu takiego skryptu nic się nie stanie, ale też skrypt będzie trwał tak długo aż nie nacisnę lewego klawisza funkcyjnego.
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz określiłem wielkość ekranu jaka zostanie przydzielona na interfejs użytkownika, mamy do wyboru 'normal', 'large' i 'full', możemy dowolnie zmienić to sobie w appuifw.app.screen. Za chwilę przedstawię zdjęcia pokazujące jakie są różnice pomiędzy tymi trzema wielkościami ekranu. Nadana została także nazwa skryptu zaklęciem appuifw.app.title która będzie widoczna w trybie 'normal'.
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Utworzyliśmy zmienną lcd i powiedzieliśmy pythonowi że będzie ona określała płótno na którym będziemy sobie dowolnie rysować. Teraz zamieszczę zdjęcia pokazujące puste płótno w trzech rozmiarach ekranu 'normal' 'large' 'full'
Obrazek Obrazek Obrazek
Widzimy że w trybie ekranu 'normal' są widoczne belki górna i dolna, w trybie 'large' nie ma belki górnej gdzie mamy nazwę skryptu, w trybie 'full' mamy cały ekran dostępny w tym przypadku do rysowania. No to skoro już mamy ten lcd to trzeba byłoby coś na nim narysować
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Podstawową grafikę mamy gotową, uciążliwa jest jedna rzecz, kiedy podziwiamy na ekranie co narysowaliśmy to podświetlanie ekranu gaśnie. Ja dodaję zawsze do skryptów zaklęcie które kasuje licznik w telefonie odliczający czas do wygaszenia podświetlania, licznik ten kasowany jest jednorazowo więc trzeba to robić cyklicznie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dodaliśmy do skryptu kilka rzeczy, pierwsza to zmienna timer do której przypisaliśmy wewnętrzny timer odliczający dla nas określone odcinki czasu, zaklęciem after powiedzieliśmy pythonowi że po upływie w tym przypadku 0.1 sekundy ma uruchomić funkcję ekran. W funkcji ekran kasujemy licznik odliczający czas do wygaszenia wyświetlacza i znowu mówimy pythonowi żeby uruchomił funkcję ekran, w ten sposób co 100ms będzie następowało kasowanie licznika podświetlania i ekran nam nie wygaśnie, dla mnie to bardzo przydatne. Zaklęcie after nie zatrzymuje pracy skryptu, mówi tylko o tym że kiedy upłynie podany czas to ma coś wykonać, a w czasie upływania tego czasu skrypt wykonuje inne czynności. Na końcu skryptu następuje anulowanie pracy timera, nastąpi to po wywołaniu funkcji koniec, wtedy wyjdziemy z blokady podtrzymującej życie skryptu. Ja dostrzegam jeszcze jedną rzecz na którą zawsze zwracam uwagę, otóż wypasione modele noki posiadają funkcję obracania ekranu przy przechyleniu telefonu albo przez wyciągnięcie sprzętowej klawiatury. My mamy grafikę przygotowaną na tryb poziomy albo pionowy i chcielibyśmy żeby skrypt tak właśnie pracował niezależnie od tego jak będziemy obracać telefonem. Python ma na to proste rozwiązanie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jak widzimy dodałem do funkcji ekran dodatkową linię w której określam jaką orientację ma mieć ekran. Teraz nawet jak obrócimy telefon i system będzie chciał zmienić orientację ekranu to nie zdąży tego wykonać ponieważ cyklicznie ustawiamy po swojemu. To proste rozwiązanie i skuteczne. Chyba ostatnia już rzecz jaka istotna jest przy przenoszeniu skryptu na różne modele noki to rozdzielczość wyświetlacza. Z tym także można sobie poradzić w naprawdę prosty sposób, wystarczy żeby skrypt znał rozdzielczość i pisać w taki sposób żeby sam się dopasowywał
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Pobraliśmy rozdzielczość ekranu z modułu sysinfo, dzięki temu mogliśmy dokonać obliczeń rysowania lini, elipsy i koła w taki sposób żeby wyglądało to tak samo na każdym modelu noki. Dodatkowo zautomatyzowaliśmy ustawianie orientacji ekranu na tryb poziomy lub pionowy zależnie od rozdzielczości ekranu. Wiemy teraz jak stworzyć sobie graficzny interfejs, więc jak skończyliśmy się już bawić kółkami i liniami to teraz przyszedł czas na napisanie czegoś ciekawszego, narysujemy sobie potencjometr i będziemy nim regulować, będzie on miał określoną przez nas wartość i będziemy mogli ją na bieżąco odczytywać. O tym właśnie napiszę w następnym poście.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 22:26 przez ariek44, łącznie edytowano 2 razy

Góra
 Zobacz profil  
 
PostNapisane: 2 lip 2012, o 10:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Jak obiecałem w poprzednim poście teraz zrobimy sobie graficzny potencjometr którym będziemy mogli regulować, mając cały wyświetlacz do dyspozycji to spróbujemy dodatkowo wykonać graficzne sterowanie ośmioma bitami. Zaczynamy od takiego szkieletu skryptu od którego zaczniemy projektowanie grafiki
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Wszystko w powyższym skrypcie powinno być zrozumiałe ponieważ omawialiśmy to w poprzednich postach. Nowością jest tutaj funkcja rysowanie którą utworzyłem po to żeby można było ją wykonywać wielokrotnie odrysowując grafikę z nowymi współrzędnymi. Niech nasz potencjometr będzie poziomy i ułożony na 1/3 wysokości ekranu a jego ślizgaczem będzie kółeczko poruszające się dowolnie w prawo i w lewo o wielkości 20 pikseli
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Domyślamy się że ślizgacz potencjometru będzie się poruszał więc nie można w zaklęciu lcd.ellipse podawać stałych współrzędnych określających położenie ślizgacza. Trzeba w takim razie utworzyć sobie przynajmniej jedną zmienną która będzie odpowiadała za poziome ułożenie ślizgacza, w pionie nie będzie nam się nic zmieniało
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zmianą w skrypcie było tylko utworzenie zmiennej ślizgacz i ustawienie jej na zero, w zaklęciu ellipse jako współrzędne poziome podstawiona jest ta zmienna. Do poruszania ślizgaczem można użyć sprzętowej klawiatury, ekranu dotykowego albo czujnika przechylenia telefonu. Ja pokażę tutaj użycie klawiatury sprzętowej, w przyszłości pokażę obsługę dotyku i czujników jeśli będzie zainteresowanie tym zagadnieniem. Do obsługi klawiatury użyjemy kolejnego modułu pythona key_codes za pomocą którego będziemy przechwytywać przyciski
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
W powyższym kodzie użyliśmy przechwytywania klawiatury przez nasz interfejs użytkownika który w tym przypadku jest dla nas interfejsem graficznym, z modułu key_codes wybraliśmy dwa klawisze które są nam potrzebne, po ich przechwyceniu przez interfejs zostanie wywołana funkcja klawisz z parametrem. W funkcji klawisz najpierw poinformowaliśmy pythona że użyjemy zmiennej slizgacz która ma być traktowana globalnie tzn zmieniając jej wartość w tej funkcji chcemy żeby zmieniła się on wszędzie gdzie jest użyta. Dalej utworzyliśmy pomocniczą zmienną lokalną w której odjęliśmy od szerokości ekranu szerokość ślizgacza, tez zabieg jest potrzebny żeby zwiększając zmienną slizgacz przypadkiem nie pojechać poza ekran. Kiedy zmienna slizgacz przyjęła już nowe wartości wywołana jest funkcja rysowanie gdzie zostanie wszystko odrysowane od początku. Z doświadczenia wiem że poruszanie takim ślizgaczem po jednym pikselu trochę trwa, zwłaszcza kiedy ekran jest w trybie poziomym i na słabszych modelach noki ze słabszym procesorem, dużo lepszy efekt uzyskamy kiedy poruszać będziemy ślizgaczem np co 2 piksele. Zwiększymy więc prędkość ślizgacza do 2 pikseli i wartość z potencjometru jaką na razie jest jego pozycja w poziomie wyślemy do tytułu skryptu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
W tej chwili poruszając ślizgaczem mamy na górnej belce w tytule podgląd jego wartości bo jest to odświeżane w funkcji rysowanie. Po zmianie skoku poruszania się ślizgacza z 1 na 2 piksele odczujemy szybsze przesuwanie z jednego końca do drugiego. Możemy dodać także możliwość szybkiego powrotu do początku i do końca poprzez przechwytywanie np klawisza gwiazdki i kratki na klawiaturze w telefonie.
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dodane zostały tylko linie przechwytujące klawisze z kodami EKeyStar dla gwiazdki i EKeyHash dla kratki, zaś w funkcji klawisz dodane zostały linie do ich obsługi. Pomyślmy teraz jak zrobić żeby nasz potencjometr wskazywał uniwersalną wartość dla każdego rodzaju wyświetlacza czyli dla każdej rozdzielczości poziomej. Ja bym to zrobił procenotowo tzn przy maksymalnej pozycji ślizgacza byłoby 100%, w ten sposób do mikrokontrolera wysyłałbym uniwersalną informację o położeniu ślizgacza bez względu na to jaką mam szerokość poziomą ekranu. No to spróbujemy dodać do skryptu obliczenie procentowe i pokazywanie tej wartości w tytule skryptu na górnej belce
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
W tytule skryptu ładnie widać procentowe wskazanie ślizgacza, obliczone ono zostało według wzoru ślizgacz/(szerokość ekranu - szerokość ślizgacza)*100. Python domyślnie operuje na liczbach całkowityh więc żebyśmy mogli przeprowadzić takie działanie trzeba powidzieć pythonowi żeby używał wartości float, po obliczeniu nie potrzebujemy części ułamkowych procentu więc wynik zamieniamy na całkowity int(), ostatecznie zmieniamy go na stringa str() i po dodaniu znaku procenta wysyłamy całość do tytułu skryptu widocznego w górnej belce. Ja dodałbym do potencjometru jeszcze jedną fajną właściwość tzn możliwość włączenia i wyłączenia możliwości regulacji, kiedy regulacja będzie możliwa to ślizgacz będzie wypełniony kolorem, jeśli będzie wyłączony to nie będzie wypełniony kolorem, zaś przełączanie tej właściwości będzie możliwe przez naciśnięcie środkowego przycisku dżoja. Pierwsze co trzeba zrobić to dodać przechwytywanie tego właśnie przycisku i potem go obsłużyć
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Utworzyliśmy zmienną aktywny i nadaliśmy jej wartość 1, dopisaliśmy przechwytywanie środkowego przycisku dżoja EKeySelect, w funkcji klawisz powiedzieliśmy pythonowi żeby traktował tą zmienną globalnie i zmieniamy wartość zmiennej na przeciwną tzn kiedy jest 1 to po zmianie będzie -1 i po ponownej zmianie znowu będzie 1. Pozwoli nam to dalej sprawdzać czy zmienna aktywny jest większa lub mniejsza od 0 i na podstawie tego wykonać kolejne czynności. Najpierw dopiszemy graficzną reprezentację aktywnego i nie aktywnego ślizgacza
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Dopisaliśmy tylko jeden warunek w funkcji rysowanie, jeśli zmienna aktywny jest większa od 0 to wypełnienie ślizgacza jest białe, w przeciwnym wypadku jest czarne. Przydałoby się jeszcze dopisać zależność zmieniania wartości potencjometru od zmiennej aktywny tzn kiedy zmienna aktywny będzie mniejsza od 0 to nie powinna się zmieniać wartość procentowa ale powinien poruszać się ślizgacz potencjometru
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Do tego celu utrzorzona została zmienna potencjometr i w niej będzie teraz przechowywana wartość potencjometru, w funkcji rysowanie sprawdzamy zmienną aktywny i jeśli jest większa od 0 to możemy regulować więc obliczenia procentowe zapisujemy do zmiennej potencjometr, dalej ustawiamy tytuł skryptu który jest wartością zmiennej potencjometr. Żebyśmy mogli dokonywać zmian zmiennej potencjometr trzeba było powiedzieć pythonowi że będziemy tą zmienną traktować globalnie. Teraz możemy regulować potencjometrem zawsze, ale tylko kiedy będzie on aktywny to zmieniać się będzie jego wartość procentowa. W kolejnym poście spróbujemy dodatkowo dodać kolejny element sterowania w postaci ośmiu bitów żeby np było możliwe swobodne sterowanie dowolnym portem mikrokontrolera.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 22:50 przez ariek44, łącznie edytowano 2 razy

Góra
 Zobacz profil  
 
PostNapisane: 2 lip 2012, o 16:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Do ostatniego skryptu z poprzedniego postu dodamy teraz możliwość dowolnego sterowania ośmioma bitami. Niech nasze bity będą pokazane jako graficzne kółeczka ułożone równo w poziomie na 2/3 wysokości ekranu. Żeby to zrobić dzielimy szerokość ekranu na 8+1 części i na każdej takiej części rysujemy puste kółeczko
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Teraz szybko przechwycimy przyciski w telefonie od 1 to 8 żeby po naciśnięciu każdego z nich zmieniać stan wybranego bitu i obsłużymy te przyciski w funkcji klawisz, utworzymy też zmienną która będzie listą składającą się z ośmiu elementów i będzie ona przechowywać informacje czy wybrany bit jest włączony czy wyłączony
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Stworzyliśmy zmienną bity która jest listą przechowującą osiem elementów, elementy te będziemy ustawiali na 0 lub na 1 zależnie od tego czy dany bit będzie włączony lub wyłączony. W funkcji klawisz powiedzieliśmy pythonowi że zmienna bity będzie miała zasięg globalny, obsłużyliśmy osiem przycisków i napisaliśmy mechanizm zmieniający zawartość listy z bitami. Mechanizm ten jest bardzo prosty, wykorzystujemy parametr jaki zostanie przekazany do funkcji klawisz, będzie on miał wartości od 11 do 18 zależnie od wybranego przycisku. Sprawdzamy więc czy parametr zawiera się w tym właśnie przedziale i jeśli tak jest to uruchamiamy mechanizm, najpierw sprawdzamy co znajduje się w zmiennej bity która jest listą na pozycji odpowiadającej naciśniętemu przyciskowi, jeśli wartość w zmiennej bity ma wartość 0 to zapisujemy na to miejsce 1, w przeciwnym przypadku zapisujemy w to miejsce 0. Zmienia nam się już zawartość listy, teraz trzeba dopisać do skryptu żeby zmieniała nam się także grafika naszego interfejsu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
W tej chwili mamy już działający potencjometr i osiem bitów. Mogłoby już tak zostać ale ja wolałbym obsługiwać ten interfejs tylko dżojem a nie latać palcem po przyciskach numerycznych w telefonie. Można to zorganizować w taki sposób że używając górnego i dolnego przycisku dżoja będziemy się poruszali pomiędzy potencjometrem a bitami. Musimy też wiedzieć w jakiej obecnie pozycji się znajdujemy więc potrzebna będzie jedna zmienna która będzie to pamiętać, no i oczywiście musimy to jakoś graficznie przedstawić, ja proponuję w tym celu rysować prostokąty obejmujące albo potencjometr albo bity
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Z powyższego skryptu usunęliśmy obsługę klawiszy numerycznych ponieważ chcemy wygodnie poruszać się dżojem, usunęliśmy też mechanizm zmieniający zawartość listy z ustawieniami bitów. Za to utworzyliśmy zmienną pozycja i będzie ona określała czy jesteśmy w pozycji górnej do sterowania potencjometrem czy w pozycji dolnej do sterowania bitami. Dodaliśmy przechwytywanie górnego i dolnego przycisku dżoja oraz w obsłudze klawiszy napisaliśmy zmienianie wartości zmiennej pozycja. W funkcji rysowanie zależnie od wartości zmiennej pozycja rysujemy prostokąt obejmujący potencjometr lub osiem bitów. W takiej postaci skryptu mamy możliwość regulacji potencjometrem ale nie mamy możliwości zmieniania stanu bitów ani możliwości decydowania który konkretnie bit ma zostać zmieniony. Zaczniemy więc od tego ostatniego czyli od zdecydowania który bit ma zostać zmieniony. Ja wykonałbym to na dodatkowym małym kwadraciku który będzie obejmował wybrany bit i będzie poruszał się po bitach w kierunkach prawo lewo.
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Utworzyliśmy zmienną bit i ustawiliśmy ją na 1, będzie ona przechowywać informację o położeniu poziomym zaznaczonego bitu i na jej podstawie w funkcji rysowanie będziemy rysować kwadracik obejmujący dany bit. W funkcji obsługi klawiszy zrobiliśmy rozróżnienie na przesuwanie w poziomie tzn kiedy zmienna pozycja ma wartość 0 to znaczy że będziemy regulować potencjometr, jeśli zmienna pozycja ma wartość 1 to będziemy poruszać się pomiędzy bitami. Brakuje jeszcze jednej rzeczy tzn możliwości zmieniania stanu zaznaczonych bitów. Zrobimy to za pomocą środkowego przycisku dżoja. W taki sposób zbudujemy intuicyjny interfejs po którym poruszamy się dżojem
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Zmiana w skrypcie polegała tylko na obsłudze klawiszy. Kiedy naciśniemy środkowy przycisk dżoja to sprawdzamy najpierw zmienną pozycja, kiedy ma wartość 0 to znaczy że chcemy sterować potencjometrem więc tutaj włączamy go lub wyłączamy przez odwrócenie zmiennej aktywny, kiedy zaś wartość zmiennej pozycja ma wartość 1 to znaczy że chcemy włączyć lub wyłączyć wybrany bit i dokonuje tego mechanizm operujący na zmiennej bity zamieniając element listy na pozycji wyliczonej ze zmiennej bit. Na koniec dodamy wartość dziesiętną naszych bitów do tytułu skryptu żebyśmy mieli ładnie zobrazowane działanie naszego interfejsu w postaci liczbowej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek Obrazek

Do pełni szczęścia dodamy sobie jeszcze przełączanie kolorów całej grafiki żeby każdy mógł dostosować sobie interfejs do upodobania własnego oka. Stworzymy zmienną która bedzie listą przechowującą kilka kolorów i zmienną która będzie indeksem, we wszystkich zaś określeniach koloru podstawimy właściwy element z listy kolorów. Przełączanie kolorów będzie realizowane przyciskiem 0 na telefonie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek
Wydaje się że skrypt jest już znacznej długości, można to wszytko napisać od początku i optymalizować używając innych rozwiązań, ja rozpisywałem wszystko kolejno żeby był najbardziej zrozumiały każdy kolejny krok i przy okazji żeby można było przyzwyczaić się i zrozumieć pythona. W kolejnym poście zbudujemy zupełnie inny interfejs użytkownika nie oparty o grafikę, prostrzy ale bardzo przydatny i nadający się do sterowania peryferiami w mikrokontrolerze.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 23:08 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 2 lip 2012, o 21:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Zostawimy już grafikę i zbudujemy inny interfejs użytkownika typu listobx oparty na liście wyboru. Za pomocą tego interfejsu będziemy mogli sterować np przekaźnikiem, diodą led i wysyłać do mikrokontrolera wartość bajtową do wysterowania całego portu. Zaczynamy zatem od podstawowej postaci skryptu który będziemy powoli budować
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Nowością jest tutaj inny rodzaj interfejsu, zamiast grafiki na płótnie Canvas jest teraz lista wyboru Listbox. Nie korzystamy tutaj z wymuszenia orientacji ekranu ponieważ taki interfejs sam dopasowuję się automatycznie do ekranu tzn jeśli mamy telefon który umożliwia automatyczną rotację ekranu to nasz interfejs samodzielnie dostosuje się do takiej rotacji. Utworzyliśmy zmienną lbox która będzie tutaj reprezentowała nasz interfejs typu Listbox. Wywołując taki interfejs musimy jako parametr podać zbiór elementów oraz funkcję która będzie wywoływana po wskazaniu przez nas któregoś z elementów. Do tego utworzona została funkcja wybierz i do niej zapisaliśmy w tej chwili zaklęcie pass które mówi pythonowi że tutaj nic się nie wydarzy. Interfejs który teraz będziemy używać może mieć postać podwójną tzn elementy w zbiorze będą grupowane po dwa, przykład poniżej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Kiedy wybierzemy domyślnie środkowym przyciskiem dżoja jeden z takich podwójnych elementów to w funkcji wywołującej możemy odczytać indeks ze zbioru w którym przechowywany jest ten element. żeby to zrozumieć najlepiej od razu napisać przykład z okienkiem note które będzie nam wszystko pokazywało
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Znając indeks możemy odczytać dokładnie element ze zbioru jaki został przez nas wybrany
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Widzimy że okienko note zwraca nam dwa elementy, możemy zdecydować który konkretnie nas interesuje
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Od razu przychodzi na myśl że przydałoby się po naciśnięciu na pozycję Przekaznik zmienić napis OFF na ON i odwrotnie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dokonaliśmy dużo zmian w skrypcie ale właściwie nie zaobserwujemy większych efektów. Utworzyliśmy zmienną rel dla przekaźnika, zmienną led dla diody i zmienną byte dla bajtu. W funkcji wybierz powiedzieliśmy pythonowi że te trzy zmienne mają zasięg globalny i dalej na podstawie indeksu zmieniamy wartość tych zmiennych. Zmienne rel i led będą zmieniały się z 'ON' na 'OFF' i odwrotnie, natomiast do zmiennej byte zostanie zapisana wartość zwrócona z okienka pytającego query. Okienko query wywołaliśmy z trzecim parametrem który wpisuje wartość początkową do pola w okienku, w tym przypadku będzie to aktualna wartość zmiennej byte. Ciągle jednak nie będziemy widzieli zmiany w naszym interfejsie ponieważ nie mamy napisanego jego odświeżania, zrobimy to teraz
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Napisane w powyższym skrypcie znaki kratki albo krzyżyka albo hash są komentarzami i nie mają wpływu na pracę skryptu, przydają się jednak czasem do dzielenia sobie skryptu na takie małe kawałki żeby ułatwić czytelność, tutaj ja zaznaczyłem nimi funkcję wybierz bo w tej chwili o niej będę opowiadał. Na początku funkcji powiedzieliśmy pythonowi że nasza zmienna zbior przechowująca elementy będzie zmienną globalną, dalej zostały zmienione wartości zmiennych na podstawie indeksu, po wszystkich zmianach w zmiennych odświeżamy nasz interfejs w zaklęciu set_list gdzie podajemy dwa parametry, pierwszy to zbiór elementów które mają się nam wyświetlić i drugi to pozycja na Listboxie ktora ma zostać zaznaczona jako początkowa, my jako pozycję początkową użyliśmy lokalnej zmiennej index więc po odświeżeniu interfejsu zaznaczona pozycja będzie tą którą wybraliśmy dżojem. Wyjaśnienia wymaga zmienna określająca zbiór. W pythonie zbiory to takie twory podobne do list, ale elementów w zbiorze nie można zmieniać, za to cały zbiór można nadpisywać i taki sposób zastosowaliśmy. Skrypt jest prawie gotowy, ostatnie na co bym zwrócił tutaj uwagę to obsługa okienka pytającego o bajt. Kiedy w tym okienku nie wpiszemy żadnej wartości to zwróci ono wartość None więc wartość nie liczbową, poza tym można wpisać wartość większą od planowanej czyli większą od bajta. Jeśli naszym założeniem jest wysyłanie takiej wartości do mikrokontrolera to nie możemy wysyłać tam bzdur. Ja bym obsługę okienka pytającego o bajt rozwiązał w taki sposó jak poniżej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
To tyle jeśli chodzi o podstawowe informacje o interfejsie użytkownika typu Listbox, przyznacie że jest wygodny i łatwiejszy w obsłudze niż interfejs graficzny. W kolejnym poście pogadam trochę o sposobie tworzenia menu dla lewego przycisku funkcyjnego i dalej będziemy mogli zacząć nawiązywać połączenie z mikrokontrolerem.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 23:17 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 3 lip 2012, o 18:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

W napisanych skryptach często będziemy korzystać z lewego klawisza funkcyjnego jako menu z różnymi opcjami i będziemy je mogli w dowolnym momencie wywoływać. Zwyczajowo zaczniemy od podstawowej wersji skryptu, tym razem z interfejsem graficznym

Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Powyższy skrypt utworzy graficzny interfejs użytkownika ze znanymi nam już dodatkami w postaci automatu do podtrzymywania podświetlania ekranu i blokady utrzymującej pracę skryptu, interfejs posiada tryb normal czyli widoczne są górna i dolna belka na ekranie, wyświetlacz wypełniony jest kolorem czarnym. Zbudujemy teraz menu dostępne pod lewym klawiszem funkcyjnym i dodamy do tego menu funkcje wypełniania ekranu w różnych kolorach
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek
Widzimy że budując menu podajemy zawsze dwa parametry, pierwszy to napis jaki zobaczymy i drugi parametr to funkcja jaka zostanie wywołana po wybraniu pozycji z menu. Po przetestowaniu pracy menu zauważyliśmy dziwne zachowanie interfejsu graficznego które polega na tym że na wyświetlaczu zostaje białe puste miejsce nie wypełnione kolorem kiedy zostanie schowane menu lewego klawisza funkcyjnego. Dzieje się tak dlatego że nasze menu jest tak naprawdę także rysowane na wyświetlaczu żebyśmy mogli je zobaczyć, kiedy menu się ukryje to na wyświetlaczu zostaje puste białe miejsce w którym się ono znajdowało. W pythonie mamy możliwość automatycznego odrysowywania wyświetlacza i powinniśmy z tego korzystać zawsze przy budowie interfejsu graficznego
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek
Tworząc interfejs graficzny przypisany do zmiennej lcd podajemy parametr który jest wywołaniem funkcji automatycznie odrysowującej powierzchnię wyświetlacza, wywołanie to zawiera wymiary wyświetlacza więc funkcja odrysowująca musi zostać napisana w sposób przyjmujący taki parametr, w naszym przypadku to zmienna size, my z niej nie korzystamy ale python wie jaką ma powierzchnię automatycznie odrysować. W menu stworzyliśmy trzy pozycje które wywołują odpowiednio trzy funkcje, w tych funkcjach zmieniamy globalną zmienną kolor i prosimy pythona o odrysowanie powierzchni wyświetlacza, jak wiemy musimy podać wielkość tej powierzchni i podajemy ją zaklęciem lcd.size. Teraz nasz interfejs graficzny ma możliwość automatycznego odrysowywania. Budując menu mamy możliwość użycia podmenu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Kiedy budujemy menu podajemy logicznie ułożoną listę, a listy przeciwnie do zbiorów w pythonie możemy modyfikować co daje nam możliwość innego zapisu w skrypcie przez kolejne dodawanie elementów w takiej liście, przydatne żeby nie zagubić się w nawiasach zamykających jakieś mocno rozbudowane menu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek
Funkcję koniec przenieśliśmy przed zbudowaniem menu żebyśmy mogli użyć tej funkcji w ostatniej pozycji naszego menu. Żeby python mógł przypisać wywoływaną funkcję do pozycji w menu to najpierw taką funkcje trzeba napisać dlatego było konieczne to przeniesienie. Teraz zbudujemy interfejs użytkownika typu Listbox i potem dodamy do niego menu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Do takiego interfejsu dodamy sobie menu w którym będzie możliwość wywoływania funkcji łączenia i rozłączenia z mikrokontrolerem
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Mamy już menu, w funkcjach wywołujących połączenie i rozłączenie nie wykonujemy żadnej czynności dlatego powiedzieliśmy pythonowi pass. Ja stosuję czasem taką metodę że kiedy jestem połączony z mikrokontrolerem to tytuł skryptu widoczny na górnej belce zamykam w nawiasie kwadratowym, to takie fajne zobrazowanie stanu połaczenia. Przy wykonywaniu funkcji koniec często dodaję okienko potwierdzające czy jestem pewny że chcę zakończyć skrytp, przydatne to jest przy omyłkowym naciśnięciu tej pozycji w menu, poniżej dopiszemy to wszystko
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek
Obrazek Obrazek
W funkcjach polaczenie i rozlaczenie został zbudowany mechanizm który dodaje lub odejmuje nawiasy kwadratowe w tytule, mechanizm ten robi to w taki sposob ze pracuje wyłącznie na pierwszym i ostatnim znaku w tytule sprawdzając czy jest to nawias kwadratowy. W pythonie łańcuch znaków to też taka jakby tablica która ma indeks zaczynający się od 0 i możemy wyciągnąć lub zmienić dowolny znak w takim łańcuchu odwolując się do niego poprzez określenie jego indeksu np s[0] odwołuje się do pierwszego znaku w zmiennej s, s[0:10] odwołuje się do całego zestawu pierwszych 10ciu znaków. Zauważyliśmy że w pisanych skryptach nie używamy znaków z polskimi ogonkami ą, ć, ę, ł, ń, ó, ż, ź. W skrypcie nie możemy ich używać bezpośrednio, ale możemy napisać je w postaci kodów tych znaków
Kod:
import appuifw
appuifw.note(u'\u017c\u00f3\u0142w')

Obrazek
Wszystkie kody polskich znaków przedstawiam poniżej
Kod:
ą - \u0105 Ą - \u0104
ć - \u0107 Ć - \u0106
ę - \u0119 Ę - \u0118
ł - \u0142 Ł - \u0141
ń - \u0144 Ń - \u0143
ó - \u00f3 Ó - \u00d3
ś - \u015b Ś - \u015a
ź - \u017a Ź - \u0179
ż - \u017c Ż - \u017b

Możemy powiedzieć że najbardziej przydatne zagadnienia budowy interfejsu użytkownika mamy za sobą, python w noki ma o wiele większe możliwości ale nie o to teraz chodzi żeby je opisywać, temat został utworzony do pokazania jak w pythonie napisać sobie skrypt do sterowania mikrokontrolerami za pomocą bluetooth. Od następnego postu spróbujemy pierwszy raz nawiązać połączenie i podczas pisania tego temtu w kolejnych postach będziemy budować skrypty komunikujące się z mikrokontrolerami używając różnych sposobów sterowania. Na koniec znowu ciekawostka w pythonie, tym razem programowe wysłanie wiadomości sms
Kod:
import messaging
messaging.sms_send('700800900', u'tekst wiadomosci')


Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 23:32 przez ariek44, łącznie edytowano 2 razy

Góra
 Zobacz profil  
 
PostNapisane: 4 lip 2012, o 18:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Obrazek
Spróbujemy teraz nawiązać połączenie z modułem bluetooth w pythonie. Najpierw należy sobie moduł ustawić w sposób 9600 8n1, większość modułów umożliwia konfigurację za pomocą terminala po podłączeniu szeregowym do komputera. Ja posiadam moduł WT12 firmy Bluegiga, do konfiguracji używam terminala Putty, nie mam fizycznego gniazdka szeregowego w komputerze więc używam przejściówki USB<->RS232. Moduł łączę za pomocą trzech przewodów GND, RX, TX. Żeby moduł pracował trzeba oczywiście dać mu zasilanie. W przypadku mojego modułu parametry jego pracy określam w terminalu za pomocą protokołu iWRAP. Mam możliwość ustawienia podstawowych rzeczy jak nazwa modułu, kod pin, prędkość transmisji, a także zaawansowanych parametrów jak możliwość ukrycia modułu tzn nie będzie on widoczny podczas skanowania otoczenia, możliwość określenia pracy typu master lub slave tzn moduł będzie czekał na połączenie które zainicjuje inne urządzenie lub będzie cyklicznie sam nawiązywał połączenie z wcześniej ustawionym urządzeniem i próby nawiązania połączenia będzie realizował także w ustawionych odstępach czasowych, przydatne to jest kiedy mamy dwa takie moduły i chcemy żeby nasze dwa urządzenia automatycznie się ze sobą łączyły w celu wymiany informacji, mogę ustawić czy moduł będzie przyjmował połączenia od wszystkich urządzeń czy tylko od takich które wcześniej sparowałem z modułem, mogę ustawić jedno wyjście modułu jako powiadamiające fizycznie o statusie połączenie tzn przy aktywnym połączeniu będzie na tym wyprowadzeniu występował stan wysoki i wykorzystuję to w połączeniu z mikrokontrolerem żeby mieć informację o połączeniu itd.
Obrazek
My będziemy używać modułu którego praca domyślna to slave czyli będzie on oczekiwał na połączenie, zaś połączenie będzie inicjować python w telefonie. Nie będziemy pisali skryptu do całej obsługi bluetooth wykonującej skanowanie otoczenia i wybieranie jednego ze znalezionych urządzeń. Wykonamy w prosty sposób bezpośrednie połączenie z modułem i będzie nam do tego potrzebny identyfikator w postaci adresu Mac. Adres ten to zestaw sześciu par znaków odzielonych między sobą dwukropkiem, w moim przypadku adres Mac modulu to 00:07:80:96:db:7a. Adres swojego modułu możemy pozyskać we właściwościach urządzeń bluetooth na komputerze po wcześniejszym połączeniu się z modułem
Obrazek
Mając te podstawowe informacje możeby zbudować funkcje do połączenia i rozłączenia z modułem
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Mamy zbudowane podstawowe wersje funkcji, nawiązując połączenie podajemy Mac adres modułu i kanał. Tak napisane funkcje będą działały ale nie są odporne na błędy które mogą się zdarzyć podczas próby połączenia lub rozłączenia i nasz skrypt krótko mówiąc posypałby się. Trzeba te funkcje zrobić bardziej inteligentne
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dodaliśmy obsługę błędów do funkcji i okienka informujące nas o przebiegu ich pracy. W normalnej obsłudze skryptu chcielibyśmy wiedzieć czy jesteśmy połączeni czy nie jesteśmy, więc utworzymy zmienną która będzie przechowywała taką informację
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz nasze funkcje są prawie inteligentne, w poprzednim poście pokazałem obsługę tytułu skryptu w taki sposób że mamy wizualną informację o stanie połączenia przez zamykanie tytułu w nawiasach kwadratowych, to bardzo przydatna rzecz więc dopiszmy ją
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dodajmy teraz interfejs użytkownia typu Listbox z polem umożliwiającym wysłanie jednego znaku i menu z opcjami połączenia żebyśmy mogli pierwszy raz nawiązać kontakt z modułem
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek Obrazek
Obrazek
Obrazek Obrazek
Obrazek Obrazek
Wysłanie znaku powinniśmy widzieć w terminalu jeśli mamy podłączony moduł do komputera. Chciałbym zwrócić uwagę na funkcję wysyłającą znak, zaklęcie kończy się znakiem średnika, gdyby tego średnika nie było to ze znakiem byłyby wysłane dodatkowe znaki powrotu do nowej lini i w terminalu widzielibyśmy że przychodzący znak pojawia się kolejno w nowej linii. Wysyłamy tutaj jeden znak jako string, możemy wysłać kod tego znaku czyli dla zera będzie to 48
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Na tym etapie zakończę dziś naszą zabawę z pythonem ze względu na mój ograniczony czas, następnym razem zbudujemy skrypt sterujący napędem silnikowym i pogadamy o sposobach bezpieczeństwa takiego sterowania.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 10 lip 2012, o 23:41 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 5 lip 2012, o 19:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Obrazek
Zanim zaczniemy temat sterowania napędami silnikowymi wrócimy na chwilę do poprzedniego postu w którym pierwszy raz nawiązaliśmy połączenie z modułem bluetooth i wysłaliśmy znak '0'. Zapewne zainteresowani napisali już własne wersje skryptów do sterowania wyjściem mikrokontrolera. Chcąc zapalić lub wygasić diodę led albo włączyć lub wyłączyć przekaźnik należało zdecydować się na jedno z dwóch rozwiązań, pierwsze to takie które napisałem w ostatnim skrypcie czyli wysyłanie jednego znaku. Przy takim rozwiązaniu w mikrokontrolerze trzeba po odebraniu znaku zmienić stan wyprowadzenia na przeciwny więc sterując w taki sposób możemy tylko wizualnie ocenić czy dioda przy kolejnym wysłaniu znaku zostanie zaświecona czy wygaszona, albo czy przekaźnik zostanie włączony lub wyłączony. Rozwiązanie drugie to takie kiedy mamy przygotowany skrypt do wysyłania dwóch znaków osobno dla zaświecenia diody led albo włączenia przekaźnika i osobny znak dla wygaszenia diody led lub wyłączenia przekaźnika. Sposób z jakiego będziemy korzystali zależy od założenia projektu jaki budujemy. Ja chciałbym wspomnieć tylko że w interfejsie użytkownika typu Listbox możemy dodać dowolną ilość pozycji, kiedy będzie ich na tyle dużo że nie zmieszczą się na jednym ekranie to python utworzy dla nas pasek przewijania i będziemy mogli się po nich poruszać
Obrazek Obrazek
Do wysyłania znaku używamy zaklęcia bt.send() podając jako parametr dowolnej długości string. Możemy więc wysyłać napis który np wyświetli się na wyświetlaczu podpiętym do mikrokontrolera, a dzięki zastosowaniu okienek pytających które poznaliśmy wcześniej nie musimy na sztywno zapisywać w skrypcie takiego napisu tylko pobrać go prosto z okienka pytającego. Dodatkowo dla zapominalskich o kulturalnym pożegnaniu się modułem dopiszemy rozłączenie przy zakończeniu skryptu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Pisząc skrypt wysyłający znaki do modułu bluetooth najlepiej pracować z konsolą w komputerze, wtedy widzimy co zostaje wysłane i w jaki sposób, tak najlepiej testować komunikację jaką tworzymy. Kiedy mamy gotowy zestaw zaklęć pythona to można podłączyć moduł do mikrokontrolera i zająć się obsługą od strony avr. Oczywiście jeśli mamy wprawę i doświadczenie to możemy tworzyć jednocześnie komunikację po stronie telefonu i po stronie mikrokontrolera bez wizualnego sprawdzenia co i kiedy jest wysyłane, ja jednak odradzam taki sposób. Przyszedł czas na sterowanie napędem silnikowym. Zwyczajowo zaczniemy od podstawowej wersji skryptu wyposażonego w interfejs użytkownika typu Listbox i funkcjami do połączenia się z modułem
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Taki skrypt jak wyżej będzie włączał silnik, będziemy też mogli wyłączyć ten silnik przez kolejne wysłanie znaku. Często jednak będziemy chcieli mieć możliwość poruszania silnika w przeciwnym kierunku więc jedna pozycja w Listbox to za mało
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Teraz możemy silnik włączyć w dowolnym kierunku i zatrzymać. W funkcji wybierz wykorzystaliśmy indeks jaki zwraca nam Listbox, po dodaniu do indeksu 48 otrzymujemy kody znaków od '0' bo chr(48) to znak '0', a indeks jak pamiętamy zaczyna się numerycznie od 0. Mikrokontroler będzie wiedział że znak '0' to zatrzymanie silnika, znak '1' będzie dla ruchu w lewą stronę, znak '2' dla ruchu w prawą stronę. Dobrze nam idzie więc dodamy drugi silnik bo tworzymy napęd ruchomy który potrafi skęcać. Mamy więc dwa silniki i dwa sposoby na rozwiązanie sprzętowe, pierwsze rozwiązanie to takie w którym jeden silnik odpowiedzialny jest za kierunki lewo i prawo, a drugi silnik odpowiedzialny jest za kierunek przód i tył, albo drugie rozwiązanie tzn oba silniki pracują w kierunkach przód i tył przy czym zatrzymanie jednego silników lub zmiana jego kierunku obrotów spowoduje zmianę kierunku ruchu całego napędu. Przy jednym i drugim rozwiązaniu potrzebujemy sterować niezależnie dwoma silnikami, każdym w dwóch kierunkach i każdy z nich musimy zatrzymać, spróbujemy rozwiązania pierwszego
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Wysyłamy sześć różnych znaków zależnie od wybranej pozycji ale spróbujmy sobie wyobrazić jak wyglądałoby takie sterowanie gdybyśmy musieli w czasie pracy silnika przod i tyl kontrolowac silnik lewo i prawo, trudno byłoby sterować w taki sposób. Zdecydowanie lepiej będzie jak zastosujemy rozwiązanie sprzętowe drugie tzn oba silniki pracują jako przód i tył. Dla nas bedzie to wygodne ponieważ nie kontrolujemy już dwóch silników tylko tak naprawdę pracę całego napędu tzn chcąc wykonać ruch napędu w przód to wykonujemy taką komendę i mikrokontroler zajmie się tym żeby oba silniki włączyły się w tym samym kierunku, kiedy chcemy wykonać ruch w lewo to wykonujemy komendę w lewo i mikrokontroler zadba o to żeby jeden z tych silników się zatrzymał lub zaczął pracować w kierunku przeciwnym co oczywiście spowoduje zmianę kierunku całego napędu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Sterowanie takim napędem przy wyświetlaczu w pozcyji poziomej jak widać nie mieści się nam na ekranie, to zrobimy Listbox pojedyńczy
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Mamy w jednym widoku cały zestaw komend potrzebny do sterowania napędem. Jeśli taki napęd to mała plastikowa zabawka to nic się chyba nie stanie jeśli przez kiwanie głową to na zabawkę to na telefon przypadkiem pomylimy wybraną pozycję albo nie zdążymy jej wykonać i zabawka uderzy w jakąś przeszkodę, bo przecież musimy jednocześnie patrzeć na zabawkę z napędem i na telefon więc kiwanie głową jest niezbędne. Tylko co będzie jeśli nasz napęd nie będzie już plastikową zabawką tylko złożonym projektem w którym nie możemy sobie pozwolić na pomyłkowe lub spóźnione wydawanie komend, ja uznałbym taki sposób sterowania za mało bezpieczny, jak w takim razie jak napisać wygodne i pewne sterowanie takiego napędu, proponuję najpierw zamienić interfejs użytkownika Listbox na graficzny. Zaczynamy od tzw wersji podstawowej skryptu z interfejsem graficznymm i funkcjami do połączenia z modułem
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Gdybyśmy chcieli zastosować intuicyjne sterowanie napędem to wykonalibyśmy to na dżoju ponieważ trzymając na nim palec nie musimy właściwie już spoglądać na telefon i możemy skupić swoją uwagę na napędzie. Dodajmy więc do interfejsu grafikę która domyślnie powie nam że mamy do dyspozycji komendy wykonywne przez dżoja oraz dopiszmy wymuszenie orientacji ekranu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Teraz dodamy przechwytywanie przycisków dżoja i będziemy wysyłać znaki do modułu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Jest już prawie dobrze, ja zastosowałbym jeszce jedno ułatwienie sterowania takim napędem tzn żebym nie musiał naciskać środkowego przycisku dżoja do zatrzymania napędu, chciałbym żeby napęd zatrzymał się automatycznie kiedy zwolnię kierunkowy przycisk dżoja, będzie to możliwe pod warunkiem że uda się przechwycić przyciski z informacją przyciśnięcia lub zwolnienia, da się to zrobić, python pozwala skanować klawiaturę i zwracać potrzebne nam informacje, najpierw poznajmy kody przycisków
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek
Proszę zwrócić uwgaę na fragment skryptu w kratkach komentarzy, tworząc zmienną lcd która reprezentuje nasz interfejs użytkownika typu graficznego podajemy drugi paramter którym jest funkcja jaka zostanie wywołana po zdarzeniu podczas skanowania klawiatury, funkcja wywoływana będzie z parametrem z informacją o danym przycisku. W funkcji napisaliśmy sobie pokazywanie okienka informacyjnego z kodem przycisku jaki został przechwycony podczas skanowania. Nie jest nam już potrzebny moduł key_codes ponieważ skanowanie odbywa się w inny sposób. Okienko informacyjne pokazuje nam że przycisk góra to 16, dół to 17, lewo to 14, prawo to 15, środek to 167. Mamy kody przycisków więc piszemy obsługę dżoja biorąc pod uwagę jego naciśnięcie i zwolnienie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Osiągnęlismy to co było zamierzone, teraz naciskamy np górny przycisk dżoja i napęd porusza się do przodu tak długo aż nie zwolnimy tego przycisku, kiedy zwolnimy któryś z przycisków kierunkowych dżoja to zostanie wysłany znak '5' co powie mikrokontrolerowi że napęd należy zatrzymać. Zrezygnowaliśmy z obsługi środkowego przycisku dżoja ponieważ nie będziemy go używać. Brakuje tu jedynie graficznej wizualizacji sterowania, zrealizujemy to w taki sposób że wypełni nam się kolorem wybrany prostokąt i będzie wypełniony tak długo jak długo będziemy trzymali wcisnięty ten przycisk
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Mamy już gotowe sterowanie napędem, do konsoli ładnie przychodzą znaki, w powyższym skrypcie zmieniłem znak '5' na '4' ponieważ nie używam środkowego przycisku dżoja i mam ten znak wolny, wyświetlacz pokazuje co jest naciśnięte, interfejs jest intuicyjny. Pozostaje już ostatnia sprawa do omówienia jeśli chodzi o takie sterowanie. Jeśli mamy jakiś poważny projekt to warto wziąść pod uwagę każdą ewentualność. Pomyślmy co się stanie kiedy naciśniemy dżoja i zostanie wysłany rozkaz do silników, w tym momencie z jakiś przyczyn zerwie nam się połączenie bo np sterowaliśmy na granicznych odległościach, albo np bateria była słaba i telefon się wyłączył, może być wiele przyczyn przez które stracimy połączenie z modułem, wtedy silnik nigdy nie dostanie rozkazu zatrzymania, a zanim nawiążemy nowe połączenie żeby go zatrzymać to może być trochę za późno. W takim razie musimy przyznać że projekt oprary na takim sterowaniu nie jest jednak bezpieczny. Ze względu na późną dziś porę pogadamy o tym następnym razem.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 11 lip 2012, o 00:07 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 6 lip 2012, o 19:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Ostatnim razem napisaliśmy skrypt do wygodnego sterowania napędem silnikowym. Tak jak opisałem wcześniej jest jedna sprawa do przemyślenia, chodzi o to że kiedy utracimy połączenie z modułem to napęd będący w ruchu nie będzie mógł się zatrzymać. Możemy zabezpieczyć nasz układ na dwa sposoby, pierwszy sprzętowy i drugi programowy. Jeśli chodzi o sprzętowy sposób to wracając do opisu mojego modułu napisałem że mam możliwość ustawienia jednego jego wyprowadzenia jako logiczne wyjście na którym przy aktywnym połączeniu panuje stan wysoki, w przeciwnym razie na tym wyprowadzeniu jest logiczny stan niski. Jeśli mamy możliwość użycia takiego wyprowadzenia z modułu to możemy w mikrokontrolerze odczytywać jego stan i kiedy moduł utraci połączenie automatycznie zatrzymać napęd. Dla różnych modułów z różnymi ustawieniami będą różne czasy powiadomienia o utraconym połączeniu np 3 sekundy, 5 sekund itp. Oczywiście przy normalnym rozłączeniu się z modułem stan wyprowadzenia modułu zmieni się natychmiast, ale podczas nie kontrolowanej utraty połączenia moduł powiadomi nas z małym opóźnieniem. Jeśli dla kogoś to opóźnienie nie jest ważne to może śmiało zastosować taki sposób zabezpieczenia pracy napędu podczas ruchów w trybie sterowania bezprzewodowego. Przy podłączaniu wyprowadzenia modułu do mikrokontrolera chciałbym zwrócić uwagę na to że większość modułów pracuje w logice 3,3V i żeby nie było dziwnych zachowań w mikrokontrolerze przy odczycie stanu połączenia najlepiej łączyć wyjście modułu np przez tranzystor który do mikrokontrolera wprowadzi niski lub wysoki stan logiczny 5V. Jeśli nie możemy użyć rozwiązania sprzętowego ponieważ nie mamy takiego wyjścia z modułu bluetooth, albo nie mamy wolnych wejść w mikrokontrolerze, albo mamy już gotowy projekt w którym nie zostało przewidziane takie rozwiązanie to możemy pomyśleć o zabezpieczeniu programowym. Jak programowo powiadomić mikrokontroler że moduł utracił połączenie, jak wysłać taką informację skoro w chwili wystąpienia takiego zdarzenia nie możemy już wysłać niczego, otóż musimy odwrócić nasz sposób podejścia do tego i zamiast powiadamiać mikrokontroler że połączenie zostało zerwane to będziemy powiadamiać mikrokontroler że jesteśmy połączeni przez cykliczne wysyłanie umówionego znaku, ja nazywam to wysyłanie bitu życia. Kiedy połączenie zostanie zerwane to zabraknie bitów życia i mikrokontroler automatycznie zatrzyma napęd. Po stronie mikrokontrolera musielibyśmy utworzyć jakiś licznik który będzie zliczał sobie w tle programu i gdy zliczy odpowiednią ilość to uzna że połączenie jest zerwane, zaś kiedy otrzyma bit życia to będzie kasował ten licznik. Można do tego użyć timera sprzętowego w mikrokontrolerze ewentualnie w głównej pętli programu zwiększać licznik. Dopiszmy do poprzedniego skryptu wysyłanie bitu życia
Składnia: [ Pobierz ] [ Ukryj ]
język pascal
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
W skrypcie widzimy że mechanizm wysyłający bit życia przenieśliśmy sobie do funkcji ekran ponieważ ta funkcja wykonywana jest cyklicznie. Na początku skryptu utworzyliśmy zmienną livebit i jest ona naliczana w funkcji ekran do 10 ponieważ ta funkcja wykonuje się co 100ms. Przy takim rozwiązaniu wysyłamy do mikrokontrolera co 1 sekundę umowny znak który tutaj jest znakiem kropki chr(46). Taka metoda pozwala powiadomić mikrokontroler o zerwaniu połączenia z dokładnością do jednej sekundy. Jest jeszcze jeden ciekawy i szybszy sposób zabezpieczenia projektu z napędem przed zerwanym połączeniem. Polega on na tym że mikrokontroler nie sprawdza już stanu połączenia tylko wykonuje cyklicznie przychodzące rozkazy
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Utworzyliśmy zmienną rozkaz która przechowuje aktualny rozkaz dla napędu i jeśli ten rozkaz oznacza pracę napędu w czterech możliwych kierunkach to w funkcji ekran jest on cyklicznie wysyłany do modułu, jeśli rozkaz oznacza zatrzymanie napędu to zostanie wysłany od razu w funkcji skanowania klawiatury i nie będzie powtarzany. Wysyłane cyklicznie rozkazy w funkcji ekran tak naprawdę nie będą wysyłane dokładnie co 100ms, będą wysyłane co 100ms + czas na wysłanie znaku który zależny jest prędkości transmisji. W mikrokontrolerze powinien zostać uruchomiony timer który zlicza nie mniej niż 100ms + czas na odebranie znaku i jeśli się przepełni to automatycznie zatrzyma napęd. Ja stosuję często takie rozwiązanie i z doświadczenia wiem że reakcja na brak przychodzących rozkazów jest prawie natychmiastowa, napęd zostaje zatrzymany nawet zanim moduł zorientuje się że połączenie jest zerwane. Mamy już omówione ważniejsze sprawy sterowania silnikami o których warto było napisać. Zakończymy w tej chwili temat sterowania napędami i następnym razem pogadamy jeszcze o interfejsie użytkownika typu graficznego i jego dodatkowych możliwościach bo projektując interfejs graficzny pewnie będziemy chcieli czegoś więcej niż kresek i kwadratów.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 11 lip 2012, o 00:08 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 8 lip 2012, o 02:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Obrazek
Graficzny interfejs użytkownika w pythonie dla noki ma dużo większe możliwości niż tylko rysowanie prostych figur typu elipsa czy kwadrat, pozwala między innymi na wczytanie obrazu z pliku. Wyobraźmy sobie jaką dzięki temu możemy stworzyć grafikę np dla przełączników, potencjometrów, kontrolek itp. Myślę że przydadzą się podstawowe informacje z tego zakresu więc omówię teraz pracę na plikach graficznych. Nie trudno zgadnąć od czego zaczniemy, od podstawowej wersji skryptu z interfejsem użytkownika typu graficznego
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Używając grafiki w której będzie następowało nakładanie na siebie obrazów i cykliczne ich przemieszczanie lub zamienianie musimy pomyśleć o szybkości z jaką będzie wykonywane odrysowywanie całego wyświetlacza, w wielu przypadkach będziemy widzieli efekt migotania przy czyszczeniu ekranu i nakładaniu na nim nowego zestawu grafik. Żeby tego uniknąć ja używam rysowania w pamięci i kiedy mam gotowy obraz to po prostu wrzucam go na ekran nadpisując ten który jest obecnie wyświetlony. Przy takim rozwiązaniu pozbywam się zupełnie zjawiska migotania. Zanim jednak przedstawię sposób jak tego dokonać to wykonamy najpierw prostą czynność jaką jest wczytanie pliku graficznego i wyświetlenie go na ekranie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Utworzyliśmy zmienną loco do której został przypisany plik graficzny znajdujący się na karcie pamięci w katalogu python czyli tam gdzie jest nasz skrypt, lokalizacja może być dowolna, ja jednak trzymam grafikę dla skryptu tam gdzie mam skrypt. W funkcji odswiezanie został nałożony obraz zmiennej loco na wyświetlacz zaczynając od górnego lewego brzegu ekranu. Teraz utworzymy ten sam obraz w pamięci i nałożymy go na ekran
Składnia: [ Pobierz ] [ Ukryj ]
język pascal
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Efekt powinien być taki sam tzn wyświetli nam się plik graficzny na ekranie, różnica jest taka że plik graficzny został narysowany w pamięci i potem nałożony został na wyświetlacz. Utworzyliśmy zmienną bufor którą możemy traktować jak nowy wyświetlacz ale taki który istnieje tylko w pamięci telefonu i na nim możemy wykonywać wszystkie operacje graficzne jak na wyświetlaczu tym który mamy fizycznie w telefonie. Skoro znamy taki sposób to możemy wykorzystać to do poruszania lub zmieniania obiektu graficznego i nie powinniśmy zaobserwować żadnego efektu migotania przy odrysowywaniu pliku graficznego na nowej pozycji. Dopiszmy więc obsługę przycisków kierunkowych dżoja i przy okazji wymuszenie orientacji ekranu, po naciśnięciu przycisku kierunkowego powinien poruszać się plik graficzny w odpowiednim kierunku
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Utworzyliśmy zmienne xloco i yloco które będą przechowywały współrzędne położenia loco w bufer. Zależnie od naciśniętego przycisku kierunkowego dżoja zmieniamy te współrzędne i tworzymy nowy obraz w pamięci, kiedy obraz jest gotowy to wywołujemy funkcję odświeżenia ekranu gdzie nakładany jest obraz bufor na nasz wyświetlacz. Proszę zwrócić uwagę że naciskając np lewy przycisk dżoja zwiększamy zmienną xloco zamiast domyślnie ją zmniejszać jeśli chcemy żeby obraz poruszał się w lewą stronę. Przy wykonywaniu nakładania obrazu górny lewy brzeg ekranu ma współrzędne 0,0 i poruszając się do środka ekranu nie dodajemy tylko odejmujemy współrzędne, więc w moim przypadku jeśli mam wyświetlacz o rozdzielczości 320x240 to ostatnie wartości współrzędnych będą równe -320 i -240. Mamy już podstawową wiedzę o technice nadawania ruchu wyświetlonej grafice z pliku, proszę sobie wyobrazić jakie można byłoby tworzyć fajne ślizgacze dla potencjometrów, im bardziej wybujała wyobraźnia tym ciekawszy będzie interfejs bo tylko wyobraźnia ogranicza programistę. Oprócz zwykłego wyświetlenia pliku graficznego python daje nam możliwość rotacji tego obrazu w 90, 180 i 270 stopniach i przerzuceniu w poziomie i pionie, czasem to bardzo przydatna rzecz. Wykonamy teraz skrypt w którym po naciśnięciu któregoś z przycisków kierunkowych dżoja będziemy obracać i przewracać nasz obrazek
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek
Jeszcze jedna podstawowa możliwość to rozciągnie obrazu, python umożliwia rozciąganie w trybach z zachowniem proporcji lub bez ich zachowania
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Widzimy że obrazek wychodzi poza widzialny obszar wyświetlacza mimo że ustawiliśmy rozciągnie dokładnie do jego całej wielkości. Dzieje się tak dlatego że mamy widoczne belki górną i dolną czyli interfejs jest w trypie normal. Górna belka przesuwa wyświetlacz ku dołowi ale nie zmienia jego wielkości więc mamy mniej widoku dolnej części wyświetlacza o tyle ile wysoka jest górna belka, dodatkowo mamy widoczną dolną belkę więc jeszcze bardziej zmniejszony obszar widoczności dolnej części wyświetlacza. Jeśli chcemy mieć pełną widoczność wyświetlacza to powinniśmy zastosować tryb ekranu full bez górnej i dolnej belki. W kodzie widać że zmienna loco jest kopią zmiennej img. W zmiennej img przechowywany jest obraz z pliku i pozostaje on nie zmieniany żebyśmy nie musieli ładować tego pliku od początku przy każdej operacji rozciągnia, w funkcji obsługi dżoja do zmiennej loco przypisujemy kopię zmiennej img i od razu rozciągamy obraz w odpowiedni sposób. Spróbujmy teraz wykonać jakiś bardziej praktyczny przykład budowy interfejsu z obsługą dżoja. Zaczniemy od przygotowania sobie tła które u mnie będzie drewnianym stołem i jakąś jedną strzałkę skierowaną w górę, wszystkie pliki graficzne których używam znajdują się w załączniku
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Stworzyliśmy zmienne do przechowywania obrazów tła i strzałki oraz zmienne które są kopiami obrazu strzałki z rotacją w odpowiednim kierunku. Układając strzałki na wyświetlaczu podzieliliśmy go na 20 części żeby było łatwiej je układać i robić to w sposób uniwersalny dla różnych wielkości wyświetlacza. Widzimy że strzałki ułożyły się fajnie ale są przesunięte w prawo mimo że miało być na środku. Obrazy rysowane są od górnego lewego rogu w prawą stronę w dół i patrząc na górną strzałkę widać że jest ona położona tą krawędzią na środku ale nie jest to środek samej strzałki. Trzeba więc poprawić obrachunki uwzględniając rozmiar obrazu strzałek czyli pobrać wielkość obrazka strzałki
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Strzałki są już wyśrodkowane w poziomie, utworzyliśmy zmienną polowa do której zapisujemy połowę szerokości obrazu strzałki i tą zmienną używamy w określaniu położenia poziomego wszystkich strzałek. Było możliwe użycie tylko jednego wymiaru ponieważ wszystkie strzałki są takie same i mają tą samą wysokość i szerokość przez co po ich rotacji ciągle zmienna polowa przechowuje prawdziwą połowę ich szerokości. Byłoby fajnie jakby jeszcze nie bylo widać czarnego tła na strzałkach. Da się pozbyć tego tła na zasadzie stworzenia maski. Określając maskę musimy powiedzieć pythonowi jaki kolor ma być maską, ja stosuję do tego automat który pobiera samodzielnie kolor z obrazu z pierwszego górnego lewego piksela
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Całkiem nam to ładnie wyszło, teraz do obsługi przycisków dodamy zdarzenia które wizualnie pokażą nam że przycisk jest naciśnięty. Możemy to zrobić na dwa sposoby, pierwszy to taki że będziemy rysować np elipsę która otacza odpowiednią strzałkę lub elipsę która będzie znajdowała się pod strzałką co może dać ciekawy efekt. Drugi sposób to taki że wczytujemy jeszcze jeden plik graficzny, obracamy tworząc jego kopie w czterech rotacjach i będziemy go podstawiali w miejsce strzałki która oznacza naciśnięty przycisk dżoja. Spróbujmy najpierw ten pierwszy sposób
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Wygląda ciekawie, teraz spróbujemy ten drugi sposób czyli podstawianie innego pliku graficznego, ja wykonam to tak że będzie to taka sama strzałka ale w innym kolorze
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Ze względu na to że użyliśmy tych samych strzałek tylko w innym kolorze to nie musieliśmy tworzyć dla nich nowej maski i mogliśmy korzystać z maski która została utworzona dla pierwszych strzałek. W funkcji skanowania klawiatury zostaje odrysowywany cały obraz i zależnie od przycisku kierunkowego dżoja nakładny jest obraz odpowiedniej strzałki. Zrobimy jeszcze jeden fajny skrypt tym razem z potencjometrem ale żeby było ciekawiej to z potencjometrem obrotowym, zaczynamy od podstawowej wersji interfejsu graficznego z nałożonym obrazem tła i jakimś pokrętłem, dla intuicji dodamy strzałki do obsługi potencjometru
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Dopiszmy obsługę strzałek, kiedy naciśniemy dżoja to strzałki zmienią kolor
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Jak teraz pokazać graficznie że obracamy potencjometrem, wiemy że python umożliwia nam rotację tylko w czterech kierunkach a my potrzebujemy płynnej rotacji. Ja do tego stosuję geometrię i ruch po okręgu, idea polega na tym że nie obracam całym kołem tylko przemieszczam się po jego krawędzi, w naszym przypadku wędrującym po kole będzie znacznik pokrętła i da nam to wrażenie obrotu. Naszym znacznikiem niech będzie małe czerwone kółeczko które w pokrętle pełni rolę diody led. Taką diodę także stworzymy z pliku graficznego
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Musimy teraz obliczać sobie ruch tej diody, jak korzystam z takiego wzoru
Kod:
polozenie_x = promien_kola * cos( (2 * PI/360) * kąt ) + srodek_kola_x
polozenie_y = promien_kola * sin( (2 * PI/360) * kąt ) + srodek_kola_y

Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek
Obrazek Obrazek Obrazek
Nieznacznie uległ zmianie sposób odświeżania grafiki, trzeba tutaj było zrobić tak żeby po przyciśnięciu i trzymaniu dżoja w górę lub w dół zobrazować to zmieniając kolor strzałki i jednocześnie zmieniać wartości współrzędnych dla naszej wędrującej po okręgu diodzie led. Wiemy że w chwili nacisnięcia dżoja wywoływana jest tylko raz funkcja skanowania klawiatury dlatego utworzyliśmy zmienną przycisk do której zostaje zapisana informacja o naciśnięciu dżoja, trzymając naciśnięty dżoj pracuje dla nas funkcja ekran do której dodaliśmy zmianę wartości zależnie od tego który przycisk dżoja jest naciśnięty. Ufff to tyle jeśli chodzi o rozszerzone możliwości interfejsu użytkownika typu graficznego, python ma jeszcze dużo innych rzeczy ale to już wykracza poza nasz temat którym było sterownie bluetooth, omówiliśmy to co było ważniejsze i może się przydać w czasie budowy interfejsu opartego na grafice.


Zamknęliśmy okrągły tydzień od kiedy poznawalismy pythona dla noki, myślę że po tym tygodniu każdy potrafi sobie zaprojektować fajny interfejs do sterowania modułem bluetooth i zrobić to w sposób przemyślany, dopasowany do założeń całego projektu. Następnym razem pogadam któtko o obsłudze wyświetlacza dotykowego, o czujnikach ruchu, podpowiem parę ciekawych sztuczek i na tym będziemy kończyć ten artykuł.

Edit: Screeny z postu zostały przeniesione na serwer forum


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Ostatnio edytowano 11 lip 2012, o 00:09 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 8 lip 2012, o 13:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Obrazek
To będzie ostatni post, przedstawię tutaj ciekawe przykłady moich skryptów z których można coś fajnego podpatrzeć i wyciągnąć. Zaczniemy od małego zaklęcia które ja stosuję w telefonach z ekranem dotykowym, otóż python w niektórych modelach noki samodzielnie dorysowuje klawiaturę sterującą w interfejsie graficznym, jeśli ktoś nie chce tej klawiatury to wystarczy napisać tak jak poniżej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wspominałem wcześniej że przy pomocy pythona możemy odczytywać wartości z czujników jeśli telefon jest w takie wyposażony, poniżej przykłady skryptów które odczytują wskazania czujnika ruchu w trzech osiach
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Nokia wyprodukowała także telefony z czujnikiem magnetycznym który wykorzystuje się jako kompas, po uruchomieniu odczytu z czujnika należy rozmagnesować telefon i wykonuje się to przez kilka obrotów telefonem wokół wszystkich osi
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
W poniższym skrypcie mamy prezentację ruchu po okręgu, przyciskami 1-5 zmieniamy ilość krążących po okręgu obiektów, przyciskami gwiazdki kratki i zera włączamy lub wyłączamy połączenia pomiędzy obiektami, dżojem zmieniamy wielkość okręgu, kierunek jego obrotu i wypełnienia obiektów, na przyciskach 7-9 mamy możliwość zmiany koloru całej grafiki
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek Obrazek
Obrazek Obrazek
Poniżej przykład użycia ekranu dotykowego, skrypt rysuje trzy kolorowe koła które możemy dotknąć i przesunąć
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Czasem możemy zechcieć dodać do skryptu jakiś plik dźwiękowy który np będzie potwierdzał naciskanie dżoja albo wykonanie jakiejś funkcji, jest to oczywiście możliwe, przykład poniżej
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Myślę że wystarczy tego dobrego, jestem przekonany że po przeczytaniu w całości tego artykułu zainteresowani będą potrafili napisać własne ciekawe skrypty i sterować mikrokontrolerem wykorzystując moduł bluetooth. Dziękuję wszystkim którzy towarzyszyli mi podczas opisywania pythona dla noki i cierpliwie czytali każdą zamieszczoną przeze mnie część. Na podziękowanie zasługuje także mirekk36 który pchnął mnie do napisania tego artykułu. Pozdrawiam i życzę ciekawych pomysłów.

Damian.

Edit: Screeny z postu zostały przeniesione na serwer forum



Ostatnio edytowano 11 lip 2012, o 00:12 przez ariek44, łącznie edytowano 1 raz

Góra
 Zobacz profil  
 
PostNapisane: 8 lip 2012, o 14:29 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Rozumiem, że już możemy się wypowiadać ? ;)

Ja czytając poprzednie odcinki i jednocześnie już wertując net jak szalony, oraz stosowne PDF'y .... zacząłem testować to wszystko na poważnie. Jestem o tyle w gigantycznym szoku (przyjemnym szoku), że ten poradnik zbiegł się akurat w czasie z moimi potrzebami - jeśli chodzi właśnie o pisanie softu na telefony!

Rzeczywiście CZEGOŚ TAKIEGO, nie uda się znaleźć w całym internecie! .... Panowie, zapraszam do konsumpcji wiedzy. Ja już się dobrałem do stołu aż okruchy lecą ;) .... mogę powiedzieć, że to POEZJA SMAKU, uczta bogów ;) no i burza zmysłów i doznań podczas pierwszy testów. Czuję się jakbym zażył ze trzy tabletki: elektroChuana, elektroZac oraz uCYagra ;)

A do tego wszystkiego jeszcze opracowuję ciekawe narzędzie do usprawnienia sobie pracy z testowaniem i tworzeniem tych skryptów. Jeśli uda mi się je ukończyć, to także je zaprezentuję, oj będzie się działo ;)

Jeszcze raz WIELKIE dzięki dla kolegi autora za tak ogromny wkład pracy i przybliżenie nam wszystkim bądź co bądź takiego nieco egzotycznego wydawać by się mogło języka programowania. Tymczasem jak widać drzemie w nim duża siła ;)

rodacy - zapraszam więc do pracy ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
 
PostNapisane: 8 lip 2012, o 15:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

Witam. Czy będzie miało to zastosowanie przy telefonach z Androidem?

Pozdrawiam.
M.

_________________
Pozdrawiam:
Mikołaj



Góra
 Zobacz profil  
 
PostNapisane: 8 lip 2012, o 15:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Temat zamykam dyskusje przenoszę do nowego tematu ..... topic1254.html

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
 
PostNapisane: 11 lip 2012, o 01:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 cze 2012
Posty: 135
Pomógł: 1

Obrazek

Witam, na prośbę osób odpowiedzialnych za forum edytowałem wszystkie posty z całego artykułu przenosząc screeny z zewnętrznego serwera obrazkowego na serwer forum, operacja ta jest korzystna ponieważ teraz zamieszczone obrazki nie będą znikały z upływem czasu i są przydatne dla osoby czytającej cały temat. Korzystając z tej okazji chciałbym dorzucić mały program który kiedyś napisałem do generowanie plików instalacyjnych z utworzonych przez nas skryptów. Za jego pomocą zostanie stworzony plik który zainstaluje się na telefonie i nie trzeba będzie skryptów uruchamiać spod konsoli pythona, wystarczy po prostu wejść w menu telefonu i tam będzie ikonka reprezentująca samodzielnie napisana przez nas aplikacja
Obrazek
Tak oto jak powyżej wygląda okno programu, widzimy w nim podstawowe ustawienia takie jak wskazanie pliku skryptu, UID, wersji, ikonki i uprawnień. Jeśli chodzi o UID to jest on identyfikatorem naszej aplikacji dla systemu symbian, jego numer wiąże się z uprawnieniami i certyfikatem, w naszym przypadku nie musimy zaprzątać sobie nim głowy tzn możemy wybrać dowolny numer siedmiocyfrowy i byle tylko nie powtarzał się w tworzonych przez nas aplikacjach ponieważ nie uda nam się zainstalować drugiej aplikacji o tym samym numerze UID, ja stosuje taką metodę że numer wybieram sobie z nazwy mojej aplikacji na podstawie klawiatury numerycznej, dla przykładu aplikacja o nazwie atnel będzie u mnie miała UID 2863500 z dwoma zerami na końcu ponieważ zabrakło mi literek w nazwie, ten sposób zawsze stosuję i nigdy nie mam kłopotu z wymyśleniem sobie UID. Jako ikonkę podajemy plik *.svg i nie musimy wcale tego robić, wtedy nasza aplikacja będzie w menu telefonu miała taką samą ikonkę jak konsola pythona. Ostatnią ważną sprawą są uprawnienia, ustawiamy je zależnie od tego na co telefon ma zezwalać naszej aplikacji, my będziemy tworzyć aplikacje wykorzystujące połączenie bluetooth więc zaznaczamy sobie Network Services. Teraz wystarczy wygenerować sobie plik instalacyjny który zostanie utworzony w tej samej lokalizacji w której jest program np jeśli mamy program na pulpicie to na pulpicie zostanie utworzony nowy plik, będzie on miał nazwę taką jak ma nasz skrypt i po instalacji w telefonie także będzie taka nazwa pod ikonką
Obrazek

Obrazek
Program ma także opcje po rozwinięciu strzałek w górnym prawym rogu, pierwsze rozwinięcie to wiersz poleceń w którym widzimy przebieg generowania pliku instalacyjnego, drugi to rozszerzone uprawnienia dla zaawansowanych zadań, żeby z nich korzystać musielibyśmy posiadać certyfikat dla swojego IMEI i program do podpisywania plików instalacyjnych który w razie potrzeby podeślę zainteresowanym, napisałem takowy dawno temu, w naszym jednak przypadku nie będą te uprawnienia potrzebne
Obrazek

Obrazek
Wracając szybciutko jeszcze na momencik do pisania skryptów to jeśli chcemy zbajerować naszą aplikację dodając do niej klucz dostępu żeby nikt nie powołany nie mógł sterować naszym modułem lub wykonać innej czynności to istnieje fajny sposób, okienko pytające wywołane z parametrem 'code' zastępuje gwiazdkami wpisany tekst i zwraca ten ciąg znaków w postaci stringa, proszę sobie pomyśleć do ilu rzeczy można to wykorzystać
Obrazek Obrazek Obrazek
Nie wspomniałem nigdy o generatorze liczb losowych, a czasem możemy potrzebować wylosowania jakiejś wartości, w pythonie jest to bardzo proste
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek
Proszę zwrócić uwagę jak łatwo utworzona została lista zawierająca 10 losowo wybranych liczb nie powtarzających się. Możemy więc zbudować sobie generator do popularnego lotka. Poniżej przykład użycia liczb losowych do generowania animacji poruszających się linii odbijanych od krawędzi ekranu
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek Obrazek
Inny przyład użycia liczb losowych do generowania płatów śniegu, płatki opadają z różną prędkością i kołyszą się na boki, bardzo ładny efekt, dzięki użyciu rysowania w pamięci telefonu możliwe było nałożenie płatków na obraz po obliczeniu nowych współrzędnych
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Kolejna sprawa to gdybyśmy chcieli żeby nasza aplikacja pracowała w tle i wywołać taką pracę programowo to wystarczy uruchomić na telefonie tzw ekran główny w poniższy sposób
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Możemy taką minimalizację podpiąć pod prawy klawisz funkcyjny, zaś zamykanie aplikacji wykonać w menu->koniec. Kiedy wiemy jak minimalizować aplikację to przydałoby się także umieć ją przywrócić np kiedy podczas pracy nastąpi jakieś zdarzenie to aplikacja ma automatycznie się przywrócić na pierwszy plan, jest to możliwe, poniżej zaklęcie
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Kiedy utrzymujemy podświetlenie ekranu to wykonujemy tą czynność globalnie tzn że jeśli aplikacja jest w tle to i tak zostaje kasowany licznik odliczający czas do wygaszenia ekranu, możemy udoskonalić nasz skrypt tworząc półautomatyczne podświetlanie w taki sposób że kiedy nasza aplikacja będzie na pierwszym planie to ekran nie wygaśnie, ale kiedy zostanie zminimalizowana to ekran będzie mógł wygasnąć
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Aplikacja pracująca w tle być może będzie potrzebowała wykonywać jakieś czynności o określonych porach, poniżej przedstawię fragment skryptu który o każdej pełnej godzinie odtworzy plik dźwiękowy pod warunkiem że mamy inny profil aktywny niż milczący
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Na podstawie powyższego skryptu można zbudować fajną zegarynkę, ja kiedyś napisałem to w taki sposób że miałem przygotowane pliki dźwiękowe z syntezatora mowy Agata i co godzinkę telefon ładnie mnie powiadamiał w słowach np "[beep] godzina dwunasta zero zero". Bazując na czasie można tworzyć aplikacje które będą łączyły się automatycznie z naszym modułem bluetooth w celu wysłania danych itp, naprawdę są duże możliwości i ogranicza nas tylko nasza wyobraźnia. Inny przykład aplikacji opartej o czas to zaplanowane wysyłanie wiadomości sms o określonej dacie, godznie, do określonego odbiorcy i o określonej treści
Składnia: [ Pobierz ] [ Ukryj ]
język python
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek Obrazek Obrazek
Obrazek Obrazek Obrazek
Obrazek Obrazek Obrazek
Python dla noki to naprawdę fajne narzędzie i zachęcam do korzystania z niego, jest jeszcze wiele ciekawych tematów których nie poruszyłem np praca z połączeniem internetowym itp ale nie da się napisać o wszystkim, ja wskazałem drogę i kierunek na nowe wizje tworzenia mobilnych aplikacji narzędziowych do własnego wykorzystania, czy ktoś pójdzie w taką stronę czy zakręci gdzieś po drodze zależeć będzie wyłącznie od samego zainteresowanego. Załączniki z programem do generowania plików instalacyjnych dla naszych aplikacji umieszczę w częściach ze względu na ograniczenia forum do 256kb na jeden plik ale myślę że to nie stanowi problemu. Pozdrawiam i życzę udanych aplikacji.


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
 
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO