Skocz do zawartości

Jak pisać biblioteki na Arduino?


macizet

Pomocna odpowiedź

2 godziny temu, ethanak napisał:

A kto Ci takich rzeczy naopowiadał, że to trzeba wepchać do klasy?

Wiedzialem ze to nie mozliwe zebys blad popelnil...😅 

O matko to gdzie ja mam upchnac ten static-fun?...aha bo moze sie zle rozumiemy...w "cpp" fun istnieje tylko jako fun() , czyli jako wywolanie funkcji...a w "h" tylko jako deklaracja wskaznika w private..

/// h
#ifndef tester_h
#define tester_h

#include "Arduino.h"

class tester
{
   public:
     void begin(void(*funkcja)(void));
     void costam(void);
  

   private:
   void (*fun)(void);

 
};



#endif

 

/// cpp

#include "tester.h"

void tester::begin(void(*funkcja)(void))
  { fun = funkcja;
   }

void tester::costam(void)
  {
  fun();
  }

 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

W tester.h w ogóle nie trzeba o niej wspominać bo nikogo to nie interesuje.

W tester.cpp masz po prostu:
 

static void (*fun)(void);

void tester::begin(void (*funkcja)(void))
{
...

Taka zwykła zmienna statyczna...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

5 minut temu, farmaceuta napisał:

jaka jest roznica miedzy static i bez w tym przypadku?

Właściwie to powinienem odesłać do pierwszego rozdziału podręcznika C... ale niech Ci będzie.

Bez static ten fun będzie śmiecił po globalnej przestrzeni nazw, czyli np. jakaś inna biblioteka nie mogłaby użyć takiej nazwy funkcji.

Z static fun będzie widziany tylko z poziomu pliku, w którym się znajduje.

 

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

8 minut temu, ethanak napisał:

Właściwie to powinienem odesłać do pierwszego rozdziału podręcznika C... 

Najpier to zerowke musze skonczyc..😅

 

10 minut temu, ethanak napisał:

Z static fun będzie widziany tylko z poziomu pliku, w którym się znajduje.

I ze zwyklymi zmiennymi tez tak trzeba robic??

No dobrze...no a gdybym stworzy drugi obiekt to wtedy ten static nie jest przypadkiem wspoldzielony przez oba obiekty?

Link do komentarza
Share on other sites

6 minut temu, farmaceuta napisał:

gdybym stworzy drugi obiekt to wtedy ten static nie jest przypadkiem wspoldzielony przez oba obiekty?

Oczywiście że jest. Ale to tylko jeden ze sposobów, w zależności od zastosowania możesz wybrać inny. Poza tym do używania biblioteki wcale nie trzeba tworzyć obiektu.

8 minut temu, farmaceuta napisał:

I ze zwyklymi zmiennymi tez tak trzeba robic??

A masz jakieś zmienne globalne w tej bibliotece? Jeśli tak, to mi wygląda na błąd.

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

 

1 godzinę temu, ethanak napisał:

A masz jakieś zmienne globalne w tej bibliotece? Jeśli tak, to mi wygląda na błąd.

Nie nie...tak tylko na zapas pytam😉

1 godzinę temu, ethanak napisał:

 Poza tym do używania biblioteki wcale nie trzeba tworzyć obiektu.

To w jaki sposob moge sie wtedy odwolywac do konkretnych metod?

Link do komentarza
Share on other sites

7 minut temu, farmaceuta napisał:

To w jaki sposob moge sie wtedy odwolywac do konkretnych metod?

A dlaczego nie można zastosować normalnych funkcji tylko koniecznie opakowywać je w klasę? Przykład: biblioteka MsTimer2.

  • Lubię! 1
Link do komentarza
Share on other sites

Dzieki wielkie za pomoc Panie kolego @ethanak 🙂 No sprawdzilem ten MsTimer2...jednak jak dla mnie bardziej domyslnie jest tak standardowo operowac metodami...czyli stworzyc obiekt itp..🙂 dziekuje rowniez za mega dluuugie posty z wyjasnieniami i przykladami kolegom @Matthew11  I @_LM_ doceniam wasza pomoc..bo duzo z tego skorzystam👍

Link do komentarza
Share on other sites

(edytowany)

Hej

Mam pytanie uczę sie pisania bilbioteki. Kod będzię długi i będzie zadelkarowane sporo diod.

Chcę to ładnie ubrać w biblioteke.

Raczkuje w temacie. Jak ładnie zadelakrować zmienną unsigned long Czas_Pracy_Led = 60000UL;  żeby mógł ten czas zmieniać z poziomu programu. Mam ją w pliku nagłowkowym i teraz chciałbym, żeby z poziomu programu zmieniać sobie czas.

 

#ifndef Flash_h
#define Flash_h

#include "Arduino.h"

class Flash
{
  public:
    
    Flash(int pin1, int pin2, int pin3, int pin4, int pin5, int pin6, int pin7, int pin8, int pin9, int pin10);
    void begin();
    void Store_EEPROM();
    void ReadEEPROM();
    void Funkcje_Przycisku();
    void ledStart();
    

  private:

    int _pin1;
    int _pin2;
    int _pin3;
    int _pin4;
    int _pin5;
    int _pin6;
    int _pin7;
    int _pin8;
    int _pin9;
    int _pin10;

int czas = 50;
int czas2;
byte ile = 0;
uint8_t save = 0;
unsigned long times;
unsigned long aktualnyCzas;
unsigned long zapamietanyCzas;
unsigned long Czas_Pracy_Led = 60000UL; 
byte stan = 0;
int adress = 0;
int adress2 = 1;
int adress3 = 2;
bool flaga = false;
long Przycisk_Drgania_Styku = 50;
int  Stan_Przycisku = HIGH;
int  Poprzedni_Stan_Przycisku = HIGH;
unsigned long Czas_Ostatniego_Wcisniecia = 0;

};

#endif

 

Edytowano przez nebraska
Link do komentarza
Share on other sites

Dodaj metody publiczne (setter i getter), w setterze możesz dodatkowo sprawdzać czy podano jakąś sensowną wartość.

A w ogóle przemyśl czy coś nie powinno być protected a nie private.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Dobrym zwyczajem jest użycie np. camelCase to nazw funkcji czy metod, PascalCase do klas i typów złożonych, a snake_case do zmiennych. Któregoś pięknego dnia sam się do tego zastosuję 😉

 

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
Share on other sites

2 godziny temu, ethanak napisał:

Dodaj metody publiczne (setter i getter), w setterze możesz dodatkowo sprawdzać czy podano jakąś sensowną wartość.

A w ogóle przemyśl czy coś nie powinno być protected a nie private.



przykład:

// W Nagłowku
class Test
{
    public:
         int getX();
         void setX(int newX);
    private:
         int x;
}

// W Zródle 

int Test::getX()
{
     return x;
}

void Test::setX(int newX)
{
      x = newX;
}

Czyli powienienm zasotosować coś takigo?

Nie wiem jeszcze jak tego użyć w swoim przykładzie. Próbuje ale nic nie wychodzi.

Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.