Go Down

Topic: Doppio conteggio HIGH LOW di un pin in HIGH (Read 849 times) previous topic - next topic

DriftBoy

Jan 14, 2013, 11:06 pm Last Edit: Jan 14, 2013, 11:40 pm by DriftBoy Reason: 1
questa è una bozza di contagiri
non capisco per quale motivo ma prima di immettere il millis il gparz contava esattamente il numero di volte in cui mettevo in high il sensgiri mentre ora anche escludendo l'azzeramento del contatore e mantenendo in HIGH il pin mi conta anche 2 HIGH in una sessione

Code: [Select]
int sensgiri = 2;
int giri;
int giri2;
int rpm;
int gparz;
unsigned long tpausa = 1000;
unsigned long tiniziale = 0;


void setup()
{
 
 pinMode(sensgiri, INPUT);
 Serial.begin(9600);
}

void loop()
{
 
 giri = digitalRead(sensgiri);
 
 if (giri == HIGH) giri2++;
 if (giri == LOW) giri2 = 0;
 
 if (millis() - tiniziale < tpausa) {    
   
   if (giri2 == 1) gparz++;
   
 }
 if (millis() - tiniziale >= tpausa) {
   
   rpm = gparz * 60;
   
   Serial.println(gparz);
   
   tiniziale = millis();
   
   gparz = 0;
   rpm = 0;
 }
}


questo è il risultato del serial monitor escludendo l'azzeramento di gparz

Code: [Select]
0
1
3
4
5
7
8
9
10
12
13
14
15
17
18
19
21
22
23
24
26
27
28
30
31
32
33
35
36
37
38
40
41
42
44
45
46
47
49
50
51
53
54
55
56
58
59


come è ben visibile ogni un tot letture ottengo una doppia lettura

DriftBoy

allora poniamo un altra domanda

io devo leggere degli impulsi che variano da 1 al secondo ad arrivare a 5000 al secondo
arduino è in grado? oppure esiste un sensore un qualunque micro che può fare questa operazione e poi inviare i dati ad arduino?

contando poi che questa lettura è un componente di una cosa molto + ampia

PaoloP

#2
Jan 15, 2013, 06:26 pm Last Edit: Jan 15, 2013, 06:51 pm by PaoloP Reason: 1
Dovresti usare un interrupt.

Code: [Select]
unsigned int rpm;
unsigned int giri;
const unsigned long tpausa = 1000;
unsigned long tiniziale = 0;

void setup()
{
 pinMode(2, INPUT);
 Serial.begin(9600);
 attachInterrupt(0, Counter, RISING); // int 0 è collegato al pin 2.
}

void loop()
{
 if (millis() - tiniziale >= tpausa) {
   rpm = giri * 60;
   giri = 0;
   tiniziale = millis();
   Serial.println(rpm);
 }
}

void Counter(void)
{
 giri++;
}


Codice non testato.


esiste un sensore un qualunque micro che può fare questa operazione e poi inviare i dati ad arduino?

Potresti usare un ATtiny84 per contare gli impulsi e spedire il dato ad arduino.

pablos

Perchè non cercare su google "fan speed Tachometer" o "arduino Reading RPM"
http://www.pyroelectro.com/tutorials/tachometer_rpm_arduino/
http://playground.arduino.cc/Main/ReadingRPM
http://fritzing.org/projects/reading-pc-fan-rpm-with-an-arduino/
http://www.themakersworkbench.com/content/tutorial/reading-pc-fan-rpm-arduino

ce ne sono a fiumi
no comment

DriftBoy

perchè se ci provi da solo e fallisci poi ti poni le domande giuste per capire se li prendi pronti necessiterai sempre di cose pronte ;)

qsecofr


allora poniamo un altra domanda

io devo leggere degli impulsi che variano da 1 al secondo ad arrivare a 5000 al secondo
arduino è in grado? oppure esiste un sensore un qualunque micro che può fare questa operazione e poi inviare i dati ad arduino?

contando poi che questa lettura è un componente di una cosa molto + ampia


la variabile giri2 la incrementi facendo giri2++ ... non la metti ad uno... e non la azzerri fintanto che non vedi una caduta del segnale... però arduino ha 1 secondo di tempo prima di stampare... in 1 secondo se per caso i giri sono lenti e quindi il pin non cambia di stato la variabile giri2 ha il tempo di fare il giro... 2^16 e tornare a 0... da quello che ho capito giri2 per te è solo un flag per non conteggiare un altro giro... quindi non vedo perchè la incrementi continuamente: dopo che è passata per l'1 lasciala a 2 fintanto che non c'è il fall del segnale.

... quindi la tua risposto sarebbe: non è che arduino non ce la fa... ce la fa troppo...

... studiati bene la soluzione che ti è stata proposta con l'interrupt: è bella, elegante, funzionale, efficace.


pablos


perchè se ci provi da solo e fallisci poi ti poni le domande giuste per capire se li prendi pronti necessiterai sempre di cose pronte ;)

Allora poniti le domande giuste, fai altre prove, comunque non c'è meglio che imparare da esempi fatti. Senza guardare niente crederai che il tuo sistema funzionante sia assoluto, lo fai con 100 righe quando qualcuno lo fa con 10.... guardare gli altri programmi e comprendere ciò che hanno fatto è un confronto, da solo non confronti nulla.
no comment

DriftBoy

è vero pablos ma vedi io a fare quelle stupidissime righe mi son risolto dei problemi che ho riscontrato lungo la strada che per chi conosce la programmazione sono banali per chi non la conosce sono montagne, e per fare un esempio stupido io ora ho potuto mettere a fuoco l'attenzione sugli interrupt che fino ad un ora fa non conoscevo mentre ora ho potuto vedere che per quel che voglio io possono essere utili e quindi incuriosirmi e quindi studiarli e quindi poterli sperimentare, quindi a conti fatti in 24 ore ho avuto la possibilità di capire qualche passaggio ed apprendere una cosa nuova.

ora capisco che per chi non è novellino queste richieste magari sono più una rogna, ma grazie alle risposte delle persone che si prendono la bega di spiegare io posso piano piano hobbisticamente imparare e a mia volta aiutare altri

mentre se mi fossi trovato uno sketch pronto non so mica quanto avrei capito.... forse niente o ben poco, di sicuro c'è che sti benedetti interrupt sarebbero rimasti li xkè, e chi lo sa che fanno ma servono

cmq grazie mille delle risposte

MauroTec

Il problema con gli interrupt potrebbe rimanere. Se ho capito bene cosa accade, il contatore dei giri viene incrementato molto più lentamente di quanto viaggi il ciclo loop e quindi la stampa che avviene sempre a prescindere dal fatto che il numero di giri sia cambiato.

L'interrupt come dice la parola è un modo per far saltare il puntatore della istruzione corrente alla routine di interrupt, quindi il codice esguito nel loop viene interroto e verra subito eseguito codice che devi scrivere tu, che nel caso di arduino ti porta a scrivere una funzione che viene eseguita quando l'evento legato alll'interrupt si verifica. Nel tuo caso ti serve solo rilevare il fronte di salita o quello di discesa e no entrambe, credo.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up