[Risolto] Problema con millis()

Salve, sto facendo un tachimetro con arduino. Il codice tecnicamente funziona, solo che vorrei visualizzare tramite serial.print i km/h con un refresh di un secondo. Se metto il serial.print "libero" nel loop tutto ok, visualizzo il dato in maniara corretta, mentre se lo inserisco in un if con millis() mi da dei valori moooolto distanti da quelli reali...
Boh io non so più come fare... Chi mi da un aiuto?
Uso un sensore ad effetto hall collegato al pin 2 in interrupt e calcolo il tempo trascorso tra un impulso e l'altro con il timer2.

// Tachimetro

uint_fast8_t conteggio;
unsigned long intervallo;
unsigned long rangeTOT;
unsigned long Timer01;
double KmH;
int crfRuota = 605;     //circonferenza ruota in millimetri
bool calcola = false;




void setup() 
{
  Serial.begin(9600);
  attachInterrupt(0, conta, FALLING);
  Timer2();                            // inizializzo il timer2
  intervallo = millis() + 1000;
}

void loop()
{
  //Serial.println(KmH);  
   if (calcola == true) {
	  KmH = ((double)crfRuota / rangeTOT * 3.6);
	  calcola = false;
   }

   if ((long)(millis() - intervallo) >= 0) {
          intervallo += 1000;
	  Serial.println(KmH);            // non funge, valori strani
   }
}

void conta()
{
  conteggio ++;  
   if (conteggio == 1) {
	  conteggio = 2;
	  TCNT2 = 239;         // sincronizzo il timer2 con l'interrupt del sensore
	  Timer01 = 0;         // resetto il timer
   }
   if (conteggio == 3) {
	  rangeTOT = Timer01;
	  TCNT2 = 239;         // sincronizzo il timer2 con l'interrupt del sensore
	  Timer01 = 0;         // resetto il Timer
	  calcola = true;
	  conteggio = 2;
   }
}

void Timer2()
{
  //Imposto timer2 per un overflow ogni 1ms
  //periodo [sec] = (1 / f_clock [sec]) * prescale * (255 - count)
  //                (1/16000000) * 1024 * (255 - 239) = 0.001 sec

  TCCR2B = 0x00;      // Disabilita timer2 per effettuare le impostazioni

  TCNT2  = 239;       // Resetta il timer (255 - 239) = 1ms
  TIFR2  = 0x00;      // timer2 INT Flag Reg: cancello il timer overflow flag
  TIMSK2 = 0x01;      // timer2 INT Reg: timer2 overflow interrupt attivato
  TCCR2A = 0x00;      // timer2 Control Reg A: modalità generatore d'onda normale
  TCCR2B = 0x07;      // timer2 Control Reg B: Timer Prescaler settato a 1024
}


ISR(TIMER2_OVF_vect)
{
   
   TCNT2 = 239;          // Resetto il timer a (255 - 239) = 1ms
   TIFR2 = 0x00;         // timer2 INT Flag Reg: cancello il timer overflow flag   
   Timer01 ++;
   if (Timer01 >= 2000) {
	  conteggio = 0;
	  KmH = 0;           // azzero km/h se passano più di due secondi da un impulso
   }
}

Non sò se centri qualcosa, ma potrebbe questo aiutare?
Dichiarare la variabile KmH come volatile, essendoci un interrupt di mezzo?
http://arduino.cc/en/Reference/Volatile

volatile double KmH;

Ho provato a dichiarare la variabile volatile ma non cambia niente...
Il bello è che ho provato anche ad usare il timer2 al posto di millis() per gestire il refresh ma il problema rimane. Di sicuro sbaglio la logica di qualcosa, solo che non riesco proprio a capire cosa...

Allora... Credo di aver trovato il problema. Altro non era il filo che connette il sensore all'interrupt. L'ho tolto e reinserito e ha cominciato a darmi i dati giusti!
Quello che trovo strano era che prima che facessi questa prova, caricavo lo sketch con il serial.print libero nel loop e fungeva, poi lo caricavo con il serial.print nell'if e non fungeva più... Tutto questo senza toccare le connessioni.
Mah, mistero XD
Comunque se a qualcuno dovesse interessare lo sketch sappia che funziona perfettamente!

Un favore, modifica il titolo nel tuo primo post e aggiungi al titolo stesso [Risolto]

Fatto :wink: