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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×