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 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.
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
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.
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!