Conta giri a led per auto e temperatura

Buona sera sono nuovo del forum vorrei creare con arduino un contagiri a led per auto premetto che sono proprio agli inizi e posseggo un arduino uno quindi abbiate pazienza se non capisco a primo colpo :stuck_out_tongue: . allora un con un mio amico una volta abbiamo misurato il segnale e da quanto mi ricordo il segnale era un onda quadra con 12 volt picco picco e più i giri aumentavano e più il periodo diminuiva.ditemi se il ragionamento che voglio fare è giusto allora per prima cosa con un partitore di tensione bisogna abbassare i volt portandoli a 5 volt poi far leggere il segnale ad aurduino fargli calcolare il periodo e poi a con una equazione matematica (che posso rimediare) calcolare i giri motore fare una media e poi con la stringa if dirgli che i vari led si devono accendere dopo il superamento del tot di giri..il tutto trasformato in linguaggio di programmazione e li mi serve una mano :smiley: ...secondo voi il ragionamento che voglio fare fila ed è possibile farlo con arduino ??Grazie a tutti in anticipo per l aiuto

Con un LM2917 e degli LM3914 (ognuno controlla 10 led e si possono mettere in cascata) puoi farne uno senza scomodare l'arduino, partitori, regolatori di tensione, ecc.
Sarebbe più comodo, ma se vuoi usare l'arduino sicuramente è un ottimo esercizio e avrai anche più flessibilità.

appunto io lo vorrei fare con arduino perché l anno prossimo lo dovrei usare anche a scuola per questo volevo esercitarmi

gentilmente mi potreste dire come calcolarmi il periodo in millisecondi .ve ne sarei grato.

La funzione millis() di Arduino è un contatore che viene incrementato ogni millisecondo partendo da zero all'accensione o al reset.
Devi registrare in una variabile l'inizio delle evento esempio start = millis() e poi la fine finish = millis().
Il periodo, in millisecondi, lo trovi semplicemente calcolando periodo = finish - start.
Per assegnare il valore alla variabile ti conviene appoggiarti ad un interrupt individuando la salita e la discesa del segnale.

Ci sarebbe anche la funzione pulsein, magari può tornare utile

si, anche se a me non ha mai funzionato. :frowning:

ok mi devo studiare un po questi interrupt che non ho capito bene cosa sia...appena ho tempo vede se riesco almeno a far carpionare il segnale ad arduino e visualizzare sul serial monitor...vediamo cosa uscirà fuori...un altra cosa secondo voi per abbassare il voltaggio del segnale basta un partitore o ci vorrebbe anche un regolatore?? perchè il segnale esce direttamente dalla ecu

Ma se esce dalla ECU non ti conviene utilizzare direttamente il CAN BUS e le librerie OBD?
--> OBD-II for Arduino download | SourceForge.net

questa delle librerie obd non lo sapevo quindi sulle auto stradali sarebbe una bella soluzione...il problema si pone sulle auto da rally (possibile istallazione) dato che sono totalmente prive di questo dispositivo

Se utilizzano una centralina di serie dovrebbero avere il connettore da qualche parte. Se poi vengano modificate e allegerite di componentistica non necessaria non saprei dire.
Ma dubito che non abbiano predisposto una connessione per la diagnostica.

P.S. Parlo ovviamente delle nuove auto con centraline elettroniche non di una vecchia ritmo abarth. :cold_sweat:

per auto da rally io mi riferisco ad auto da corsa prototipi che sono prive di ecu originale... e le ecu che sono montate sono montate hanno una diagnostica completamente diversa dalle auto stradali. a parte questo questa e un parte dell programma che ho fatto avrei la necessità di calcolarmi la media dei valori assegnati a (duration) avete qualche suggerimento ??

const int LED1 = 1; //Led 1 collegato al pin 1
const int LED2 = 2; //Led 2 collegato al pin 2
const int LED3 = 3; //Led 3 collegato al pin 3
const int LED4 = 4; //Led 4 collegato al pin 4
const int LED5 = 5; //Led 5 collegato al pin 5
const int LED6 = 6; //Led 6 collegato al pin 6
const int LED7 = 7; //Led 7 collegato al pin 7
const int LED8 = 8; //Led 8 collegato al pin 8
const int LED9 = 9; //Led 9 collegato al pin 9
const int LED10 = 10; //Led 10 collegato al pin 10

int Impulso = 13;     //indica che il pin di input al quale arriveranno gli impulso è il 13

unsigned long duration; //indica che la durata non può assumere valori negativi, long viene usato xk ha dimensione doppia rispetto a int

void setup()
{
  pinMode(Impulso, INPUT); //configura il pin come input
  pinMode(LED1, OUTPUT); //configura il pin come output
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  pinMode(LED8, OUTPUT);
  pinMode(LED9, OUTPUT);
  pinMode(LED10, OUTPUT);
 

}

void loop()
{
  duration = pulseIn(Impulso, HIGH); //misura il tempo in millisecondi che trascorre tra un impulso e l'altro

Devi sommare duration in una variabile.
Ad ogni loop incrementi un contatore. Quando il contatore arriva ad un certo numero dividi la somma per il contatore.

sumduration += duration;
count++;
if (count >= 10) media = sumduration/count;

una cosa del genere.
Attento alla divisione intera, ma credo che non ti interessino i decimali degli rpm. :smiley:

P.S. Sostituisci i const int con i #define. Pare rendano il codice più veloce. <-- si sta ancora investigando sull'argomento.

scusate se vi rompo ancora ma su serial monitor invece di far stampare sempre un nuovo valore e possibile solo aggiornarlo ??

Sul serial monitor dell'IDE no, non ha il ritorno sulla riga superiore.

se invece il valore lo stampo su lcd mi si dovrebbe solo aggiornare...chiedo questo perche per fare delle prove su serial monitor se mi scrive sempre un nuovo valore non ci capirei niente...ps grazie per le risposte sei gentilissimo

Si, su LCD lo pui visualizzare sempre nella stessa posizione.
Devi solo avere l'accortezza di cancellare le cifre nel caso si passi da 1000 a 999 o da 10000 a 9999 perché LCD ti visualizzerebbe lo zero finale.

PaoloP:
Devi sommare duration in una variabile.
Ad ogni loop incrementi un contatore. Quando il contatore arriva ad un certo numero dividi la somma per il contatore.

sumduration += duration;

count++;
if (count >= 10) media = sumduration/count;




una cosa del genere.
Attento alla divisione intera, ma credo che non ti interessino i decimali degli rpm. :D

P.S. Sostituisci i const int con i #define. *Pare* rendano il codice più veloce. *<-- si sta ancora investigando sull'argomento.*

riguardo a questo tu hai messo count>= 10 cosi mi fa la media di 10 valori giusto ??

Esatto.
Modificando il valore dell'if puoi aumentare o diminuire il numero di valori su cui fare la media.
Occhio che codice l'ho scritto di getto e non l'ho verificato.

PaoloP:
Si, su LCD lo pui visualizzare sempre nella stessa posizione.
Devi solo avere l'accortezza di cancellare le cifre nel caso si passi da 1000 a 999 o da 10000 a 9999 perché LCD ti visualizzerebbe lo zero finale.

scusa se ti rompo ancora ma sono proprio agli inizi.
come si fa a cancellare le cifre finali??