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
}
}