Contachilometri

Salve,
Sto inciampando in alcuni problemi con il mio ultimo progetto...
L'idea è quella di utilizzare il sensore di passaggio di un contachilometri da bicicletta, per misurare poi con arduino la velocità di una moto, visualizzata su un display 16x2.

Il problema è che non so come creare una variabile che aumenti di una sola unità ad ogni attivazione dell'imput (passaggio della calamita).
Per rendere meglio l'idea...
Premo un pulsante, la variabile va da 0 a 1, ripremo, va da 1 a 2.
Passato 1 secondo devo far in modo di leggere la variabile, effettuare i calcoli di conversione tra il tempo (1 secondo) ed i passaggi della calamita e visualizzare sul display la velocità in Km/h.

Confido in un aiuto dall'alto :smiley:

Luca P.

Ciao

perché non misuri il tempo tra un impulso e l' altro e ti calcoli con quello la velocitá
commando pulseIn()
http://arduino.cc/en/Reference/PulseIn

Ciao Uwe

Devi rapportare ciascun impulso alla circonferenza della ruota della tua moto, e quando avrai determinato quanti giri (impulsi) fa al secondo, potrai calcolare facilmente la velocità in Km orari...

ti dico la logica...
ad ogni impulso del sensore, sai che la ruota ha percorso un giro completo, quindi hai un valore espresso in "ruota al secondo" se misuri ogni secondo il numero di impulsi hai la velocità corrente in ruote al secondo, poi per passare alla velocità in Kmh devi sostituire la circonferenza della ruota nella formula, quindi se per esempio la circonferenza fosse 1m avresti una velocità di 1m/s e quindi per passare a kmh lo moltiplichi per 3,6.
P.S.
volevi dire tachimetro vero? ::slight_smile:
per azzerare puoi implementate un timeout sui dati ricevuti del tipo se entro un secondo non ricevo impulsi azzera la visualizzazione.

Grazie mille ragazzi :smiley:
Ma il punto è che non so come farlo fare al programma ;D

Uwe approfondirò il discorso pulsein, se riesci a dirmi di più tene sarei grato :smiley:

Comunque l'idea di fondo è, 1 secondo di tempo, registro i passaggi del sensore, e calcolo la velocità rapportata alla circonferenza/passaggi/al secondo

Ci risiamo... un'altro che "pretende" la pappa pronta...

No affatto...
Ho fatto molte prove con if else while ma non vengo a capo di nulla, non è la prima volta che uso arduino, non pretendo il programma già scritto, ma solo una funzione che mi permetta di fare quello che desidero, ovvero contare gli impulsi.

#include <LiquidCrystal.h>

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

int sensorepin;
int giri = 0;
int giri2 = 0;
int abba;

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

void loop()
{
abba = analogRead(sensorepin);
if(abba > 900)
if(giri==0)
{{
giri = 1;
giri2++;
}}
else {
giri = 0;
}

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

delay (5);
}

Così non funziona, perchè non conta gli impulsi singoli, ma conta alla frequenza di refresh del programma delay (5); per il periodo durante il quale l'if è vero

e dai, un pò di applicazione... hai tutto quello che serve per capire.
se ti serve altro basta chiedere,
se ti serve "un" altro invece, basta pagarlo :slight_smile:

Se ho scritto qua sul forum, evidentemente non ci arrivo...
Comunque nessun problema, speravo di trovare un aiuto, non credevo che pure nell'openhardware ci fosse un clima così... come non detto.

l'openhardware lo stai gia usando, qui si tratta di software e poi perchè sei così permaloso, ti assicuro che non è il caso, chi ti risponde su questo forum lo fà con tutto l'entusiasmo possibile e nessun pregiudizio, certo che se uno si accorge che l'obbiettivo di chi chiede è un pò ambizioso per le sue capacità, non puo fare altro che fornirgli una base per imparare ad apprezzare i suggerimenti inizialmente non capiti, ma non ci si piò aspettare che qualcuno scriva una sola riga di codice al posto tuo.
tutto ciò senza rancore :slight_smile: capisco che quando non si è addentro ad un argomento, un consiglio può sembrare sanscrito, ma se si parla la stessa lingua....

void loop()
{
abba = digitalRead(sensorepin);
if(abba == HIGH)
{
giri2++;
}
else {
giri2 = 0;
}

if(giri2>0)
if(x==0)
{{
giri = 1;
x = 1;
}}
if(giri2>0)
if(x==1)
{{
giri = 2;
x = 2;
}}

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

Continua a non contare gli impulsi.... ripeto, sto chiedendo una funzione che mi consenta di contarli, non sto chiedendo a nessuno di scrivermi nemmeno una riga di codice, per chi vuole ancora aiutarmi sono qui, e non sono permaloso, questo forum nasce anche per chiedere aiuti...

Sono allibito!
@brainbooster: ti prego, non dargli ulteriore corda perchè qui si sta rasentando il ridicolo! Non solo questo qua se ne esce dandoci dei bambini perchè non lo aiutiamo, ma arriva pure a pretendere che lo si aiuti perchè secondo lui "questo forum nasce anche per chiedere aiuti...".

@Locke: se esiste una funzione che fa quello che ti serve, perchè non te la cerchi???

Roba da matti!

@locke vuoi contare il numero degli inpulsi o il tempo che intercorre tra due inpulsi?

un pò di informazioni sul sensore? cos'è un rele reed? come lo hai collegato? se possibile lo hai provato con un tester? hai una foto del cablaggio? hai provato ad isolare la parte non funzionante, cioè a scrivere un miniprogramma che ad ogni passaggio del sensore ti scriva un 1 sulla seriale?

@uccio: non lo sa neppure lui cosa vuole veramente.. non a caso gli sono state date tutte le risposte che ha cercato ma sembra non gli interessi "faticare" e sta aspettando che qualcuno gli dia la pappa pronta..

@ uccio:

Mi interessa riuscire a contare il numero di impulsi, il tempo sarà una variabile fissa di 1 secondo, rapportandoli otterrò la velocità.

@ brainbooster:

Il sensore si è un reed, quello dei tachimetri da bicicletta, ma al momento ponticello semplicemente ai 5 volt il pin d'ingresso, putroppo non riesco a contare solamente l'impulso, non c'entra l'interfaccia, in seriale fa lo stesso, se do l'impulso, aggiunge 1 al registro finchè l'imput non torna a LOW, e quindi escono valori nell'ordine delle decine anche se l'impulso dura pochissimo...

Grazie mille agli utenti che mi stanno aiutando.

forzalo tù a low dopo l'incremento di 1

Buona idea, ma sembra quasi che ci sia un tempo fisso per arduino, e quindi anche forzando lo stato LOW ci mette del tempo...

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

void loop()
{
abba = digitalRead(sensorepin);
if(abba == HIGH)
{
giri2++;
}
else {
giri2 = giri2;
}

if(giri2 > 0)
{
abba = LOW;
}

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

non intendevo quello, e poi a che serve specificare la clausola else?
P.S.
nel codice ci sono errori

L'else era rimasto da una prova iniziale... ovviamente non funzionava :smiley:
Cosa intendevi per forzare il Low?
La compilazione è corretta e gira su arduino attualmente.