utilizzo di PulseIn per contare i giri di un albero rotante.

(//Mi sposto qui perchè stavo sbagliando sezione)

Dunque brevemente ho necessità di "leggere" i giri al minuto di un albero rotante ed in base alla lettura restituita di pilotare un relè/(o servocomando)

Ho provato da ignorante seguendo i Reference, a scrivere uno sketch per una volta senza usare quello di altre persone sicuramente più stabili del mio ma devo smetterla di copiare senò non imparerò mai nulla.

questo è lo sketch:

int led=5; //simula relè attuatore
int reedSW=2; //sensore di giri (reed switch)

unsigned long duratagiro;
unsigned long rpm;
unsigned long Hz;

void setup(){
pinMode (led,OUTPUT);
pinMode (reedSW,INPUT);
Serial.begin(9600);
}

void loop(){
duratagiro=pulseIn(reedSW,HIGH); //la durata del giro è uguale al tempo trascorso tra HIGH e LOW
rpm=60000000/duratagiro; //giri al minuto è uguale a 60 secondi fratto la durata di un giro
Hz=rpm*0.0166666666667;

if (rpm < 1000) { // legge se la velocità dell'albero è bassa
digitalWrite(led, HIGH); //eccita relè attuatore
}
if (rpm > 1200) { // legge se la velocità dell'albero è sufficente
digitalWrite(led, LOW); //diseccita relè attuatore
}

Serial.println(rpm);
Serial.println(Hz);

delay(300);

}

//Goretto beginner project 26/01/04

Funziona, il problema è uno solo, quando il sensore non produce più impulsi i valori restituiti schizzano alle stelle invece di andare a zero. So che mi manca qualcosa che dica all'arduino se passa X tempo tra un impulso Alto e un'altro Alto restituisci il valore di 0 a rpm e Hz ma non so come scriverglielo. :roll_eyes:

Essendo "duratagiro" al denominatore nel calcolo degli RPM, se tende a zero gli RPM tenderanno a infinito.
Se fosse uguale a zero avresti un errore a rum-time con conseguenze imprevedibili. (division by zero)

Metti un timeout al pulsein.

duratagiro = pulseIn(reedSW,HIGH, 1000000); // Timeout 1 secondo

Se va in timeout la pulsein restituisce 0.
A quel punto metti un if

if (duratagiro == 0){ // Pulsein è andato in timeout
  rpm = 0;
  Hz = 0;
}
else
{
  Hz = 1000000/duratagiro;  // numero di giri in un secondo
  rpm = Hz * 60;                          //  giri al minuto
}

Paolo, ti ringrazio davvero tanto! sono 4 giorni che provo ad adattare vari sketch e non riesco ad avere un buon risultato ora è perfetto! Avevo tentanto di mettere il timeout solo che poi non avevo implementato l'if per dirgli di considerare zero dopo di esso! errore davvero da principiante! il quale sono :grin:

Lo stesso sketch dovrebbe funzionare anche con un sensore magnetico di Hall? Lo chiedo perchè ho provato usando l'uscita tachimetrica di una ventola da pc senza risultati.

Funziona con tutti i sensori impulsivi.
Forse devi amplificare il segnale per distinguere bene gli stati HIGH e LOW.
Per la parte elettronica, non sono io il tecnico che tu stavi cercando. :grin:

Hai già risolto ogni mio dubbio sulla parte software e mi hai ridato fiducia! stavo iniziando a perdere l'entusiasmo. Per collegare l'hall in teoria basta un pullup al posto del pulldown e condensatore che ho ora sul circuito. Grazie ancora!

scusami ma non è più facile usare un encoder?
Max

Ciao Max. Premesso che sono un'apprendista al preABC, mi spiegheresti di cosa parli?