Creare Librerie

normalmente le "librerie" arduino non sono altro che delle classi C++

mastraa: Inoltre è corretta il seguente schema come 'base' per tutte le librerie per il file *.c?

Non vorrei dire una cavolata, ma se il file contiene delle classi, deve essere .cpp e non .c [u]Mi sembra[/u] che il compilatore faccia questa differenziazione.

anche se non la facesse è sarebbe comunque uno standard de faco da rispettare.

ps. la mia risposta di prima era basata sulla pagina 1 del topic, non avevo notato la 2

Nel Reference ci sono anche delle guida utili --> http://arduino.cc/en/Reference/StyleGuide --> http://arduino.cc/en/Reference/APIStyleGuide

si scusa, ho scritto c perchè pensavo a un file c, chiaramente mi riferisco al cpp ;)

Quindi se non ho capito male conviene spostarsi alla funzione (come dice PaoloP) e quindi dichiarare x funzioni con ugual nome, ma diversi parametri

Oppure dichiarare più classi, ognuna con il suo costruttore (come dice lesto)

Capisco bene?

Quello che servirebbe a me è di fatto riunire in un unico codice alcuni funzioni matematiche, altre più 'personali' che mi servono per un progetto abbastanza pesante. In questo modo evito di inserire decine di funzioni che poi non mi servono, non scrivo tutto nel file ino che poi diverrebbe un casino e raccolgo tutto nello stesso posto.

Faccio un esempio: per una questione di sicurezza volevo fare in modo che il sistema fosse alimentato da un relay tenuto chiuso da Arduino stesso durante il lavoro, e si aprisse in caso un sensore mi desse un valore allarmante. Ad esempio la classe Off viene inizializzata sul pin 13 che comanda il relay. la funzione Off.securOff(); sa che spegne il relay indicato prima.

Nella stessa libreria però volevo inserire anche altre funzioni, che lavorano con pin differenti...

Quindi conviene fare una seconda classe e inizializzarla su un altro pin?

Scusate le domande idiote, ma conosco C++ solo lato Arduino in quanto ho avuto a che fare con altri linguaggi, seppur simili, all'università

mastraa: Oppure dichiarare più classi, ognuna con il suo costruttore (come dice lesto)

eh? dove? comunque no, anche il costuttore può essere sovracaricato, esattamente comne una normale funzione.

Nella stessa libreria però volevo inserire anche altre funzioni, che lavorano con pin differenti

SE vuoi usare le stesse funzioni ma su pin differenti, allora conviene istanziare un secondo oggetto passando come parametro il pin. Se le funzioni sono differenti, il problema non si pone, se non che teoricamente il codice va diviso in classi secondo logica, ovvero una classe che gestisce il relè di sicurezza non fa cose di matematica, ma ci sarà un altra classe che fa la matematica.

lesto:

mastraa: Oppure dichiarare più classi, ognuna con il suo costruttore (come dice lesto)

eh? dove? comunque no, anche il costuttore può essere sovracaricato, esattamente comne una normale funzione.

Nella stessa libreria però volevo inserire anche altre funzioni, che lavorano con pin differenti

SE vuoi usare le stesse funzioni ma su pin differenti, allora conviene istanziare un secondo oggetto passando come parametro il pin. Se le funzioni sono differenti, il problema non si pone, se non che teoricamente il codice va diviso in classi secondo logica, ovvero una classe che gestisce il relè di sicurezza non fa cose di matematica, ma ci sarà un altra classe che fa la matematica.

Avevo interpretato la tua risposta data ad un altro, ma l'ho letto in seguito questo. Ok grazie mille a tutti :)

Altrimenti prendi il tuo sketch, tagli le funzioni dal file .ino e le incolli in un file funzioni.h e lo #includi nello sketch.
Più semplice ancora, apri una nuova tab nell’IDE (pulsantino sotto quello del Serial Monitor) e sposti le funzioni che non ti interessano nel corpo principale.

Ma diamine! Siamo nel 2014 e ancora di questi post?

Digita su Google: "Creare librerie per arduino", ti escono 50 link solo in italiano!

BaBBuino: Ma diamine! Siamo nel 2014 e ancora di questi post?

Digita su Google: "Creare librerie per arduino", ti escono 50 link solo in italiano!

Che a seguirli tutti è una perdita di tempo dove non impari quasi nulla.

Chi riesce a condensare in 10 pagine l'argomento partendo da zero? Risposta: nessuno

Ciao.

zinim: Salve, qualcuno sa indicarmi una guida per creare librerie per arduino, ho comprato quattro libri sulla programmazione di arduino e nessuno di questi spiega come creare le librerire. grazie

Mauro, rileggi bene la richiesta. Non deve diventare un professionista del C, ma creare librerie per Arduino.

E se ci sono riuscito io (che sono una pigna) con quegli articoli , ci può riuscire chiunque. E questo senza leggere libri esoterici o diventare un Guru del C++

BaBBuino: Ma diamine! Siamo nel 2014 e ancora di questi post?

Digita su Google: "xxxxxxxxxx", ti escono yyy link solo in italiano!

Ecco, messo così lo si potrebbe applicare al 70% dei post che vengono pubblicati. :roll_eyes:

però poi lui ha postato il codice chiedendo una valutazione e consiglio sull'organizzazione del codice.. cosa che solo noi poveri umani possiamo fare.

Certo, avesse conosciuto il linguaggio a fondo avrebbe visto subilto la soluzione, ma inzomma siam stati tutti nabbi.

Se io ho bisogno di una funzione che mi ritorni 3 valori float come posso fare?

E’ meglio dichiarare tre variabili pubbliche poi utilizzarle nello sketch?

Se hai necessità che restituisca tre diversi valori potresti passarli come puntatori ed elaborarli all'interno della funzione oppure li dichiari globali e li hai sempre a disposizione.

grazie!!!

Una delucidazione, spero sia l’ultima per vedere se ho capito bene:

Variabile public:
Le posso usare sia nelle funzioni della classe, sia al di fuori e rimangono definite per ‘sempre’
Variale private:
Utilizzabili solo dentro alla classe, rimangono valide per ‘sempre’
Variabile dichiarate dentro una funzione (di una classe o meno):
Valgono solo dentro quella funzione e vengono ridichiarate ad ogni ciclo

E’ corretto?

Quindi se io ho bisogno di una variabile solo dentro una funzione di una classe, ma che rimanga anche alla chiamata successiva per una iterazione, la dovrei mettere private, se una mi serve averla sempre e accessibile ‘dallo sketch’ la devo mettere pubblica.
Se mi basta averla dentro a una funzione la dichiaro li dentro

prima di tutto c'è il tempo di vita delle variabili. Una variabile che viene istanziata all'interno di un blocco,muore alla sua fine. Un blocco è delimitatato da { } quindi una bariabile dichiartata in un blocco if, morirà al termine dell'if.

Poi c'è la visibilità; una variabile/funzione/classe public è richiamabile all'esterno della classe; una variabile/funzione/classe protected è richiamabile dalle sotto classi; una variabile/funzione/classe private è richiamabile dalla classe che la istanzia;

Riesumo nuovamente un topic sulle librerie per chiedere una spiegazione:

Innanzitutto ho trovato in giro delle librerie che non hanno bisogno di essere inizializzate dal costruttore, si tratta di librerie che non lavorano a classi? (Ho letto che le librerie non per forza devono essere organizzate in classi, come si fanno queste ultime?)

Ad esempio prendiamo la libreria Wire.h... non ha il costruttore no? come faccio a creare una libreria simile?

Se poi io volessi usare una libreria dentro un'altra libreria, oppure una funzione di comodo dentro alla funzione che non uso all'esterno, ma che alcune funzioni della stessa libreria richiamano. Come devo dichiararla?

Faccio un esempio pratico: ho 2-3 funzioni che elaborano dei dati letti da un sensore I2C, per la lettura voglio fare una funzione a sé che richiamo senza scrivere ogni volta...la dichiaro sempre allo stesso modo type CLASS::function(){}? e quando la richiamo la chiamo senza il costruttore (che ovviamente dentro alla libreria non so visto che è a discrezione)?

Spero di essere stato chiaro, anche se mi rendo conto di essere stato un po' contorto in alcuni punti

Ho fatto delle prove quindi esplicito meglio le mie domande e i miei dubbi:

  • Come funzionano le librerie senza classi di cui ho letto in internet e/o su qualche guida?
  • Una di queste è tipo la Wire? cioè una libreria che non ha bisogno di costruttore quando la uso? (per costruttore intendo qualcosa del tipo ClassName pinco; e poi uso pinco.function()...

Ho poi provato a vedere come funziona richiamare una funzione in una seconda funzione della stessa classe, ho visto che non serve il costruttore, ma se io ho bisogno di usare la funzione di un'altra classe o di un'altra libreria? Faccio un esempio: devo creare una libreria che mi serve a leggere due sensori I2C:

  • Voglio fare tutta una libreria in cui metto tre classi: Calcoli sensore 1, calcoli sensore 2, lettura sensori generica che mi servirà in entrambe le altre classi
  • Voglio includere una libreria dentro a questa (di fatto suddivido le tre classi sopra indicate in tre lib diverse), come faccio? Intendo dire tipo quello che si fa con Wire...la includo, uso il begin e posso usare le sue funzioni ovunque

Spero di essermi spiegato meglio :)