Buongiorno. Mi chiamo Mauro. Sto cercando di misurare l'angolo di un albero motore Co un potenziometro. Sono riuscito a visualizzare i valori in gradi sul serial monitor. Il problema è che continua a farmi vedere i valori ad ogni misurazione, mentre io vorrei che visualizzasse solo il valore successivo. Tipo 1 2 3 4 5 e così via.
In pratica che scrivesse sul ser. Monitor il valore solo quando questo aumenta di uno.
Ciò mi serve perché ogni volta che passo al grado dopo, dovrà dirmi la misura dell'alzata di una valvola. Senza continuare a darmi valori ad ogni lettura. Vi ringrazio anticipatamente per l'aiuto. Buona giornata. Mauro
Ti devi salvare il valore in una variabile (Es. valorePrecedente) e poi confrontarlo con l'attuale lettura
if (valoreLetto==(valorePrecedente+1)) {
...stampa...
valorePrecedente = valoreLetto;
}
N.B. = Le parentesi sono di troppo ma penso aiutino a comprendere meglio il confronto per chi è alla prime armi
... metterei piuttosto
if (valoreLetto != valorePrecedente) {
così stampa quando il valore che legge è diverso dal precedente ... potrebbe difatti girare più velocemente ed aumentare più di uno, o potrebbe girare al contrario e scendere
Guglielmo
Si avevo il dubbio anch'io ma mi sono attenuto strettamente alle sue specifiche
Grazie mille. Ci provo. Intanto cercherò un manuale e mi metterò a studiare.
Nel REGOLAMENTO, al punto 16.1, trovi delle indicazioni
Guglielmo
Purtroppo non sono riuscito a farlo funzionare. Sicuramente è necessario che prima colmi le mie lacune con una lettura adeguata. In seguito ci riproverò e vi chiederò consiglio. Grazie e a presto.
La soluzione è al post#3, devi per forza memorizzare il valore precedente e confrontarlo con quello attuale, se diverso lo stampi, altrimenti no.
metti un if che condiziona la stampa della lettura.
Ciao! Infatti come suggerito ora funziona. Ho letto un po' e sono riuscito a compilare un programma funzionante. Ora sto cercando il modo che, al secondo giro, segni dai 361 ai 720 gradi.
Con il programma che ho fatto si inchioda a 359 e non va più avanti. Ho fatto parecchi tentativi ma finora acqua.
Se non metti tutto il programma (mi raccomando i tag CODE) ... difficilmente possiamo aiutarti
Guglielmo
Strano valore... Pubblica il programma!
I giri andranno da 0 a 359, se nel tuo codice dopo 359 non c'è 360 ma azzeri... devi prevederlo
Sarebbe veramente ora che lo facesse
eccomi. scusate ma usavo il cellulare e non riuscivo a pubblicarlo.
int vecchio_val;
int gradi;
void setup() {
pinMode (13,OUTPUT);
Serial.begin(9600);
vecchio_val = gradi;
// put your setup code here, to run once:
}
void loop() {
int valore = analogRead(A1);
int gradi = valore*0.3529411720;
if (gradi-1 >= (vecchio_val)) {Serial.println(gradi);Serial.print(valore);
vecchio_val = gradi;}
delay(10);
// put your main code here, to run repeatedly:
}
L'ho copiato ed incollato cosi', spero vada bene.
Legge la posizione del potenziometro, che produce tensioni da 0 a 5V, quindi angoli da 0 a 360 gradi. Se il potenziometro non ha blocchi, continua la corsa e i valori ricominciano da zero.
Puoi verificare se c'è stato un passaggio da un valore maggiore di 350 gradi a un valore minore di 10 gradi e in quel caso sommi 360; se c'è stato un passaggio opposto, sottrai 360. Naturalmente devi memorizzare i gradi aggiunti in una variabile, che varrà 0 se è il primo giro o 360 se è il secondo giro.
Non usare nomi a caso per le variabili. Per esempio, puoi scrivere:
gradi = analogRead(A1)*0.3529411720;
gradi_prec = gradi;
Inoltre, hai definito una variabile gradi globale e poi una nuova variabile gradi locale nel loop!
if (gradi-1 >= (vecchio_val))
Puoi scrivere più semplicemente e più comprensibilmente:
if(gradi>gradi_prec)
Il delay alla fine non serve.
Togli le righe vuote inutili e i vecchi commenti rimasti. Tieni in ordine il programma!
Se scrivo un programma che legge solo il potenziometro lui manda fuori valori in continuazione, ma, quando fa un giro, ricomincia da capo. Invece, quando uso il programma, fatto per visualizzare il valore solo quando si sposta in più, arrivato a 359 si ferma anche se vado avanti. Non riesco a capire il motivo. È una settimana che mi arrovello con mille modifiche, ma purtroppo non trovo la spiegazione.
Togli quel -1 e metti come ho scritto io.
Prima regola della buona programmazione
Per quanto ho capito, il valore di gradi inizia di nuovo da 0 ogni giro, no? Allora, come fai il println e assegnazione di vecchio_val quando gradi > vecchio_val, una volta vecchio_val è arrivato a 360, già non sarà mai true questo if. Per quello vedi unicamente "il primo giro"
Sì, certo: da 360 a 0, gradi è minore di gradi_prec!