gotowiec2 - tworzymy własną bibliotekę użytecznych funkcji

Zbiór tutoriali związanych z Arduino.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

gotowiec2 - tworzymy własną bibliotekę użytecznych funkcji

Postautor: wojtekizk » 23 lut 2014, 23:08

Witam
Czy coraz częściej nie zdarza się Tobie, że tworzysz właśnie jakiś projekt, piszesz jakiś fragment kodu i nagle olśnienie - kurcze już gdzieś to było, gdzieś już miałem podobne rozwiązanie, gdzie to było?

Jeśli tak właśnie jest, to najwyższy czas, aby postarać się to wszystko uporządkować, usprawnić, zebrać w spójną i logiczną całość. Rozwiązaniem może być tutaj Twoja własna, podręczna biblioteka najczęściej potrzebnych, najbardziej przydatnych funkcji (czy rozwiązań) i w dodatku taka biblioteka byłaby w zasięgu ręki, a ściślej dostępna dla IDE Arduino, w taki sam sposób jak jego własne standardowe biblioteki.
Ten tutorial podejmuje temat takiej właśnie biblioteki. Na początek postaram się wyjaśnić o co chodzi i naturalnie dołączę coś w rodzaju pakietu startowego dla Twojej osobistej biblioteki przydatnych rozwiązań.
Pisanie własnej biblioteki wcale nie jest takie trudne a i włożony w to trud może być powodem do Twojej własnej satysfakcji. Możesz ją nazwać jak chcesz, umieścić w niej co chcesz i co najważniejsze potem rozpowszechnić do ogólnego użytku przez społeczność fanów Arduino. Pośrednio takim działaniem przyczyniasz się do rozbudowy tak przyjaznej platformy.

Do rzeczy. Każda porządna biblioteka składa się z kilku folderów i kilku niezbędnych plików. W minimalnym wydaniu niezbędne są dwa pliki: plik nagłówkowy z roszerzeniem .h i plik z rozszerezeniem .cpp. Pozostałe pliki można uznać za wodotryski :-)
Prawdziwa biblioteka jest obiektowa, co oznacza że zawiera w sobie definicję obiektów, czyli za pomocą składni języka C opisuje urządzenia zewnętrzne, moduły i projekty czyli przedmioty z którymi zmaga się Twoje Arduino.
Biblioteka może być także opisem właściwości i metod, czyli funkcji jakie ma wykonywać dany przedmiot.

Najczęściej biblioteka składa się z klasy lub klas opisujących ten przedmiot. Z kolei klasa jest właśnie zbiorem właściwości i metod danego obiektu. Stąd w C++ wzięło się pojęcie programowania obiektowego.
Dla przykładu moduł zegara RTC ma szereg własności, takich jak data, czas (rok, miesiąc, dzień, godzina, minuta, sekunda) oraz zbiór funkcji opisujących jak odczytać lub ustawić czas (set_time, read_time, set_date ... itp).

Na początek proponuję jeszcze nie zagłębiać się w mechanizmy klas, własności publiczne i prywatnie, konstruktory, funkcje zaprzyjaźnione... Potem pokaże jak zbiór użytecznych funkcji zamknąć ładnie w ciele pojedynczej klasy...

Celem tego tutoriala będzie utworzenie czegoś w rodzaju szablonu, gdzie zawsze będziesz mógł dodać swoją funkcję, której używasz na tyle często, aby ją teraz mieć po ręką :-) Potem kolejną i kolejną... aż problem dojrzeje na tyle, aby zrobić z tego prawdziwą klasę.

Zaproponuję tutaj bibliotekę o nazwie Tips. W ciele tej biblioteki na początek umieściłem uniwersalną funkcję do obsługi dowolnej klawiaturki Arduino. Nazwa funkcji: getButton. Czemu jest przydatna taka funkcja? Już objaśniam:
OPIS FUNKCJI:
====================================================================================
1) funkcja getButton(...) :

Jeśli posiadasz jedną z trzech wymienionych klawiatur:
A) klawiatura analogowa (5 przycisków podpiętych do jednego wejścia analogowego - góra, lewo, OK, prawo, dół)
B) popularny joystick (pin analog1 - pion, pin analog2 - poziom, pin cyfrowy - klawisz OK)
C) po prostu 5 przycisków, każdy podpięty do wejścia cyfrowego, lub tylko 3 przyciski, ale o tym potem :-)
... to funkcja getButton zwróci Ci liczbę, reprezentującą wciśnięty klawisz, w postaci:
góra - 2, lewo - 4, OK - 5, prawo - 6, dół - 8
Czemu akurat tak? Spójrz na klawiaturę swojego telefonu i rozmieszczenie przycisków 2,4,5,6,8, - już wiesz?
Przykłady wywołań funkcji:
------------------------------------
int k=getButton(); - klawiatura analogowa pin A0 (parametr domyślny funkcji to pin A0)
int k=getButton(2); - klawiatura analogowa pin A2
int k=getButton(2,3,3); - joystick (pion - pin A2, poziom - pin A3, OK - pin 3)
int k=getButton(1,2,3,4,9); - 5 przycisków (gora 1, dół 2, OK 3, lewo 4, prawo 9)
... i Uwaga! Jeśli w swoim projekcie chcesz wykorzystywać tylko 3 przyciski podpięte do wejść cyfrowych,
bo na przykład zmieniasz jakąś wartość: góra-dół i klawisz zatwierdzenia zmian OK, czyli de facto 3 buttony,
... to wywołujesz funkcję dla 5-ciu przycisków, ale 2 ost. parametry ustawiasz na -2.
Przykład dla 3 przycisków:
int k=getButton(2,3,4,-2,-2); - góra 2, dół 3, OK 4, dwie ostatnie liczby funkcja zignoruje.
//-------------------------------------------------------------------------
Aby korzystać z biblioteki Tips musisz ją zaimportować do swojego IDE Arduino.
W załączniku umieściłem plik Tips.zip
W tym celu pobierz na swój komputer plik: Tips.zip a następnie uruchom IDE Arduino i wybierz z menu:
Szkic->Importuj bibliotekę->Add Library... i wskaż pobrany plik Tips.zip
Po zaimportowaniu powinieneś mieć w Twoim osobistym katalogu:
"Moje Dokumenty\Arduino\libraries" folder Tips.
Dokładnie rzecz ujmując biblioteki instalują się tam, gdzie wskazuje na to zmienna sketchbook.path w pliku preferences.txt Plik preferences.txt znajduje się w podkatalogu Arduino Twoich Ustawień (AppData).
Zamknij i uruchom IDE Arduino ponownie i już możesz korzystać z nowej biblioteki.

Na koniec przykładowy kod programiku:
// --- Przykładowy kod programu: (konieczna już zaimportowana biblioteka Tips w katalogu libraries) ---
#include <Tips.h>
void setup()
{
  Serial.begin(9600);
  // dla klawiatur cyfrowych trzeba ustawić odp. piny jako wejścia
  // pinMode(2, INPUT_PULLUP); // góra
  // pinMode(3, INPUT_PULLUP); // dół
  // pinMode(5, INPUT_PULLUP); // OK
  // pinMode(8, INPUT_PULLUP); // lewo
  // pinMode(9, INPUT_PULLUP); // prawo
}
void loop()
{
  Serial.println(getButton()); // klawiatura analogowa, domyślnie pin A0
//Serial.println(getButton(5));           // klawiatura analogowa, pin A5
//Serial.println(getButton(3,4,4));       // joystick A3 pion, A4 poziom, pin 4 OK
//Serial.println(getButton(2,3,5,8,9));   // 5 przycisków, 2-gora, 3-dół, 5-OK, 8-lewo, 9-prawo
//Serial.println(getButton(2,3,5,-2,-2)); // 3 przyciski, 2-góra, 3-dół, 5-OK
}

OK... mamy już swoją bibliotekę. Jak dodać do niej swoją funkcję?
Musisz odnaleźć katalog libraries i w nim katalog Tips. Potem edytujesz plik Tips.cpp i umieszczasz w nim definicję swojej funkcji, najlepiej na końcu pliku. Z kolei w pliku Tips.h umieszczasz tylko deklarację swojej funkcji. Czemu tak właśnie?, bo potem będzie banalnie prostym zadaniem zrobić z tego klasę :-)
Co to jest deklaracja i definicja funkcji objaśnię chętnym w następnym tutorialu (gotowiec3), gdzie objaśnię jak dołączyć do Tips-ów kolejne funkcje.
Pozdrawiam
ps. Kurcze kolorowanie składni jeszcze nie jest dokładnie takie jak chciałem. W tym celu odszukaj w bibliotece Tips pliczek keywords.txt, ustaw się w nowej linii i wpisz: Tips KEYWORD1 Uwaga pomiędzy Tips a KEYWORD1 musi być tabulator ( nie używaj spacji !!!) Zapisz plik i ciesz się teraz oryginalnym kolorowaniem składni :-)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Organ18
Młodszy majsterkowicz
Posty: 9
Rejestracja: 15 lis 2016, 13:07

Re: gotowiec2 - tworzymy własną bibliotekę użytecznych funkcji

Postautor: Organ18 » 15 gru 2016, 15:14

Cześć a powiedz mi taką rzecz bo sobie odpuściłem budowe pilota IR bo nie wiem jak zabrać się za nadajnik IR . Więc postanowiłem użyć pilota uniwersalnego i jak teraz nadpisać klawisz w sensie żeby na AV1 działał samochód modelarski i wszystkie klawisze działały z pilota dla niego oczywiście po wpisaniu kodu klawiszy , a po wciśnięciu AV2 pilot przełączył się w tryb przyczepki i wszystkie guziki działały dla przyczepki .

Wróć do „Tutoriale”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości