Go Down

Topic: [RISOLTO ] Azzeramento lettura tachimetro a veicolo fermo (Read 142 times) previous topic - next topic

droidprova

Benritrovati ragazzi!

ho appena inserito in un progetto esistente la funzione di tachimetro. L'unica cosa è che a veicolo fermo non riesco a capire come poter azzerare la lettura del tachimetro che resta ferma all'ultimo calcolo effettuato.

Il progetto è molto semplice, usando un reed su interrupt misuro il tempo tra due passaggi e poi faccio qualche calcoletto conoscendo il diametro della ruota. Questo il codice in breve:

Code: [Select]
//==============================================================
//                        INTERRUPT
//==============================================================
// variabili tachimetro

volatile unsigned long delta;
volatile unsigned long tempo_1;
float Speed;

// variabili interrupt

const byte interruptPin = 2;
volatile unsigned long ContatoreImpulsi;

//==============================================================
//                          SETUP
//==============================================================
void setup() {
  attachInterrupt(digitalPinToInterrupt(interruptPin), conteggio, RISING);   // cambio stato da low a high
  }

.....

void conteggio() {
  ContatoreImpulsi ++;
  delta = millis() - tempo_1;
  tempo_1 = millis();
}
//==============================================================
//                         TACHIMETRO
//==============================================================
void tachimetro() {
  Speed= (((1.82 / delta) * 1000) * 3.6); // velocità in km/h
}

brunello22

Ad esempio controllando se ContatoreImpulsi dopo un certo tempo non viene più incrementato

droidprova

#2
Aug 23, 2019, 10:07 am Last Edit: Aug 23, 2019, 10:08 am by droidprova
Grazie Brunello!

infatti ci avevo pensato in termini di ragionamento, ma ho problemi a concretizzarlo in codice. Avevo pensato di inserire nella funzione techimetro() questo:

Code: [Select]
if ((millis() - tempo_1) > 1500) { // timeout 1.5s
   if (ContatoreImpulsi .....){  // come verifico il non aumento di ContatoreImpulsi?
   Speed= 0; // azzero velocità in km/h
   tempo_1 = millis();
   }
 }

nid69ita

#3
Aug 23, 2019, 10:12 am Last Edit: Aug 23, 2019, 10:12 am by nid69ita
Quando memorizzi tempo_1  devi anche memorizzare il vecchio valore di contatoreimpulsi
my name is IGOR, not AIGOR

droidprova

Quando memorizzi tempo_1  devi anche memorizzare il vecchio valore di contatoreimpulsi
ma su una variabile creata ad hoc? e comunque mi sfugge il ragionamento... puoi approfondire se ti va?

Grazie nid

droidprova

forse ci sono:

Code: [Select]
//==============================================================
//                        INTERRUPT
//==============================================================
// variabili tachimetro

volatile unsigned long delta;
volatile unsigned long tempo_1;
float Speed;

// variabili interrupt

const byte interruptPin = 2;
volatile unsigned long ContatoreImpulsi;

//==============================================================
//                          SETUP
//==============================================================
void setup() {
  attachInterrupt(digitalPinToInterrupt(interruptPin), conteggio, RISING);   // cambio stato da low a high
  }

.....

void conteggio() {
  ContatoreImpulsi ++;
  delta = millis() - tempo_1;
  tempo_1 = millis();
  ContatoreImpulsi = 0;
}
//==============================================================
//                         TACHIMETRO
//==============================================================
void tachimetro() {
  if ((millis() - tempo_speed) > 1500) && (ContatoreImpulsi == 0))
  {
    Speed = 0;
    tempo_speed = millis();
    }
  else {
    Speed = (((1.82 / delta) * 1000) * 3.6); // velocità in km/h
    }
  }


che dite?

nid69ita

#6
Aug 23, 2019, 01:31 pm Last Edit: Aug 23, 2019, 01:34 pm by nid69ita
ma su una variabile creata ad hoc? e comunque mi sfugge il ragionamento... puoi approfondire se ti va?

Grazie nid
Si, esempio tra le globali:  unsigned long ContOLDImpulsi;

if (ContatoreImpulsi != ContOLDImpulsi) {  // come verifico il non aumento di ContatoreImpulsi?
Ed ovunque hai
tempo_1 = millis();  devi anche aggiungere ContOLDImpulsi=ContatoreImpulsi;
my name is IGOR, not AIGOR

droidprova


Datman

#8
Aug 25, 2019, 11:14 am Last Edit: Aug 25, 2019, 11:15 am by Datman
Leggerei il contatore a periodo fisso nel loop, ad esempio ogni 0,25 secondi, e calcolerei la velocità in base a contatore e a millis() memorizzato all'ultimo aggiornamento del contatore.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

droidprova

Grazie 1000 nid69ita, l'azzeramento funziona da manuale!

x Datman: proverò anche il tuo suggerimento per imparare qualcos'altro!

Go Up