Arduino Forum

International => Italiano => Software => Topic started by: f.schiano on Dec 03, 2013, 02:41 pm

Title: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 02:41 pm
Ciao a tutti,

ho un programma scritto nell´arduino ide che é diventato abbastanza grande e quindi l´ho separato in diverse tabs.

Sono a conoscenza del fatto che l´arduino IDE compila le tabs in ordine alfabetico ma ho il seguente problema :

ho il mio main in un file chiamato "Controller_v3_2" l´unico con la lettera maiuscola delle mie tabs.
In questo file ci sta setup e loop

ho altre tabs tra cui quella "controller" in cui é implementata una funzione che ha la seguente firma:
Code: [Select]
void simplecontroller(float &V, int L,float Ldot, int &flag, int &S1, int &S2, int S1_delay_up, int S1_delay_down);

Questa funzione utilizza due funzioni:

Code: [Select]
void parse_delay(String &c, int (&delay_values)[16], boolean (&rise_fall_values)[16]);
void check_voltage_divider(String c);


queste funzioni sono implementate in una tab chiamata: "parsing" .

Quindi in ordine alfabetico ho:
Controller_v3_2, controller, parsing

Quando provo a compilare mi dice che la funzione:
parse_delay(.....); é undefined.

Sono daccordo con il compilatore ma non riesco a capire perché l´errore non me lo da con l´altra funzione chiamata:
check_voltage_divider();
Mi aspetterei un errore anche per questa funzione perché anch´essa é definita in una tab che in ordine alfabetico sta dopo la tab "controller" in cui viene richiamata.

vi dico anche che nella funzione simplecontroller() implementata nella tab "controller" la funzione
check_voltage_divider();
viene richiamata prima di quella che mi da errore:
parse_delay(.....);
Quindi mi aspetterei che l´errore sia prima dato dalla check_voltage_divider() e poi da parse_delay(.....);

Qualcuno puó aiutarmi?
Grazie.
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 03:08 pm

Sono a conoscenza del fatto che l´arduino IDE compila le tabs in ordine alfabetico


L'ordine di compilazione non è quello alfabetico, è determinato da come sono messi in sequenza i file nella riga di comando del compilatore e/o nel file make, l'ordine alfabetico riguarda solo come sono visualizzati i tab a partire da quello principale, che è sempre e comunque il primo.
Il tuo errore prima di tutto tocca vedere se è del compilatore o del linker, le cause sono errata scrittura del nome della funzione, basta una maiuscola al posto di una minuscola, mancato inserimento del file h con i prototipi, omissione del prototipo della funzione nel relativo file .h.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 03:10 pm
io ho un file .h che contiene l´inizializzazione delle variabili ma non i prototipi delle funzioni.

Devo inserire all´interno del file .h anche i prototipi delle funzioni?

Per prototipo intendi la firma giusto?

EDIT: se quello che dici é vero riguardo l´ordine alfabetico. Perché se rinomino la tab "parsing" in "a_parsing" il tutto funziona?
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 03:34 pm

Devo inserire all´interno del file .h anche i prototipi delle funzioni?


Si, i file .h servono principalmente per i prototipi delle funzioni.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 03:39 pm
se ho un file .h é buona norma averne anche uno .cpp ? e organizzare il tutto come in una libreria? oppure posso farne a meno e lasciare solo il file .h per definire i valori iniziali delle variabili e inserirci i vari prototipi?
Title: Re: Tab Multiple
Post by: leo72 on Dec 03, 2013, 03:49 pm
Puoi mettere un file .h con alcune definizioni. Ricordati solo di metterci anche un include "Arduino.h" nel tuo file header altrimenti in quel file non puoi usare le funzioni ed i comandi nonché i tipi specifici di Arduino.
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 04:31 pm

se ho un file .h é buona norma averne anche uno .cpp ?


E' il contrario :)
Per ogni file .c o .cpp ci dovrebbe sempre essere un file .h che contiene tutti i prototipi delle funzioni e le eventuali define, questo file .h deve essere incluso in tutti i file .c o .ccp che devono utilizzare le funzioni contenute nel file c/ccp abbinato altrimenti incorri nell'errore di funzione non definita.
Attenzione a non mettere delle variabili nei file .h perché poi ti ritrovi con errori di definizioni multiple se usi il file .h più di una volta.
Nel software scritto bene solitamente c'è un file common.h che contiene tutte le include e le define comuni a tutti i file c/ccp, così includi solo questo senza ogni volta dover scrivere un poema di #include  :)
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 04:49 pm
ok. Grazie mille . Ste cose dovrei saperle ma purtroppo essendo MAtlab il mio ambiente di programmazione preferito le dimentico spesso.

Comunque ho aggiunto al mio file initialization.h :

Code: [Select]
#include "Arduino.h"
      // LIBRARIES /////////////////////////////////////////////////////     
      // Library for the LED Strip
      #include <LPD8806.h>
      // Library for the DAC and the SD which are both working over SPI
      #include <SPI.h>
      // Library for more mathematical functions
      #include <math.h>
      // Library for Strings
      #include <String.h>
      // Library for SD card
      #include <SD.h>     


Ma ricevo un errore:
[font=Verdana]In file included from Controller_v3_2.ino:8:
/initialization.h:6: fatal error: LPD8806.h: No such file or directory
compilation terminated[/font]
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 04:50 pm

[font=Verdana]In file included from Controller_v3_2.ino:8:
/initialization.h:6: fatal error: LPD8806.h: No such file or directory
compilation terminated[/font]


Dove si trova il file LPD8806.h ?
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 04:51 pm
eh é quello che mi stavo chiedendo. Sta nelle libraries di arduino, dove ci sono tutte le altre librerie.

devo metterlo nella stessa directory del file .h ?
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 04:53 pm

eh é quello che mi stavo chiedendo. Sta nelle libraries di arduino, dove ci sono tutte le altre librerie.


Se è li o il nome è sbagliato oppure non si trova dentro la corretta cartella.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 04:57 pm
Ho appena controllato, la cartella LPD8806 si trova, con i rispettivi files all´interno nella cartella "libraries" di Arduino.

L´ho sempre inserita cosí una libreria e ha sempre funzionato.

Forse ho sbagliato a creare il file .h ? Perché per crearlo ho semplicementecreato un nuovo file e poi ho modificato l´estensione da .ino a .h .

Grazie
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 04:59 pm

Forse ho sbagliato a creare il file .h ? Perché per crearlo ho semplicementecreato un nuovo file e poi ho modificato l´estensione da .ino a .h


Per quale motivo hai aggiunto un file h ad una libreria già esistente ?
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:01 pm
scusami mi sono spiegato male.

Mi serviva la libreria LPD8806. Ho effettuato il download della cartella completa di :
examples
LPD8806.cpp
LPD8806.h

e l´ho copiata nella cartella "libraries" dell´arduino IDE.

Cosí funziona perché se scrivo:
Code: [Select]
#include <LPD8806.h>

in un qualunque sketch arduino , la libreria viene inclusa senza problemi.

Invece dal file .h mi da quel problema.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:04 pm
il file .h a cui mi riferisco é semplicemente un file .h che ho creato tra le mie tab e richiamo con

#include <initialization.h>

Quindi alla fine la mia cartella del progetto conterrá:
controller.ino
Controller_v3_2.ino
initializazion.h
parsing.ino
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:06 pm

il file .h a cui mi riferisco é semplicemente un file .h che ho creato tra le mie tab e richiamo con
#include <initialization.h>


Si ma questo file deve stare dove c'è il tuo sketch, non capisco perché hai dovuto creare un nuovo file .h dentro la cartella della libreria LPD8806.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:08 pm
no infatti non l´ho messo nella libreria LPD8806. Mi sono forse espresso male prima.

la cartella della libreria non l´ho minimamente toccata naturalmente.

Semplicemente, spostando gli include dal mio file main ( dove ci sta il setup() e il loop()) al mio file initialization.h, ho l'errore precedente.
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:10 pm

Semplicemente, spostando gli include dal mio file main ( dove ci sta il setup() e il loop()) a l mio file initialization.h, ho l´errore precedente.


Stiamo facendo il giro di peppe  :smiley-mr-green:
Posta tutto lo sketch, librerie extra incluse, magari sotto forma di file rar, altrimenti non ne veniamo mai a capo.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:14 pm
Ok. Ma se perdi troppo tempo lascia perdere che cerco di trovarlo da solo l´errore.

In ogni caso ti ringrazio tanto.
Fab.
Title: Re: Tab Multiple
Post by: gpb01 on Dec 03, 2013, 05:15 pm
Non ho seguito bene la discussione, ma ho letto l'ultima parte ...
... occhio che con l'IDE ci sono problemi ad includere librerie nelle librerie.

Ad esempio, io ho un mio .h che include la SoftwareSerial.h ... bene, se la SoftwareSerial.h NON la includo anche a livello di .ino, prima di includere il mio modulo .h che la usa ... l'IDE non la trova e da errore ...

Ho idea che tu sia nella stessa situazione ...  :smiley-roll:

Guglielmo
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:16 pm
Ciao Guglielmo e cosa intendi con "includere a livello di .ino"

Come dovrei fare?
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:19 pm
Meno male che ti avevo detto di non mettere definizioni di variabili dentro il file .h  :smiley-mr-green:
Il tuo initialization.h è un macello.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:20 pm
Lo so ... ma quello devo cambiarlo ancora. Un passo alla volta :(
Title: Re: Tab Multiple
Post by: gpb01 on Dec 03, 2013, 05:23 pm
Allora, io ho una mia libreria con il suo .h che deve usare la libreria SoftwareSerial.h ...
... naturalmente nel MIO .h c'è l'include della SoftwareSerial.h e avevo immaginato che includendo nel programma principale solo il mio .h dovesse bastare (... dato che la SoftwareSerial la uso solo dentro quella mia libreria e non nel programma principale).

E invece NO, se prima dell include del MIO .h non includo comunque il SoftwareSerial.h ... da errore ...
... credo sia una limitazione dell'IDE.

In pratica ... tutte le include che hai nel tuo initialization.h ... devi ripeterle ANCHE nel Controller_v3_2.ino ... e vedrai che compila ... ;)

Guglielmo
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:23 pm
Altra cosa, non puoi inizializzare una classe dentro un file .h, il tuo errore non è che non trova la libreria è che inizializzi la classe all'interno del file h.
Dentro il file .h ci devono stare solo i prototipi delle funzioni, le  #define, le #include, le pragma ed eventuali opzioni per la compilazione condizionale, però solo per le cose che ho elencato prima, tutte le altre cose è meglio che non le metti nei file .h a meno che non sai perfettamente quello che stai facendo e hai una buona esperienza con il C.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:25 pm
Ok. Io avevo pensato di fare cosí per far si che ci fosse un file che riunisse tutte le variabili che mi servono e che devono essere inizializzate sin da subito.
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:26 pm

E invece NO, se prima dell include del MIO .h non includo comunque il SoftwareSerial.h ... da errore ...
... credo sia una limitazione dell'IDE.


Si le include delle librerie di Arduino devono stare tutte nel file .ino principale, è un limite, ma anche un errore, di come l'IDE compone il file  da dare in pasto al compilatore.
L'uso del file .h generale è limitato solo ai file .h del progetto e le relative define, include, etc.
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:28 pm

Ok. Io avevo pensato di fare cosí per far si che ci fosse un file che riunisse tutte le variabili che mi servono e che devono essere inizializzate sin da subito.


Quello lo fai con una funzione dedicata, p.e. init_sys(), che si trova da qualche parte nel programma, non si fa nel file .h.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:29 pm
Ok va benissimo allora devo aggiustare un pó il mio codice.

Invece a proposito dell´errore che avevo prima? Non c´entra niente con questo vero?

Devo seguire il consiglio di Guglielmo?
Title: Re: Tab Multiple
Post by: gpb01 on Dec 03, 2013, 05:31 pm

è un limite, ma anche un errore, di come l'IDE compone il file  da dare in pasto al compilatore.


Si, infatti non so cosa combini con il codice ma con questa storia di voler creare lui i prototipi delle funzioni (... così poi, la prima volta che la gente invece di usare l'IDE usa un altro ambiente, impazzisce  ]:D ) e di gestire lui le include ... è un casino ...  :smiley-mr-green: XD :smiley-mr-green: XD
Title: Re: Tab Multiple
Post by: gpb01 on Dec 03, 2013, 05:32 pm

Devo seguire il consiglio di Guglielmo?


... puoi anche non seguirlo, ma tanto se non metti gli include nel .ino non ne esci ...  ]:D ]:D ]:D

Guglielmo
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 05:34 pm
ahahahah,  non intendevo dire che non volevo seguire il tuo consiglio. Ma volevo sapere se era quella la soluzione al mio problema precedente. :)

Grazie mille per l´aiuto .
Appena posso modifico il codice per averne uno piú pulito . Poi lo riposto cosí se avete tempo e vedete dei MACRO-ORRORI come mi ha fatto notare astrobeed continuo a fixarlo :) !

Grazie davvero,
scappo al mio corso di tedesco, a stasera!
Title: Re: Tab Multiple
Post by: gpb01 on Dec 03, 2013, 05:36 pm
... comunque .. mettere le include risolve una parte dei problemi ... poi saltano fuori altri errori nel codice degli altri pezzi ...  :smiley-roll:

Dovrai fare un po' di correzioni ... ;)

Guglielmo
Title: Re: Tab Multiple
Post by: leo72 on Dec 03, 2013, 05:45 pm
Tutto questo si può riassumere così:
l'IDE di Arduino non è fatto per strutturare il codice in questo modo  ;)
Title: Re: Tab Multiple
Post by: astrobeed on Dec 03, 2013, 05:53 pm

l'IDE di Arduino non è fatto per strutturare il codice in questo modo  ;)


Il modo di Fabrizio è sbagliato/incasinato a prescindere dall'IDE di Arduino, pure scrivendo il codice in C/C++, senza wiring, nel modo in cui l'ha strutturato il compilatore gli fa lo stesso le pernacchie  :)
Title: Re: Tab Multiple
Post by: leo72 on Dec 03, 2013, 05:57 pm
Non ho guardato il suo archivio... non mi permetto di commentare una cosa che non ho visto, per cui parlo solo delle "tab" dell'IDE. che più che tab multifile sono solo "rate" del programma principale  ;)
Title: Re: Tab Multiple
Post by: f.schiano on Dec 03, 2013, 11:46 pm
Astro ha completamente ragione. Il mio codice é incasinatissimo . Purtroppo come ho detto non sono un esperto di C .

Penso che la cosa migliore sará scrivere direttamente il tutto sotto forma di libreria. Che ne pensate?

Con il file .h seguendo le istruzioni di astro e il file cpp con le implementazioni delle funzioni.

Fab.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 04, 2013, 09:22 am
Ho provato, probabilmente non nel modo giusto, a fare quello che mi ha detto astro e ho messo l´inizializzazione delle variabili che mi servono in una funzione:

initialize_sys(){.........}

nella void setup() come prima istruzione ci metto:

initialize_sys();

Ma poi se cerco di usare una variabile come "BaudRate" che sta nella mia funzione initialize_sys(){... BaudRate=115200;}

Il compilatore mi dice che la variabile non é definita.

EDIT:
Sto dando un´occhiata a questo:

http://arduino.cc/en/Hacking/LibraryTutorial

Penso che leggendo questa pagina riesco a risolvere. :)
Title: Re: Tab Multiple
Post by: astrobeed on Dec 04, 2013, 09:31 am

Ma poi se cerco di usare una variabile come "BaudRate" che sta nella mia funzione initialize_sys(){... BaudRate=115200;}


Premesso che per il baud rate sarebbe meglio usare una #define, così non sprechi ram, però se le variabili non le dichiari come globali non le vedrai mai all'interno di altre funzioni.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 04, 2013, 09:37 am
ok ma quindi tornando al concetto di libreria, per definire queste variabili globali e NON dovendo inserirle nel file .h , devo inserirle semplicemente nel file .cpp al di fuori di una funzione e non all´interno della funzione initialize_system() ?

Title: Re: Tab Multiple
Post by: astrobeed on Dec 04, 2013, 09:41 am

ok ma quindi tornando al concetto di libreria, per definire queste variabili globali e NON dovendo inserirle nel file .h , devo inserirle semplicemente nel file .cpp al di fuori di una funzione e non all´interno della funzione initialize_system() ?


Tutte le variabili definite al di fuori di una funzione sono globali, se definite in un file diverso da quello in cui vengono utilizzate è necessario inserirle nell'header come "extern".
Esempio nel file "a.c", o .cpp, definisci come globale "int variabile", per poterla utilizzare nel file "b.c" devi dichiararla, nel header, come "extern int variabile".

Title: Re: Tab Multiple
Post by: f.schiano on Dec 04, 2013, 09:43 am
Ok. Ma allora cosa c´entra la funzione initialize_sys() ?

Non posso utilizzare una funzione per dichiarare delle variabili? Io in matlab lo faccio senza problemi richiamando una certa funzione ogni volta che apro un file. In C/C++ non c´é una cosa del genere?
Title: Re: Tab Multiple
Post by: astrobeed on Dec 04, 2013, 09:51 am

Ok. Ma allora cosa c´entra la funzione initialize_sys() ?


Ti serve per caricare i valori iniziali nelle variabili e per settare opportunamente l'ambiente di funzionamento se necessario, ovviamente stiamo parlando di programmazione C/C++ fatta in modo corretto, nonché portatile, e non dell'ambiente distorto di wiring :)
Se impari a programmare correttamente in C/C++ , ignorando le facilitazioni di wiring, hai solo da guadagnarci.
Se scrivi un programma in C/C++ in modo corretto è molto semplice trasportarlo (porting) su altra piattaforma, dovrai sistemare solo la parte di interfaccia diretta con l'hardware perché sicuramente diversa tra i vari micro, il codice di Arduino gira solo su Arduino, ovvero solo per i pochi processori supportati, il che è un grosso limite.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 04, 2013, 10:02 am
Ok. Questo mi é chiaro.

Io vorrei un codice il piú pulito possibile che sia pulito a un osservatore C.

Il mio obiettivo é dichiarare ed inizializzare delle variabili, é meglio fare il tutto dove sta il setup() oppure da qualche altra parte.

Vorrei utilizzare il concetto di libreria che mi sembrava adatto allo scopo ma mi sembra di non aver capito bene come funziona.

Ho creato 2 file:

Degreen.h e Degreen.cpp

Te li allego cosí forse ci capiamo meglio.
Title: Re: Tab Multiple
Post by: astrobeed on Dec 04, 2013, 10:20 am

Vorrei utilizzare il concetto di libreria che mi sembrava adatto allo scopo ma mi sembra di non aver capito bene come funziona.


Il mondo Arduino fornisce un concetto distorto di libreria, intanto tocca vedere se parliamo di C o C++, su i micro a otto bit il C++ è il male assoluto perché sciupone di risorse e porta facilmente ad errori "strani" dato che consente di riallocare la memoria con troppa disinvoltura, cosa che non è un problema su un pc dove di ram ne hai a tonnellate e ci sono meccanismi che la rilasciano in automatico quando non più utilizzata.
In C una libreria è semplicemente una raccolta di funzione, più o meno complesse, mirate alla soluzione di un problema specifico, p.e. la gestione di un sensore, tipicamente una libreria è composta da uno, o più, file .c e un singolo file .h generale, quello che va incluso negli altri file del programma, ed eventualmente altri file .h abbinati ai vari file .c, come devono essere usati è gestito dal file .h principale.
In C++ una libreria è un insieme di funzioni e/o di classi, stessa struttura della libreria C.
Una enorme differenza tra il C e il C++ è che il primo consente di sapere al momento della compilazione l'esatto impegno di RAM, il che impedisce eventuali errori run time  out of ram o straripamenti del heap space/stack..
Nel C++ puoi sapere solo l'impegno statico della RAM, dato che  il C++ ti permette di creare oggetti con dimensioni variabili a piacere in modo dinamico, p.e. una "string", diventa possibile andare in out of ram o far straripare l'heap/stack mentre il programma gira, per non parlare del fatto che l'implementazione C++ di avrgcc è soggetta a svariati limiti.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 04, 2013, 10:24 am
Quindi la cosa migliore probabilmente é tenere il programma semplice in questo caso e definirmi le mie variabili prima del setup e abbandonare questa STRANA idea di libreria che forse non é la migliore idea in questo momento.

Che ne pensi?

Cerco di fare uno schema del progetto che ho in mente su un foglio con tutte le funzioni che devo implementare.
Probabilmente aiuta.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 04, 2013, 10:53 am
non so quanto aiuti.

Ma ripeto il mio problema.

Ho tante funzioni che posso raggruppare in tante tabs perché ho le funzioni legate al DAC , le funzioni legate alla SD card etc.

Il problema ora é dove mettere l´inizializzazione delle variabili. All´inizio avevo pensato a un file .h perché viene compilato all´inizio (almeno credo).

Astro mi ha detto che non é il modo pulito di farlo e quindi ho cercato di virare verso la creazione di una libreria, ma probabilmente questa non é l´idea migliore. Quindi forse la soluzione é semplicemente aggiungere l´inizializzazione delle variabili in testa al file Controller_v3_2 dove c´é la funzione setup() e loop().

Cosa ne pensate?
Title: Re: Tab Multiple
Post by: Maurotec on Dec 06, 2013, 10:29 am
Se le funzioni che hai creato sono stabili e non necessitano di modifiche continue conviene pensare ad una libreria.
Quanto detto equivale a dire: se le api sono stabili crea una libreria.

Sicuramente incontrerai alcune difficoltà a creare delle lib, spesso di tende ad usare variabili pubbliche dentro le funzioni, con le lib la variabile pubblica non sarà visibile e dovrai usare extern oppure passarla come parametro.

Purtroppo devi fare una scelta, ho complicarsi la vita usando le lib con tutti i vantaggi che porta, oppure continuare con le tab e fare a meno di header file che porta sia vantaggi che svantaggi.

Ciao.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 06, 2013, 10:32 am
Penso che per ora lascio l´inizializzazione nel main file cioé prima delle funzioni setup e loop .

In questo modo non ho bisogno del file header.

Forse piú in la creeró una libreria.
Title: Re: Tab Multiple
Post by: Maurotec on Dec 06, 2013, 10:40 am
Se posti almeno la parte iniziale del ino in cui c'è l'inizializzazione, setup e loop si può parlare nel dettaglio al fine di dargli una sistemata che possa tornare utile alla manutenzione.

Ciao.
Title: Re: Tab Multiple
Post by: f.schiano on Dec 06, 2013, 10:46 am
Questo sarebbe davvero molto utile :)

Lo allego perché é molto lungo e non mi permette di incollarlo e dovrei fare piú post, spero vada bene :)

Qualunque aiuto é davvero ben accetto :)

Grazie davvero
Title: Re: Tab Multiple
Post by: Maurotec on Dec 06, 2013, 11:41 am
Prendo un pezzo di codice a caso.

Code: [Select]

// LED DRIVING  /////////////////////////////////////////////
      col=strip.Color(0,  127,  0); //green                      //
      for(i_led=0; i_led<strip.numPixels(); i_led++)             //
      {                                                          //
      strip.setPixelColor(i_led, 0);                     //
      }                                                          //
      lednumber=map(L,0,1010,1,nLEDs);                           //
      for(i_led=0; i_led<lednumber; i_led++) {                   //
      strip.setPixelColor(i_led, col);                   //
      }                                                          //
      strip.show(); // Refresh to turn off last pixel            //
      // end LED Driving //////////////////////////////////////////


i_led è una variabile globale, ma non la usi in modo globale, vero?
Qui la dichiari così int i_led=0; pensi che come di seguito potrebbe funzionare?

Code: [Select]

// LED DRIVING  /////////////////////////////////////////////
{  // apre un blocco tutto quello che viene creato qui scompare alla fine del blocco
        byte i_led = 0; // al termine del blocco i_led viene rimosso dallo stack
      col=strip.Color(0,  127,  0); //green                      //
      for(i_led=0; i_led<strip.numPixels(); i_led++)             //
      {                                                          //
      strip.setPixelColor(i_led, 0);                     //
      }                                                          //
      lednumber=map(L,0,1010,1,nLEDs);                           //
      for(i_led=0; i_led<lednumber; i_led++)
        {                   //
      strip.setPixelColor(i_led, col);                   //
        }                                                          //
      strip.show(); // Refresh to turn off last pixel            //
}  // chiude il blocco
      // end LED Driving //////////////////////////////////////////


Il codice è ben documentato. Ci sono alcune cose che andrebbero sistemate prima di pensare di dividere il codice in funzioni e tab. Potresti creare una tab initialize e dentro metterci delle funzioni che inizializzano le varie parti, funzioni che chiamerai da dentro setup(). Questo snellirebbe la funzione setup e inoltre se hai problemi con l'inizializzazione sai in quale tab cercare.

Vedi di usare sempre meno variabili globali. Quasi sempre le variabili indice del for e meglio che siano locali,
se non vuoi usare i blocchi {} puoi creare e inizializzare una variabile indice anche nella istruzione for: for (int i_led=0; i_led<...

Al momento usi dei rientri per evidenziare del codice che magari scorrendo con la rotella te lo perdi di vista, risolvi parzialmente con l'indentazione, ma non è cosa consueta e alla fine porta confusione. Per il momento continua così, vediamo se è possibile creare qualche function per snellire il codice usando al contempo meno ram, o meglio usando la ram strettamente necessaria.

Qual'è il motivo che ti porta a volere usare le tab? noti una difficoltà nello sviluppo del codice?

Ciao.