Go Down

Topic: Maledette funzioni!! (Read 15075 times) previous topic - next topic

leo72

Code: [Select]
int buttons[3] = {3,4,5};
Usa il tipo byte per i pulsanti, tanto hanno numeri che non passeranno mai il valore max di un byte (255).
Quindi
Code: [Select]
byte buttons[3] = {3,4,5};

Inoltre vedo che istanzi la seriale software ma poi nel setup non la inizializzi. Se non ti serve, potresti toglierla per recuperare RAM (togli il suo buffer dalla memoria). Visto che lavori con i float, e che ogni variabile float prende 4 byte, più RAM hai libera e meglio è per il tuo programma.

paolometeo2

#31
Aug 12, 2013, 02:46 pm Last Edit: Aug 12, 2013, 02:50 pm by paolometeo2 Reason: 1
Quote
Usa il tipo byte per i pulsanti, tanto hanno numeri che non passeranno mai il valore max di un byte (255).
Quindi

Giusto!
Quote
Inoltre vedo che istanzi la seriale software ma poi nel setup non la inizializzi. Se non ti serve, potresti toglierla per recuperare RAM (togli il suo buffer dalla memoria). Visto che lavori con i float, e che ogni variabile float prende 4 byte, più RAM hai libera e meglio è per il tuo programma.

La seriale software è richiesta dallo shield GPS. Ho copiato le istruzioni dallo sketch di esempio di Adafruit.  Credo che l'inizializzazione sia dentro la funzione di libreria GPS.begin(9600).
paolo
www.meteoenergia.it

leo72


La seriale software è richiesta dallo shield GPS. Ho copiato le istruzioni dallo sketch di esempio di Adafruit.  Credo che l'inizializzazione sia dentro la funzione di libreria GPS.begin(9600).

Giusto, non pensavo a questo.

paolometeo2

Ecco il programma completo in Attach. E' possibile definire 3 punti, che possono essere selezionati tramite i 3 pulsanti posti su LCD color. Il programma calcola la distanza con il punto selezionato e la direzione in cui si trova.
paolo
www.meteoenergia.it

PaoloP

Paolo, perché non cambi il titolo alla discussione e alleghi il file nel primo topic con una spiegazione?
Il titolo lo devi cambiare sempre nel primo topic.  :smiley-mr-green:

testato

#35
Aug 17, 2013, 07:12 pm Last Edit: Aug 17, 2013, 07:16 pm by Testato Reason: 1
concordo con la modifica del titolo, e se alleghi uno schema elettrico sarebbe un ottimo topic da inserire in Megatopic.

Questo progetto e' importante, oppure e' sbagliato  :)
perche' dico questo ? perche' ci e' sempre stato detto che con arduiino non si potessero raggiungere precisioni al metro.

Come stanno le cose ?


x il discorso delle funzioni perche' dici che non puoi ragionare piu' con subroutine ?
Io ancora non uso funzioni con passaggi di parametri oppure return di valori, quindi appunto faccio tutto con funzioni Void e gestione dei dati via variabili globali. Non e' obbligatorio usare funzioni non void e con argomenti.
Domande:
ci sono casi in cui e' obbligatorio usare argomenti e return di valori?
usare funzioni "complete" e' questione di stile, di risparmio memoria, o entrambi ?
grazie
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

1) non so se il progetto ha tutti i requisiti per andare in Megatopic (mancherebbe la questione del "grosso interesse")
2) la questione dell'usare o meno funzioni con argomenti e/o con restituzione di valori (per favore, NON usate "ritornare": è un inglesismo schifoso, viene da "return", che suona stridente quanto "voltaggio" suona alle orecchie di un elettronico) non è una questione di gusti ma di necessità. Nel senso che le usi se ti servono. Se fai una funzione che applica un certo algoritmo ai parametri che riceve e poi restituisce il risultato in una var globale e questa funzione la chiami da più punti del programma, devi stare attento a non fare confusione nel codice perché potresti sovrascriverla.

astrobeed


perche' dico questo ? perche' ci e' sempre stato detto che con arduiino non si potessero raggiungere precisioni al metro.
Come stanno le cose ?


Arduino non ha i double quindi i calcoli col GPS non si possono fare con risoluzione metrica, solo kilometrica, cosa ampiamente discussa nel topic dei quadricotteri.
Basta farsi un paio di calcoli di prova per capirlo, il gps fornisce valori fino a tre cifre intere e sei cifre decimali, i modelli migliori (=$$$) anche sette-otto, i float 32 bit al massimo rappresentano sette cifre tra parte intera e decimale.
In Italia la latidudine media è ~40°, la longitudine media è ~12° (andando molto a Nord scende sotto il valore di 10), ovvero valori con due cifre per la parte intera il che vuol dire perdere l'ultima cifra decimale fornita dal gps, poi mettiamoci gli errori di arrotondamento, molto pesanti per via della complessità del calcolo, ed ecco che la risoluzione minima reale diventa da molte decine di metri a diverse centinaia, la precisione reale è kilometrica.
Scientia potentia est

testato


Se fai una funzione che applica un certo algoritmo ai parametri che riceve e poi restituisce il risultato in una var globale e questa funzione la chiami da più punti del programma, devi stare attento a non fare confusione nel codice perché potresti sovrascriverla.

Pero' se faccio attenzione a non sovrascriverla funziona tutto ? possiamo dire quindi che e' soggettivo usare argomenti+restituzioni rispetto a manipolazioni di var globali ?
Sotto l'aspetto dell'occupazione di memoria, oppure di velocita', ci sono differenza tra i due metodi ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

E' vero che ogni volta che crei una funzione che accetta dei parametri devi mettere questi dati nello stack, ma se usi una var globale e poi se devi parcheggiare la variabile globale in altre variabili, alla fine occupi lo stesso della memoria per le variabili tampone.

E comunque non è elegante  ;)

testato


ed ecco che la risoluzione minima reale diventa da molte decine di metri a diverse centinaia, la precisione reale è kilometrica.


quindi questo progetto ha un qualche errore di valutazione da qualche parte, visto che dichiara
Quote
Adesso, dopo queste prove, sono abbastanza sicuro che i float di Arduino sono abbastanza precisi da garantirmi qualche metro, che è la stessa precisione di un buon GPS.  
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

testato

#41
Aug 17, 2013, 08:14 pm Last Edit: Aug 17, 2013, 08:18 pm by Testato Reason: 1

E' vero che ogni volta che crei una funzione che accetta dei parametri devi mettere questi dati nello stack, ma se usi una var globale e poi se devi parcheggiare la variabile globale in altre variabili, alla fine occupi lo stesso della memoria per le variabili tampone.
E comunque non è elegante  ;)

Grazie, sono metallaro  ;)
Diciamo che al punto dove sono ora, non essendo un programmatore, mi accontento di non essere elegante, l'importante e' che mentalmente mi risulta piu' facile ragionare sui codici che scrivo usando solo var globali. Logicamente resta cmq importante saper leggere una funzione con argomenti e return di valori, altrimenti non si capisce il codice che si vuole copiare scrivere  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Per "eleganza" intendo anche ottimizzato e leggibile. Anche per te stesso  ;)
Mi fai questo con una funzione che non restituisce niente e non accetta nessun valore?  ]:D ]:D
Code: [Select]
int e = media(media(a, b), media(c, d));

int media(int temp1, int temp2) {
  return ((temp1 + temp2) / 2);
}

testato

#43
Aug 17, 2013, 08:49 pm Last Edit: Aug 17, 2013, 08:53 pm by Testato Reason: 1
ci lavoro  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

ratto93

Assomiglia un sacco al mio, a Bassano non l'avevi visto Paolo ? :)
Non uso una bussola digitale però salvo su SD, ho integrato una batteria al Litio ed un carica batterie tramite mini-usb, lo schermo è il classico nokia 5100 :)
se vuoi ti posto il codice pure del mio se ti interessa :)


ed ecco che la risoluzione minima reale diventa da molte decine di metri a diverse centinaia, la precisione reale è kilometrica.


quindi questo progetto ha un qualche errore di valutazione da qualche parte, visto che dichiara
Quote
Adesso, dopo queste prove, sono abbastanza sicuro che i float di Arduino sono abbastanza precisi da garantirmi qualche metro, che è la stessa precisione di un buon GPS.  


Qui mi chiedo come sia possibile, il mio è abbastanza preciso ma tempo addietro feci delle prove nel calcolare la distanza ed in effetti l'errore era decisamente alto, ora non ho letto tutto il topic per mancanza di tempo però vorrei capire come sia possibile che l'errore su a me su cento metri ne segnava 180 e a te ? :)
ciaooo
Se corri veloce come un fulmine, ti schianterai come un tuono.

Go Up