Pages: [1]   Go Down
Author Topic: Doppio conteggio HIGH LOW di un pin in HIGH  (Read 697 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 3
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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
« Last Edit: January 14, 2013, 05:40:43 pm by DriftBoy » Logged

Offline Offline
Jr. Member
**
Karma: 3
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6994
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dovresti usare un interrupt.

Code:
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.
« Last Edit: January 15, 2013, 12:51:02 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

no comment

Offline Offline
Jr. Member
**
Karma: 3
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
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.
Logged

no comment

Offline Offline
Jr. Member
**
Karma: 3
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

è 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
Logged

0
Offline Offline
Faraday Member
**
Karma: 30
Posts: 2905
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Pages: [1]   Go Up
Jump to: