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



Teraz jest 14 lis 2024, o 16:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 18 lis 2013, o 19:49 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

"Co to są te biblioteki i z czym to się je?" - chciałem rozpocząć ten temat na forum ogólnym bo w końcu to dotyczy nie tylko Arduino C++ ale jakoś nie wiedziałem co zrobić... Może władcy forum wrzucą to tam a może zostawią tu.... Tutaj jest mało odwiedzających. Jeśli temat dotyczy też AVR to może warto go tam wrzucić...

Walcząc z tematem Podlewaczka (czyli jak inteligentnie podlewać ogród) topic4684.html doszedłem do wniosku że warto zadać pytanie o tak ważną rzecz w programowaniu na Arduino (i nie tylko Arduino) jak BIBLIOTEKI

Biblioteki to fantastyczna sprawa (tak mogę podejrzewać) - MASZ GOTOWCA I TYLKO GO UŻYWAĆ !

ba ... ale jak on naprawdę jest skonstruowany ten gotowiec i jak naprawdę z nim "gadać" ???

naprawdę nie znalazłem w necie takiego tematu ... Wszyscy piszą o tym jaką bibliotekę do czego wykorzystać... ale nie ma info dla maluczkich - z czego to się tak naprawdę składa i jak się z tym komunikować.

Potrzebuję wykorzystać bibliotekę do obsługi Zegara Czasu Rzeczywistego (RTC) i najbardziej chciałbym się o niej czegoś dowiedzieć więc na tym oprę dalsze wypociny:

Co wiem (jak mniemam hehe):

Biblioteki to pliki które ładują się do naszego programu jeśli zostaną tam "wywołane" z pamięci programu do obsługi Arduino. Pojawia się wtedy w kodzie linia rozpoczęta znakiem "#" a w moim przypadku #include <RTClib.h>

Poza tą linią programu nie widzimy NIC
Co zatem zawiera tak naprawdę taka biblioteka?
Co robi taka biblioteka?
Jak z nią się komunikować?
Gdzie znaleźć informacje o niej i o sposobie komunikacji?

Po zainstalowaniu takiej biblioteki można podejrzeć w katalogu (w którym się ona rozpakowała) że istnieją tam różne pliki a nawet katalogi.
Biblioteka musi zawierać co najmniej dwa pliki "***.h" oraz "***.cpp (gdzieś wyczytałem w trakcie swojego krótkiego arduinowego życia że te dwa to podstawa)

W mojej bibliotece do obsługi zegara jest jeszcze plik tekstowy "keywords" czyli "słowa kluczowe"
Do tego dołączony jest też katalog "examples" zawierający przykłady kodów które coś wykonują z taką biblioteką. W nim można podglądnąć jak używać takiej biblioteki ale ...

Czy mógłby ktoś wyjaśnić jak krowie na rowie -

CO TO SĄ TE KEYWORDS I PO CO TO ?
CZY NALEŻY PATRZEĆ W TE PLIKI BIBLIOTECZNE ŻEBY BIBLIOTEKĘ ZROZUMIEĆ?
W pliku "***.h" są jakieś klasy a w pliku "***.cpp" jest program który ich używa?

No ludzie - NIECH KTOŚ NAPISZE CO TU JEST SILNIKIEM A CO SKRZYNIĄ BIEGÓW I JAK SIĘ TO OBSŁUGUJE !

najlepiej jak dla faceta (ale takiego który ma jeszcze mniej niż roczek)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2013, o 20:17 
Offline
Użytkownik
Avatar użytkownika

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

Najogólniej mówiąc biblioteka to po prostu plik zawierający funkcje , które obsługują dane urządzenie np twój RTC rzeczony
To nie jest tak jak napisałeś że nie widać jej tylko #include ....

ponieważ to wyrażenie wskazuje na plik nagłówkowy zawierający tzw prototypy funkcji zawartych w pliku .c lub cpp biblioteki
a funkcje z tej biblioteki są właśnie przez ciebie używane w programie ...

zasadniczo nie musisz sobie zawracać w arduino plikiem keywords... on jest potrzebny po coś edytorowi

natomiast przyglądnijmy się bibliotece rtclib.h o której wspomniałeś zawiera ona wszystko co potrzebujesz do rozmawiania z układem
RTC jakim jest obsługiwany przez nią DS1307 , a więc ona zajmuje się wszystkim co będzie biegać po magistrali do i z układu.

dlatego dla ciebie ważne jest by wiedzieć jakie funkcje oferuje i jak z nich korzystać we własnym programie

zauważ że patrząc w kod programu funkcje dostępne w rtclib.h zaczynają się od RTC.nazwa_funkcji(parametr).
niektóre pozwalają na przekazywanie parametrów a niektóre zwracają wartość będącą wynikiem ich działania ...

Ponadto w twoim programie tam gdzie kompilator natrafi na linijkę np. rtc.readtime() wstawi kod pod tym wpisem w pliku rtclib.cpp
lub wyrażenie lub wartość będącą wynikiem działania funkcji .....
tak to właśnie działa ... w uproszczeniu

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2013, o 21:19 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

.



Ostatnio edytowano 6 lis 2015, o 13:43 przez xor, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 08:48 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

SunRiver napisał(a):
natomiast przyglądnijmy się bibliotece rtclib.h o której wspomniałeś zawiera ona wszystko co potrzebujesz do rozmawiania z układem
RTC jakim jest obsługiwany przez nią DS1307 , a więc ona zajmuje się wszystkim co będzie biegać po magistrali do i z układu.

dlatego dla ciebie ważne jest by wiedzieć jakie funkcje oferuje i jak z nich korzystać we własnym programie

zauważ że patrząc w kod programu funkcje dostępne w rtclib.h zaczynają się od RTC.nazwa_funkcji(parametr).
niektóre pozwalają na przekazywanie parametrów a niektóre zwracają wartość będącą wynikiem ich działania ...


No właśnie chodzi mi o to gdzie zaglądać zeby wiedzieć jak bibliotekę obsłużyć bo dalej jestem głupi jak byłem :|
W rtclib.h chyba nie ma funkcji a są KLASY. O ile się orientuję to tylko trzy i finito:
classDataTime
classRTC_DS1307
classRTC_Millis

natomiast zdaje mi się że w pliku "***.cpp" jest sedno sprawy ale tam też nie widzę funkcji które zaczynały by się od RTC.nazwa_funkcji(parametr).
TAK WYGLĄDA PLIK Z ROZSZERZENIEM "h":
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 10:30 
Offline
Użytkownik
Avatar użytkownika

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

ale właśnie po to masz referencje i przykłady do bibliotek zeby nie grzebać w tych plikach :)

po za tym w pliku h. masz wszystko

DataTime
RTC_DS1307
RTC_Millis


ta biblioteka jest dosyć uboga z je labs

ale zerknij do przykładu :

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


i to jest wszystko co cie interesuje bez grzebania w bibliotekach .... na tym etapie tłumaczenie jak je ugryźć
było by nie na miejscu bo bardzo się jeszcze motasz w samym progu... a le właśnie w skrócie tak jest
większość bibliotek ma obszerne referencje .... ale warto też właśnie z przykładami się zapoznawać bo po
to są one właśnie żeby się zapoznać ze sposobem używania biblioteki

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 11:55 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

OK czyli akurat do tej biblioteki nie mam referencji?

Ten przykład który podałeś jest właściwie taki jaki użyłem już do uruchomienia zegara. Wszystko działa (tzn zegar sobie wyświetla czas i datę - foto poniżej) ale jak tu teraz się z tym komunikować? OTO JEST PYTANIE ;)

Czy na przykład to co napisałeś :
Cytuj:
Ponadto w twoim programie tam gdzie kompilator natrafi na linijkę np. rtc.readtime() wstawi kod pod tym wpisem w pliku rtclib.cpp
lub wyrażenie lub wartość będącą wynikiem działania funkcji .....

naprawdę powinno zadziałać akurat przypadku tej biblioteki ?
Czy komenda powinna być inaczej skonstruowana
Chciałbym odczytywać właśnie czas żeby uruchomić moje podlewanie z tematu topic4684.html

Reasumując w takim razie - rozumiem że aby obsługiwać biblioteki to należy posługiwać się jednak przykładami do nich załączonymi (lub wyszukiwać je w necie) i oglądać pliki tej biblioteki o ile nie mamy innych wyjaśnień zamieszczonych przy danej bibliotece?

Taka informacja też by dużo wyjaśniała - oznacza to wcale nie jest z tym tak prosto jakby się wydawało. Zabawa w błyskanie diodą to tylko zabawa



FOTO płytki z uruchomionym zegarem na bibliotece RTClib. Z lewej strony wyświetlacza jest projekt czujnika podlewaczki z modułem przekaźnikowym na razie nie skorelowanym z arduino.
Obrazek

Oraz kod z przykładów do tej biblioteki:
Kod:
/*
This open-source code Digital Clock and Date, DS1307 RTC connected via I2C, Wire lib and LCD.
This design project for Arduiono Uno by http://circuitdiagram-schematic.com/
*/

#include <Wire.h>
#include "RTClib.h" // library RTC
#include <LiquidCrystal.h> // library LCD

// constans for number row and columns LCD
const int numRows = 2;
const int numCols = 16;
RTC_DS1307 RTC;


// Initialize the library with numbers of interface
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
 
 
}

void loop () {
    DateTime now = RTC.now();
   
    lcd.begin(numCols, numRows);
    lcd.setCursor(0, 0);
    lcd.print("Date");
    lcd.setCursor(6, 0);
    lcd.print(now.year(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.day(), DEC);
    lcd.setCursor(0, 1);
    lcd.print("Clock");
    lcd.setCursor(6, 1);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
   
    delay(1000);
 
}

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 12:26 
Offline
Użytkownik
Avatar użytkownika

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

żeby ustawić czas musisz użyć tej zakomentowanej funkcji :

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


niemniej ta biblioteka jest bardzo prosta i wiele od niej niema co wymagać
jest jednak dużo lepsza biblioteka DS1307 mająca większą funkcjonalność
będąca pewnie tez i lepsza do projektu twojego,


w załaczniku na dole ....
a tu przykładowy kod do niej :L

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



jak widzisz już pozwala na więcej i łatwiej operować układem :

co tu w sumie mamy ....

Zmienna Setup przyjmuje 2 wartości .... true lub false
jeśli true to ustawia czas co odbywa się się tak – zatrzymujemy zegar przez RTC.stop()
następnie ustawiamy wszystkie segmenty przez RTC.set() korzystając ze
stałych do określania sekund, minut, godzin, dni, miesięcy, roku oraz dnia tygodnia.
Następnie uruchamiamy zegar , przez RTC.start().


funkcja RTC.get(SEGMENT,odczyt_z_bufora). służy do odczytywania zegara .
SEGMENT to stała taka sama jak użyta w RTC.set do ustawienia zegara.
Wartość odczyt_z_bufora jest zmienną typu logicznego (boolean) gdy jej wartość to true
biblioteka odpyta układ DS1307 o czas i zachowa jego odczyt w buforze,
tak aby następne RTC.get z ustawionym odczyt_z_bufora na false wiedziały że odczytują ten sam czas


jasne ??


Załączniki:

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

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 12:31 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

Czas jest ustawiony. Przecież zegar działa. Zgodnie z tym co miałem gdzieś w opisie - usunąłem // czyniąc z komentarza linię rozkazu i podczas kompilacji wgrał mi się czas z komputera.
Chodzi teraz o to jak z zegara korzystać czyli jak czytać ten czas i wykorzystywać w funkcjach...
w funkcjach akurat tej mojej podlewaczki ale to przecież wszystko jedno do czego a ja nie kumam gdzie mam tych informacji szukać

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 12:43 
Offline
Użytkownik
Avatar użytkownika

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

trochę się napisałem ,... w poście wyżej a w tym czasie ty odpisałeś wiec się cofnij

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 18:40 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

SunRiver napisał(a):

funkcja RTC.get(SEGMENT,odczyt_z_bufora). służy do odczytywania zegara .
SEGMENT to stała taka sama jak użyta w RTC.set do ustawienia zegara.
Wartość odczyt_z_bufora jest zmienną typu logicznego (boolean) gdy jej wartość to true
biblioteka odpyta układ DS1307 o czas i zachowa jego odczyt w buforze,
tak aby następne RTC.get z ustawionym odczyt_z_bufora na false wiedziały że odczytują ten sam czas


jasne ??


Ta biblioteka faktycznie może będzie lepsza. Zapisałem ją już do IDE i będę się przyglądał. Niestety nie wszystko jest jasne no bo pogubiłem się przy tym SEGMENT i odczyt_z_bufora_

Nie mogę tego SEGMENT pokojarzyć z niczym w plikach biblioteki i dlatego nie rozumiem. Nie kumam skąd się bierze też wartość odczyt_z_bufora
Nie ma żadnej stałęj SEGMENT w plikach biblioteki ani w tym kodzie :
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a może szukać tego w tych bibliotekach pozostałych dołączonych do kodu?

Kody umieszczamy przy pomocy syntax=c - Różowy J.

_________________
sig off ;(



Ostatnio edytowano 20 lis 2013, o 07:14 przez Procent, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 18:48 
Offline
Użytkownik
Avatar użytkownika

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

trochę ci namieszałem bo miałem 2 skethe otwarte :P
przez to w tym akurat co wlepiłem niema zdefiniowanej stałej Segment i zmiennej odczyt z bufora
więc wybacz ... później ci wlepię właściwy fragment kodu .... to zobaczysz o co chodzi

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lis 2013, o 07:18 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

O widzisz - czyli jednak ze mną nie jest może tak źle jak wczoraj myślałem.

Wklej mi to co trzeba i proszę wyjaśnij odczyt czasu i użycie tego w moim kodzie tak żebym mógł o określonej godzinie odczytywac dane z czujnika.
To będzie praktycznie tylko dla mnie w tym wątku, ale jeśli chodzi o biblioteki jako takie to naprawdę chyba sporo pomoże nie tylki mi.

Przy okazji - przyglądając się wnętrzu plików tej biblioteki (a pewnie i w innych to występuje) znajduję
PUBLIC oraz
PRIVATE
interface
oraz PUBLIC i PRIVATE functions w pliku cpp

czym to się różni i z czym to się je ?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lis 2013, o 08:48 
Offline
Użytkownik

Dołączył(a): 31 paź 2013
Posty: 33
Lokalizacja: Wrocław
Pomógł: 0

W oczekiwaniu na dopływ wiedzy postanowiłem popchnąć projekt PODLEWACZKA topic4684.html#p58147 "manualnie".
Programowanie to najtrudniejsza dla mnie sprawa ale nie należy marnować czasu - może im bardziej zaawansowany będzie projekt tym łatwiej będzie komuś pomóc mi w programowaniu :-)

To co wykonałem w ciągu 3 dni nauczyło mnie:
1 - budowy zegara czasu rzeczywistego
2 - przenoszenia projektu z Arduino na osobną płytkę z procesorem
3 - wypalania bootloadera na procesorze

Zapraszam do zerknięcia topic4684.html#p58147

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 21:32 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 4
Pomógł: 0

Aby korzystać z biblioteki nie ma po co zaglądać do pliku z rozszerzeniem cpp (lepiej już wygooglować dokumentację lub przykłady).
Wszystko co jest potrzebne powinno być w pliku z rozszerzeniem .h i tak w tym przykładzie wewnątrz klasy RTC_DS1307 mamy:

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

po słówku public: czyli są to metody ("funkcje" - bo coś zwracają - zauważ, że każdy napis zaczyna się od nazwy typu poprzedzonej ewentualnie
słówkiem kluczowym static (którym nie ma co się na razie przejmować - ono powoduje, że funkcje te są wspólne dla wszystkich obiektów klasy RTC_DS1307 ale to nie jest potrzebne, aby ich używać)) publiczne, czyli dostępne po kropce z poziomu programu. Czyli mamy metody: begin(), adjust(DateTime), isrunning() oraz now(), które możemy używać po kropce po nazwie zmiennej typu RTC_DS1307. Niestety plik .h jest (jak to niestety często bywa) niedorobiony i nie ma komentarzy, co też te funkcje zwracają w jakim przypadku (chociaż co zwraca now() można się domyślić ;) ).
A skąd wiadomo, czego szukać w jakiej bibliotece - no cóż, jak dla mnie, to z google ;), albo z tutoriali arduino, choć czasem po prostu już wiem, bo już danej biblioteki używałem do czegoś podobnego ;).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 

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