salve a tutti, ho creato un encoder incrementale (1Fase), 16 fori, l ho fatto comunicare con due diodi infrarossi, uno mittente, l altro ricevente, il circuito creato sono sicuro che vada bene, la cosa che più mi preme e il codice che dovrebbe fare stampare sullo schermo (lcd presente nel kit started arduino uno) la velocità'.
lo sketch è il seguente
#include <LiquidCrystal.h>
# define NFORI 16
int time, N;
float f, UU;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
pinMode(6, INPUT);
lcd.begin(16, 2);
}
void loop()
{
N=0;
if(digitalRead(6)==HIGH) N=N+1; //se il secondo led riceve la luce..
time = 0;
while(time <= 3000) //esegue il ciclo per 3 secondi
{
lcd.print("creato da matteo");
if(digitalRead(6)==HIGH) N=N+1;
time=time+1;
}
f=N/3;
UU=(60*f)/NFORI;
lcd.clear();
lcd.print( UU );
delay(5000);
}
La velocità' la stampa, il problema e che non rimane costante, ma aumenta, e diminuisce casualmente, ogni tanto, diventa persino vegativa -_- ,e un mese che provo e riprovo a guardarmi il codice, senza nessun risultato. se qualcuno avesse la soluzione ne sarei grato. Grazie ancora, anticipatamente
Per favore il codice racchiudilo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può risultare non visibile (viene interpretato come attributo del testo).
quando lavori con i float e le divisioni è meglio dichiarare float anche le costanti, aggiungi virgola 0
f=N/3.0;
UU=(60.0*f)/float(NFORI);
Nel while da 3000 hai messo lcd.print("creato da matteo");
quindi stampi ben 3000 volte quella frase !!! L'LCD impazzirà
mettila prima del while (così la fa una volta sola)
Quel while hai commentato "esegue il ciclo per 3 secondi" ma chi te lo dice? Quel while cicla 3000 volte ma non sai quanto tempo ci mette. Leviamo quel lcd.print, ma le 3 istruzioni ad ogni ciclo sono il tempo di quel ciclo e non è detto sia 1 millisecondo *3000
grazie del consiglio, ne starò' più attento la prossima volta, il problema cmq sia, persiste, se io mando il disco a velocità' costante il valore dovrebbe rimanere costante mentre invece da me varia, ad' esempio da 280 giri/min mi passa a 140 giri/min, e non riesco proprio a capire dove sia lo sbaglio.
Secondo me sbagli nella logica.
Non puoi chiederti semplicemente se il pin 6 ti dà HIGH ma devi verificare la variazione da LOW a HIGH.
Se per assurdo l'encoder è fermo proprio su un foro (credo sia quello il caso di HIGH) allora digitalRead(6) è sempre HIGH.
esatto, ma l encoder non potra' mai essere fermo sul foro, quello che a me serve capire, che forse ho sbagliato, anzi sicuramente, è il tempo impiegato da un foro all altro, ovvero da {HIGH - LOW - HIGH }. io pensavo che tutte le volte che prendevo un valore alto, lo addizionavo a N, pero prima credevo che la durata di quel ciclo l'avessi impostata con i secondi, invece ho solo impostato il numero di volte che esegue il ciclo. potrebbe essere li l'errore, e come posso fare a preimpostare io una durata di tempo per quel ciclo ?