Una libreria è una raccolta di comandi che qualcuno ha già scritto per un determinato hardware o per eseguire un determinato calcolo, ad esempio.
Quindi, invece di scrivere ogni volta che vuoi accedere ad un display LCD tutto il software necessario, hai una libreria per accedere a quel display che devi includere nel tuo sketch.
"Includere" significa dire al compilatore di caricare un file esterno che contiene le funzioni che ti servono e considerarlo come se facesse parte del tuo sketch.
Una volta che hai incluso la libreria, tutte le funzioni di quella libreria sono disponibili nel tuo sketch e le puoi usare come qualsiasi altra funzione nativa di Arduino.
Ciao a tutti , e la prima volta che scrivo , come e poca la mia esperienza su arduino , il mio intervento qui e proprio nel fatto chè stavo cercando documentazione in merito alle Librerie , che cosa sono e cosa servono , e dalla spiegazione di Leo72 ho quindi capito in parte ciò che vorre afferrare meglio .
faccio quindi le mie domande che saranno banali per chi ha già eseguito queste funzioni , ma per chi come me e alle prime armi .... mi sono spiegato ,
1 le librerie si caricano ogni volta che si vuole sviluppare un progetto su cui richiede la libreria , esempio la libreria lcd se ho un display e che non mi servirà se ho la LAN , e così via .
2 queste librerie si trovano alcune già pronte alla voce sketch >import library del compialatore arduino ,Giusto ?
3 come faccio ad importarle nel compilatore per renderle pronte ?
4 Grazie mille per l'interessamento a tutto il Team Arduino
diegogribaudo:
1 le librerie si caricano ogni volta che si vuole sviluppare un progetto su cui richiede la libreria , esempio la libreria lcd se ho un display e che non mi servirà se ho la LAN , e così via .
2 queste librerie si trovano alcune già pronte alla voce sketch >import library del compialatore arduino ,Giusto ?
Giusto, giusto
3 come faccio ad importarle nel compilatore per renderle pronte ?
Se ne hai altre che intendi utilizzare puoi caricarle nella tua directory sketchbook, in una sottocartella libraries. la mia e' cosi' ad esempio
Grazie Federico ,con la tua spiegazione sono riuscito ad afferrare il concetto ,
io uso OSX , quindi la trovo dove ?
e in oltre , approfitto successivamente e ringrazio anticipatamente :
prima di eseguire un SKETCH devo caricare le librerie ma totalmente o solo menzionarle con
#include <EEPROM.h> e lui carica la libreria .
un altra domanda , i vai TAB presenti nell'interfaccia grafica per la compialazione di Arduino , se per esempio ho 2 o 3 tab per fare un esempio premo il tasto upload per scrivere su Arduino , scrive tutti i tab o solo quello aperto ?
No, basta l' include.
Le funzioni della libreria vengono messe nel programma compilato a secondo del uso che fai.
Dovrebbe compilare tutti i tab perche vede i tab un sketch unico.
Non so dove si trovano le librerie nell' installazione sotto OSX.
In Windows le librerie si trovano nella cartella:
"... arduino22/librarys" dove "arduino22" é la cartella dove hai installato l'IDE.
Ogni libreria deve essere messa nella cartella col stesso nome della libreria senó viene vista dal IDE ma non dal compilatore. Se fai un unzip automaticamente crea la catella giusta.
Ciao Uwe
le "tab" non sono uppate, a meno che non siano classi/librerie che sono richiamate nel file .pda
ah, se le librerie intendi modificarle/usarle per un solo progetto/chessò, puoi anche metterle nella cartella del progetto, e ti compariranno come tab.
però poi per richiamarle anziché fare #include <EEPROM.h>
devi fare #include "EEPROM.h"
è molto utile se per esempio stai usando delle librerie ufficiali arduino modificate, così non crei casini agli altri sketch
io suggerisco di non mischiare librerie ufficiali e non perché quelle ufficiali sono considerabili bug-free, quelle non ufficiali sono distribuite "senza garanzia"
dunque, salto il metodo di uwe per il motivo sopracitato, ne restano 2 nella tua cartella utente ci dovrebbe essere la cartella "sketchbook":
caso 1:
crei la cartella "libraries" e ci sbatti dentro la libreria dezippata. In questo modo sarà disponibile per tutti i progetti.
caso 2:
localizzi la cartella del tuo progetto, la apri e ci sbatti dentro la cartella della libreria (ricordati che in include potrebbe essere necessario mettere il nome della cartella tipo #include "nomecartella/EEPROM.h", e la libreria sarà disponibile solo per il progetto
entrambi i metodi dovrebbero funzionare per win, mac e linux (anche se varia la posizione della cartella utente, il resto è uguale)...
anzi forse per win nelle cartelle in include non si mette / ma \ (che sarebbe , ma essendo \ carattere speciale ci vuole doppio...)
Anch'io consiglio di creare la cartella "libraries" sotto a /sketchbook (che, tra l'altro, è anche il metodo "consigliato") in modo da non mischiare le librerie ufficiali da quelle non ufficiali. Questa divisione ha anche un altro vantaggio: quando si aggiorna l'IDE di Arduino ad una nuova versione non si è costretti a ricopiare tutta la cartella delle lib in /arduino-00xx ed a fare un controllo per vedere se una libreria faceva parte di quelle ufficiali o meno e per non sovrascrivere con una versione vecchia una libreria ufficiale aggiornata
Veramente io uso Linux... comunque la cartella /sketchbook la scegli tu in fase di primo avvio dell'IDE di Arduino.
Se non sai dov'è, menu dell'IDE -> Files -> Preferences e dovresti avere il suo percorso
è passato molto tempo e sono sicuro che hai trovato dove stanno le librerie nel mac.
Caso mai lo scrivo visto che non è arrivata la risposta.
Percorso:
root(hd dove hai il sistema mac)/utenti/iltuonomediloginalpc/Libreria/Arduino
Dovrebbe essere quella.
Aggiungo una domanda perchè ho provato a cercare la risposta e questo mi sembra un ottimo topic:
Parlando terra terra le librerie...... sono dei listati già pronti che fanno una determinata azione ?
Ad esempio se dovessi far accendere il FAMOSO LED quando mi arriva un impulso x di valore [a,b] invece di scrivere sempre lo stesso codice composto di 6 o 7 righe i muovo in questa maniera:
1 scrivo le sei o 7 righe e salvo il tutto con un nome. Quel nome è la mia libreria richiamabile ogni volta che ne ho bisogno.
Ma se è così è come il famoso Go To del basic che mandavi il computer a fare una determinata cosa per poi continuare dal punto appena sotto al Go To.
lesto:
le "tab" non sono uppate, a meno che non siano classi/librerie che sono richiamate nel file .pda
Lesto, non ho capito questo tuo passaggio.
Io suddivido il codice in varie tab in modo che sia più leggibile. Uso, ad esempio, una tab per setup e loop, una con le funzioni di gestione del diplay, una per l'RTC e un'altra con le funzioni della Eterneth shield.
Quando compilo il codice viene letto da tutte le tab, unito e poi "uppato" sull'Arduino.
lesto:
le "tab" non sono uppate, a meno che non siano classi/librerie che sono richiamate nel file .pda
Lesto, non ho capito questo tuo passaggio.
Io suddivido il codice in varie tab in modo che sia più leggibile. Uso, ad esempio, una tab per setup e loop, una con le funzioni di gestione del diplay, una per l'RTC e un'altra con le funzioni della Eterneth shield.
Quando compilo il codice viene letto da tutte le tab, unito e poi "uppato" sull'Arduino.
le parole magiche sono
a meno che non siano classi/librerie che sono richiamate nel file .pde
e non sono nemmeno tanto vere, perchè se non erro l'IDE arduino fa un piccolo lavoro di copia incolla unendo tutto il codice in un mega file unico, di cuoi però il compilatore ometterà nel file .hex le classi o le funzioni NON utilizzate, più altri piccoli trucchi.
Un piccolo esperimento, e mettere una Serial.println(micros());, poi un for vuoto da i=0 a i=36000, e poi di nuovo una millis(); il compilatore si accorge che quel for è inutile e lo elimina, quindi otterrai due risultati pressochè identici.
ed è anche "intelligente": se nel for fai a+=1; e poi la variabile "a " non la usi mai, anche quì si accorge ed esclude il for. se invece subito dopo la seconda millis() stampi su seriale "a", a questo punto il codice viene compilato nella sua interezza e noti una grossa diversità del risultato delle due chiamate millis()!!!!
a prima vista non centra molto, ma è per farvi capire (con esperimenti facili da riprodurre) che non sempre quello che scrivete viene compilato, ma anzi viene rimaneggiato anche molto profondamente
Bene, molto bene.
Quindi le librerie sono dei pezzi di code che fanno una operazione ben definita. Quindi se ti serve fare sempre la stessa SERIE DI FUNZIONI/OPERAZIONI fai un richiamo alla LIBRARY, una volta che la labrary citata ha finito di fare la sua serie di operazioni, ritorna al punto del tuo listato/codice dal quale ha avuto il richiamo.
Grazie a tutti ora ho capito perchè quando copio e incollo un listato/code mi dava una montagna di errori.....
Ciao a tutti, riesumo questo post che sembra avere un titolo e un argomento appropriato.
Mi chiedevo se fosse possibile indicare in una libreria che alcune funzioni sono disponibili solo per un certo Arduino, ad esempio dire all'IDE che ignori funzioni che 'richiamano' le seriali 1-2-3 se sto usando un UNO mentre concedere di usarle se uso un MEGA...
vorrei evitare di dover fare due librerie separate ma 'uguali'
mastraa:
Mi chiedevo se fosse possibile indicare in una libreria che alcune funzioni sono disponibili solo per un certo Arduino, ad esempio dire all'IDE che ignori funzioni che 'richiamano' le seriali 1-2-3 se sto usando un UNO mentre concedere di usarle se uso un MEGA...
Certo che è possibile, molte librerie di Arduino lavorano in questo modo, devi usare la compilazione condizionale per includere nel codice solo le porzioni compatibili col micro selezionato nel IDE.
Ti consiglio di guardare come sono fatte le librerie standard di Arduino per vedere come viene messa in atto la cosa.
Ecco un esempio di compilazione condizionale in base al tipo di micro preso dalla libreria Servo.
// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;
#elif defined(__AVR_ATmega32U4__)
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t;
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t;
#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t;
Gentilissmo, ti faccio un'ultima domanda stupida: dove posso trovare la classe Serial e le sue funzioni?
Volevo vedere in che modo definiva i pin da utilizzare in base al SerialX, a naso credo siano proprio tre classi differenti vero?
Stavo cercando di definire un modo per evitare ogni volta che voglio cambiare seriale ad un componente di dover sostituire SerialX con SerialY e modificare semplicemente una costante a inizio sketch. Per ora ho costruito una classe macchinosa che ogni volta che chiamo un print fa uno switch cercando la seriale memorizzata in fase di istanza...funziona, ma credo che non sia un metodo che garantisce prestazioni buone