Programma

Salve a tutti volevo rilevare la velocità instentanea dell'automobile.. per quanto riguarda l hardware non ho problemi ma riguardo la programmazione sono negato: Grazie ad alcune guide su internet sono arrivato a questo programma: P.s ho messo due fotodiodi in linea ad un foro della ruota così che avviene la trasmissione e mi alimenti ad un pin in questo caso 5 su arduino il tempo in cui la ruota fa un giro:long tempo_trascorso; long durata; long duratasec; long giri; long secondi;

void routine_di_servizio_interrupt(){ durata=millis()-tempo_trascorso; giri = 16129 // giri che la ruota deve fare per arrivare a 1km tempo_trascorso=millis(); }

void setup(){ attachInterrupt(5,routine_di_servizio_interrupt,RISING); duratasec= durata / 1000000; // trasformazione intervallo da microsecondi a secondi secondi = duratasec * giri; velocità = secondi/ 3600; // 3600 secondo racchiusi in un ora Serial.println ( “velocità in km/h =” velocità); } Volevo chiedervi a cosa devo sostituire a routine_di_servizio_interrupt poi se devo definire qualche librearia qualche variabile costante non so... Se il programma che conti l intervallo di tempo e esatto Se i calcoli e il serial.println e giusto

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

my2cents: mai visto un newbie usare gli interrupt... ma ok... :)

Routine_servizio viene teoricamente invocata ogni volta che si alza il pin. La routine ti mette in DURATA... non in tempo trascorso, il tempo che ha impiegato a fare il giro (diciamo che il primo giro però è di prova perchè non ha la lettura.

Nella routine continui a scrivere la variabile giri...quella è una costante che metterai incima al programma.... non dentro nella routine di interruzione.

Manca, stranamente il ciclo loop. Togli dalla procedura di setup i conteggi: devi farli, eventualmente, in loop. Non ho voglia di mettermi a controllare i calcoli: mi incappello sempre :) specie dopo la birra di stasera meglio non esprimersi... però noto che scrivi:

duratasec= durata / 1000000; // trasformazione intervallo da microsecondi a secondi
secondi = duratasec * giri;

... sono tutti long... praticamente appena fai la divisione della durata in millisecondi ti ritrovi con un intero: probabilmente 0 o se sei lento 1.... allora la divisione tienila alla fine oppure (soluzione inelegante) passa ai double per fare i conti.