Problema di programmazione.

Per correggere l'indentazione nell'IDE di Arduino puoi premere CTRL + T.

Riguardo al codice.... ci sono ancora un pò di cose orripilanti. :fearful:

PaoloP:
Per correggere l'indentazione nell'IDE di Arduino puoi premere CTRL + T.

Riguardo al codice.... ci sono ancora un pò di cose orripilanti. :fearful:

hehehehehe, ok non sarà il masterpiece della programmazione..ma per lo meno so come l'ho fatto dato che sono partita da zero, ed è questo l'importante se me lo chiedono all'esame.
ma cosa c'è di così atroce a tal punto da orripilarti???? D: :astonished: :disappointed_relieved:

Il delay dentro il ciclo while.
L'Attach e il Detach continuo del servo.
L'uso di analogRead per la lettura di un pulsante digitale.
Il richiamo nel loop della funzione setGatePos()
La logica un po' contorta del programma. Più lo leggo e meno lo capisco. :grin: :grin:

PaoloP:
Il delay dentro il ciclo while.
L'Attach e il Detach continuo del servo.
L'uso di analogRead per la lettura di un pulsante digitale.
Il richiamo nel loop della funzione setGatePos()
La logica un po' contorta del programma. Più lo leggo e meno lo capisco. :grin: :grin:

:cold_sweat: vedrò di correggerlo..

La prima cosa che farei e quella di rivedere i tipi delle variabili. Se la variabile conterrà il valore massimo di 255 si usa il tipo byte che è una ridefinizione del tipo char. Se non si prevede che la variabile conterrà valori negativi il tipo deve essere "unsigned", quindi "unsigned byte" indica una variabile di 8 bit senza segno che può contenere il valore massimo 255, se mancasse "unsigned" il massimo valore positivo contenibile sarebbe 127 e 128 negativo. Stessa cosa per int il quale è grande 16 bit.

Il fatto di richiamare una funzione continuamente non è sbagliato, ma se è possibile evitare che venga eseguita anche quando non c'è ne bisogno è meglio.

Facciamo finta che sia io a dover andare dal punto di chiamata fino alla funzione, io devo caricarmi gli argomenti che pesano, entrare nella funzione eseguire codice per accorgermi poi che "pos" vale sempre 100. Se mi costasse così tanto dovere andare io a piedi nella funzione con il carico di argomenti sulle spalle, ci andrei solo se c'è veramente necessità. Putroppo alle volte non c'è alternativo o magari non la si trova, ma quanto meno la si è cercata. :stuck_out_tongue:

Per il discorso del pulsante acquisito tramite un'ingresso analogico anziche digitale il problema non sussiste, l'importante è sapere cosa comporta l'uso di un ingresso digitale (debounce) e come risolvere. Tra le altre cose l'uso di un ingresso analogico permette di collegare più pulsanti usando un solo ingresso, ma se gli ingressi digitali non sono impegnati di solito si usano questi anche per più di un pulsante.

PS: una chiamata a funzione richiede risorse, e queste sono limitate. Di contro l'uso di funzioni rende il codice più leggibile e più semplice da modificare.

Ciao.

MauroTec:
La prima cosa che farei e quella di rivedere i tipi delle variabili. Se la variabile conterrà il valore massimo di 255 si usa il tipo byte che è una ridefinizione del tipo char. Se non si prevede che la variabile conterrà valori negativi il tipo deve essere "unsigned", quindi "unsigned byte" indica una variabile di 8 bit senza segno che può contenere il valore massimo 255, se mancasse "unsigned" il massimo valore positivo contenibile sarebbe 127 e 128 negativo. Stessa cosa per int il quale è grande 16 bit.

Attento Mauro, che su Arduino "byte" è un alias per unsigned char. Quindi con byte già si dichiara un char di tipo senza segno capace di memorizzare un valore da 0 a 255.
Invece per int (e long) vale il dover usare unsigned se non si vogliono i valori negativi.

leo72:

MauroTec:
La prima cosa che farei e quella di rivedere i tipi delle variabili. Se la variabile conterrà il valore massimo di 255 si usa il tipo byte che è una ridefinizione del tipo char. Se non si prevede che la variabile conterrà valori negativi il tipo deve essere "unsigned", quindi "unsigned byte" indica una variabile di 8 bit senza segno che può contenere il valore massimo 255, se mancasse "unsigned" il massimo valore positivo contenibile sarebbe 127 e 128 negativo. Stessa cosa per int il quale è grande 16 bit.

Attento Mauro, che su Arduino "byte" è un alias per unsigned char. Quindi con byte già si dichiara un char di tipo senza segno capace di memorizzare un valore da 0 a 255.
Invece per int (e long) vale il dover usare unsigned se non si vogliono i valori negativi.

Verissimo, errore mio derivato dal fatto che da tanto tempo non uso più il core arduino, ma solo avr-libc e compilo sorgete C, anziché C++.

Visto che ci siamo, quello che segue è un estratto del file header Arduino.h:

typedef unsigned int word;

#define bit(b) (1UL << (b))

typedef uint8_t boolean;
typedef uint8_t byte;

Dove si vede che il tipo word in realtà è unsigned int, e byte usa un altro tipo ridefinito "uint8_t" al posto di "unsigned char", quindi scrivere "word parola;", "uint16_t parola;" ha lo stesso risultato di scrivere "unsigned int parola;"

Ciao.