Go Down

Topic: Leggere il numero di giri di una vetola PC Nexus (Read 1 time) previous topic - next topic

lesto

devi modificare le condizioni nel while in modo che se supera un certo tempo dentro il while esce in automatico.
Poi quando esce in automatico potresti memorizzarti il fatto ed evitare i while fino a quando per caso non rilevi una differenza facendo una digitalRead ogni tanto.

oppure fai il passo successivo e usi gli interrupt
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

superzaffo

gli interupt li ho già provati, ma mi danno dei vincoli e non sono precisi.
Se intendi per leggere gli impulsi.

lesto

veramente gli interrupt son proprio il contrario;
precisi e meno limitanti, in quanto non bloccano il codice se non effettivamente quando avviene qualcosa..
in cambio sono un poco più complessi da usare, ma basta ricordarsi che le variabili tra loop e interrupt vanno dichiarate volatile e quasi tutto è ok.
Posta il codice degli interrupt che vediamo.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

@lesto:
l'ultima versione della pulseIn permette anche di iniziare a leggere mentre il pin ha uno stato diverso da quello atteso.
pulseIn(pin, value, timeout)
"value" è lo stato atteso, se lo stato è differente, la pulseIn attende che si verifichi lo stato atteso e poi inizia a cronometrare la durata dell'impulso.

superzaffo

Ciao.. questo è il codice... che usavo... ma con queste ventole non ho la lettura corretta.
Code: [Select]
cli();               
sei();               
                                 
int NbTopsFan;
int Calc;

                                 
int hallsensor = 2;

                       
typedef struct{                 
  char fantype;
  unsigned int fandiv;
}fanspec;


fanspec fanspace[3]={{0,1},{1,2},{2,8}};

char fan = 1;

void rpm ()     
{
NbTopsFan++;
}


void setup()
{
pinMode(hallsensor, INPUT);
Serial.begin(9600);
attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;
   sei();
   delay (1000);
   cli();
   Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


Scusa Leo ma non è come lo utilizzavo io ? Pulsein intendo...

Go Up