Go Down

Topic: Contachilometri (Read 5957 times) previous topic - next topic

Locke

#30
Jun 22, 2010, 11:58 am Last Edit: Jun 22, 2010, 12:07 pm by Locke Reason: 1
In effetti non ci avevo pensato al cambio di stato! più tardi provo ;)
Grazie infinite!

E se montassi 2 magneti a 180° e dimezzassi il tempo di campionamento?
Però a questo punto non misurerebbe velocità basse, poichè se il magnete non passa entro mezzo secondo non c'è calcolo... mmm  :D

Ho provato, ma sembra contare solo il primo impulso...
c'è qualcosa che si incarta... faccio un po di prove e vi faccio sapere.
Luca

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int sensorePin = 8;
int sensorePinOld = LOW;
int abba;
int giri = 0;

void setup()
{
 pinMode(sensorePin,INPUT);
 lcd.begin(16, 2);
 lcd.print("    -DUCATI-");
 delay(1000);
 lcd.clear();
}


void loop()
{
 abba = digitalRead(sensorePin);
 if (abba == HIGH && sensorePinOld == LOW)
 {
   sensorePinOld = abba;
   giri++;
 }
 lcd.setCursor(0, 0);
 lcd.print("Speed");
 lcd.setCursor(0, 1);
 lcd.print(giri);
 lcd.print(" Km/h ");
 delay (5);
}

uwefed

se metti 2 magneti e dimezzi il tempo la risoluzione resta uguale.

Locke

Anche tu hai ragione  ;D
Allora o 2 magneti e 1 secondo di campionamento...
O 1 magnete e 0.5 secondo di campionamento...

uwefed

no, 2 magneti e 1 secondo non corrispondono come segnale a 1 magnete e 0,5 secondi ma a 1 magnete e 2 secondi.
Ciao Uwe

Locke

Allora 2 magneti e 0.5secondi?  :)

Ho riprovato il programma, ma conta solo il primo cambio di stato, devo rivedere il codice, in serata posto i risultati.
Buona giornata e grazie a tutti per il supporto ;)

Locke

Boh ho cambiato un po di volte il codice ma continua a contare solo il primo impulso... i need help  :)

uwefed

#36
Jun 24, 2010, 01:51 pm Last Edit: Jun 24, 2010, 01:54 pm by uwefed Reason: 1
devi controllare anche il cambio di stato da HIGH a LOW e in quel momento mettere a LOW la variabile che ti tiene memorizzato lo stato precedente.

devi aggiungere a

if (abba == HIGH && sensorePinOld == LOW)
{
  sensorePinOld = abba;
  giri++;

}

anche:

if (abba == LOW && sensorePinOld == HIGH)
{
  sensorePinOld = abba;
}

Ciao  Uwe

Locke

void loop()
{
 abba = digitalRead(sensorePin);
 if (abba == HIGH && sensorePinOld == LOW)
 {
   sensorePinOld = abba;
   giri++;
 }
 
 if (abba == LOW && sensorePinOld == HIGH)
{
 sensorePinOld = abba;
}

 lcd.setCursor(0, 0);
 lcd.print("Speed");
 lcd.setCursor(0, 1);
 lcd.print(giri);
 lcd.print(" Km/h ");
}


grandissmo ;) sembra funzionare ma resta il problema che arduino non aggiorna in tempo reale lo stato dell'input, quando va alto conta +1 ma poi è come se mantenesse il livello hight e quindi somma +1 per qualche istante, e vengono fuori numeri sballati... provo a pasticcarlo un po... oppure provo con l'analogread...

Locke

Così conta perfetto  ;) ma se aumento la frequenza degli impulsi non li conta... come se non li vedesse...

void loop()
{
 abba = analogRead(sensorePin);
 if (abba > 900 && sensorePinOld < 500)
 {
   sensorePinOld = abba;
   giri++;
 }
 
 if (abba < 500 && sensorePinOld > 900)
{
 sensorePinOld = abba;
}

 lcd.setCursor(0, 0);
 lcd.print("Speed");
 lcd.setCursor(0, 1);
 lcd.print(giri);
 lcd.print(" Km/h ");
}

frog

forse perché il tempo necessario ad eseguire il loop() è superiore alla distanza fra gli impulsi stessi.

Locke

Misurando il tempo massimo è circa 1 secondo... occorre così tanto?  ::) :-? :(

frog

un secondo per fare un giro di loop() mi pare un'eternità: sono 16 MILIONI di colpi di clock!
fino a che frequenze riesci ad avere una lettura corretta?

Locke

Come ho già scritto ;) circa ogni secondo riesco a fargli leggere l'impulso, meno di questa soglia non conta...

BrainBooster

la butto lì...
hai provato ad escludere dal sw tutto ciò che concerne l'lcd?
la gestione del display ed il suo aggiornamento potrebbero introdurre ritardi.
dirotta l'output sulla seriale e vedi se ti legge anche a velocità più alte.

Locke

No niente... sempre come prima anche sola seriale...  :-[

Go Up