Skocz do zawartości
macizet

Jak pisać biblioteki na Arduino?

Pomocna odpowiedź

Napisano (edytowany)

Cześć, może komuś by się chciało napisać coś na temat pisania bibliotek do Arduino? Temat nie poruszany a potrzebny. Baaaaaardzo potrzebny 😁

 

Edytowano przez macizet
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@macizet dzięki za sugestię, a co właściwie dokładnie Cie interesuje? Z czym dokładnie masz tam problemy? Prawidłowe pisanie bibliotek w przemyślany sposób nie jest wcale takim łatwym zadaniem. Poznanie samej metodologii nie wystarcza, przydaje się tez ogólne doświadczenie programistyczne, aby stworzona biblioteka nie "psuła" całej reszty programu 😉

Udostępnij ten post


Link to post
Share on other sites

Chodzi konkretnie o pisanie prostej biblioteki np. zablyskaj dioda LED okreslona przez inicjalizacje ilosc, jaki czas blyskow.

Udostępnij ten post


Link to post
Share on other sites
38 minut temu, macizet napisał:

Chodzi konkretnie o pisanie prostej biblioteki np. zablyskaj dioda LED okreslona przez inicjalizacje ilosc, jaki czas blyskow.

Cześć,

jeśli znasz C++, to praktycznie powinieneś móc napisać własną bibliotekę do Arduino - jest to po prostu klasa w języku C++ (bez żadnych udziwnień w stosuknu do C++).

Na oryginalnej stronie Arduino jest tutorial:

https://www.arduino.cc/en/Hacking/libraryTutorial

Niestety po łacinie 😉

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

@macizet czy do czegoś takiego faktycznie trzeba bibliotekę pisać?

int led = 13;
unsigned long Start; 
unsigned long buttonTime=0;
int Power=1;
int onTime=150; 
int offTime=1500; 

void setup() 
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);   
  
}
void loop() {
  Start = millis();
  if (((Start-buttonTime)>=onTime) && (Power==1))
  {
  digitalWrite(led, LOW);
  Power=0;
  }
 // tutaj pisz kod
  if (((Start-buttonTime)>=offTime) && (Power==0))
  {
  digitalWrite(led, HIGH);
  Power=1;
  buttonTime=millis();
  }
}

 

Udostępnij ten post


Link to post
Share on other sites

@slon Rozumiem że Ty od razu glibca napisałeś 😉

Czym innym jest pisanie bibliotek użytkowych, a czym innym nauka pisania.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

W zasadzie to się zgadzam a nawet zgadzam się z tym , że sama biblioteka czy klasa mogła by być przydatna w tym wypadku. Przy jednej diodzie to niby nie jest tak oczywiste ale tak sobie pomyślałem co gdyby tych diod było więcej? Więc napisałem funkcję dla jednej diody i prawie kopie tej funkcji dla drugiej diody. Czyli dwie diody mają różne czasy pracy i niby fajnie ale jak by było ich jeszcze więcej? Klasa czy biblioteka na pewno dała by większą przejrzystość i elastyczność. Więc sam pomysł na taką bibliotekę jak i na naukę 🙂 jest całkiem trafny.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Dla wszystkich, którzy chcą korzystać bez delay z migania/pikania i nie tylko a niewiedzą jak do tego się zabrać wklejam funkcję 

void loop() {
  start(13,1000,1000); 
  start2(3,1,15);
  start3(10,250,500);  
}

void start2(int led, int onTime, int offTime)
{
  static int Power=1;
  static unsigned long buttonTime;
  unsigned long Start;
  Start = millis();
  if (((Start-buttonTime)>=onTime) && (Power==1))
  {
  digitalWrite(led, LOW);
  Power=0;
  }

  if (((Start-buttonTime)>=(offTime+=onTime)) && (Power==0))
  {
  digitalWrite(led, HIGH);
  Power=1;
  buttonTime=millis();
  }
}

Efekt działania taki jak niżej. Samo stosowanie funkcji jest bardzo proste

start2(3,1,15);

pierwsza cyfra to nr pinu do którego podpięta jest dioda, druga cyfra to czas na jaki dioda jest włączana tutaj 1ms  i ostatnia cyfra to czas na jaki dioda gaśnie czyli 15ms. Na tej animacji tak tego nie widać ale w rzeczywistości dioda na pinie 3 świeci o wiele słabiej a więc można nawet sterować jasnością. Jak by ktoś chciał to można by nawet podmienić millis() na micros().

Pozostałe dwie diody widać jak świecą. Funkcji start() i start3() nie wklejałem bo ciało tych funkcji wygląda tak samo jak start2() a wiec jeśli chcecie mieć więcej takich funkcji to wystarczy zrobić kopiuj wklej i zmienić nazwę. Oczywiście w setup() trzeba zadeklarować piny jako OUTPUT bo bez tego diody będą świecić jak by chciały a nie mogły:). W planie była biblioteka ale cóż... może następnym razem.

20190418_223712_1.thumb.gif.ebb807e5b06722e453d9726da6e7a1ee.gif

 

Udostępnij ten post


Link to post
Share on other sites
9 godzin temu, slon napisał:

Funkcji start() i start3() nie wklejałem bo ciało tych funkcji wygląda tak samo jak start2() a wiec jeśli chcecie mieć więcej takich funkcji to wystarczy zrobić kopiuj wklej i zmienić nazwę

To jest straszne, używanie kopiuj-wklej powinno być zakazane, a zakaz wpisany do konstytucji. Mam taśmę 144 led-ów, czyli powinienem tyle razy skopiować funkcję start...

A może dałoby się ten kod poprawić i uniknąć kopiowania kodu? To takie małe zadanie domowe.

Udostępnij ten post


Link to post
Share on other sites

@Elvis dla 144 led-ów to nie było by straszne. To był by horror 🙂 . Funkcję napisałem z myślą dla jednej diody natomiast zastosowanie pokazałem na trzech. Jak napiszę to tego klasę to będzie led.start() , led.start1(), led.start2() i faktycznie kopiowanie będzie zbędne. @ArduPiotr dzięki za doping 🙂.

Udostępnij ten post


Link to post
Share on other sites
30 minut temu, slon napisał:

@Elvis dla 144 led-ów to nie było by straszne. To był by horror 🙂 . Funkcję napisałem z myślą dla jednej diody natomiast zastosowanie pokazałem na trzech. Jak napiszę to tego klasę to będzie led.start() , led.start1(), led.start2() i faktycznie kopiowanie będzie zbędne. @ArduPiotr dzięki za doping 🙂.

Cześć,

to raczej powinno wyglądać tak, że do metody led.start(int NrDiody, ...) przekazujesz parametr numer diody (oprócz reszty parametrów) i tak modyfikujesz kod tej funkcji, aby to działało poprawnie.

Pozdrawiam

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@FlyingDutch tak miałem to na myśli a inaczej zapisałem. Generalnie zamysł jet taki Obiekt jako led oraz medota start();. Czyli led1.start(); led2.start(); led3.start(); lub tablica obiektów. Czy taki sposób będzie poprawny?

Edytowano przez slon
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...