Pages: [1]   Go Down
Author Topic: Far misurare tempo ad arduino (ms)  (Read 1407 times)
0 Members and 1 Guest are viewing this topic.
Messina
Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti ragazzi, sto realizzando un progettino e ho necessità di far misurare il tempo ad arduino e restituirlo su lcd....per lcd ecc nessun problema, per la misura del tempo invece si....praticamente devo misurare il più esattamente possibile il tempo che intercorre fra un comando impartito da arduino (es. accensione relè su pin 4) e un'evento su un altro pin...ad esempio la variazione di stato di un altro pin (da high a low o viceversa), poi il programma deve confrontare con dei valori all'interno del codice e restituire tutto su lcd....ma non so da dove partire per la misura del tempo...dovrei riuscire a misurare tempi che variano dai 2 ai 200 ms, con una discreta accuratezza, ho letto che c'è un comando pulsein o che si può fare con  l'interrupt ma nulla che spieghi bene come si fa...ringrazio anticipatamente tutti coloro che mi daranno una mano. smiley Buona giornata
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bè dovresti lavorare con la funzione millis().

Per esempio:

Code:
accendi pin relè;
tempoAccensioneRele=millis();

if altro evento{
tempoAltroEvento=millis();
}

tempoPassato =tempoAltroEvento-tempoAccensioneRele;
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22943
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La pulseIn può andar bene, misura la durata di un impulso su un certo pin.
http://arduino.cc/en/Reference/PulseIn
Logged


Messina
Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, grazie a tutti per le risposte....quello che devo fare effettivamente è un tester automatico per verificare gli interruttori differenziali di casa, quindi una delle funzioni di questo tester (tralasciando la misura della tensione di rete e relativo settaggio di un potenziometro digitale per avere esattamente 30mA di dispersione verso terra) è quella di chiudere un contatto (mettendo in dispersione la fase verso terra) e misurare il tempo intercorso dalla chiusura del contatto all'intervento del differenziale. quindi vediamo se ci ho capito qualcosa...se io devo misurare il tempo intercorso fra l'accensione del relè sul pin 1 e l'intervento del differenziale (tramite optoisolatore su trasformatore) sul pin 2 devo scrivere così:

Code:
#include <LiquidCrystal.h>
int led = 0;
int relay = 1;
int rete = 2;
int testbtn = 3;
int RS = 4;
int EN = 5;
int D4 = 6;
int D5 = 7;
int D6 = 8;
int D7 = 9;

unsigned long duration;

LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);

void setup(){
  pinMode(relay, OUTPUT);
  pinMode(rete, INPUT);
  pinMode(testbtn, INPUT);
  lcd.begin(16,2);
}

void loop(){
  if(testbtn==HIGH){
  getTime();
  }
}

void getTime(){
digitalWrite(relay, HIGH);
duration = pulseIn(rete, HIGH);
digitalWrite(relay, LOW);
lcd.setCursor(0,0);
lcd.print("tempo di intervento: ");
lcd.print(duration);
lcd.print("ms")
return;
}
così praticamente premendo il tasto TEST avrei il relè che si attiva mettendo in dispersione la fase verso terra quindi dovrebbe intervenire il differenziale....il "duration = pulseIn(rete, HIGH);" conta quanti ms intercorrono da quando è stato messo in dispersione l'impianto e quando interviene il differenziale e successivamente disattiva il relè che si occupa di mettere in dispersione. Ma adesso mi sorge un altro dubbio, mettendo caso il differenziale non interviene il programma così si blocca sul pulseIn...sbaglio? come posso mettere un timeout per fare in modo che se non risponde entro ad esempio 2 secondi interrompe la dispersione e restituisce il messaggio di test fallito?
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22943
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La pulseIn prevede già il timeout, predefinito a 10s ma impostabile all'intervallo che vuoi. Nel link che ti ho passato c'è scritto.
Logged


Messina
Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La pulseIn prevede già il timeout, predefinito a 10s ma impostabile all'intervallo che vuoi. Nel link che ti ho passato c'è scritto.

Ok...perdonami...ho letto ma mi è sfuggita la questione timeout....oppure google translate traducendomi la pagina me l'ha fatto intendere per altro...
rileggendo infatti mi sono reso conto meglio....quindi in questo caso volendo un timeout di 2secondi dovrei scrivere:
Code:
duration = pulseIn(rete, HIGH,2000);
giusto?

Edit: dimenticavo, sul reference dice che il pulseIn lavora in microsecondi.... quindi possibile che dovrei scrivere
Code:
duration = pulseIn(rete, HIGH, 2000000):

??? e per avere il rispettivo valore in ms della durata dell'impulso forse dovrei fare una cosa tipo ms=duration/1000...?
« Last Edit: April 18, 2013, 11:28:39 am by peppe91 » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22943
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

1 ms = 1000 us
quindi basta dividere per 1000 i us per avere i ms e viceversa.
Logged


Messina
Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, sisi...questo lo so...chiedevo se è così la sintassi corretta (in grassetto):



void getTime(){
float ms = 0.0
digitalWrite(relay, HIGH);
duration = pulseIn(rete, HIGH,2000000);
ms = duration/1000;

digitalWrite(relay, LOW);
lcd.setCursor(0,0);
lcd.print("tempo di intervento: ");
lcd.print(ms);
lcd.print("ms")
return;
}
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22943
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricordati di dichiarare duration di tipo unsigned long.
Logged


Messina
Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, è già fatto smiley-wink non ho citato nuovamente quella parte per non essere ripetitivo e far vedere solo le modifiche...comunque grazie 1000 per l'aiuto smiley
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5009
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, sisi...questo lo so...chiedevo se è così la sintassi corretta (in grassetto):
float ms = 0.0

Se non è un errore di copiatura, manca alla fine il ;
Logged

my name is IGOR, not AIGOR

Pages: [1]   Go Up
Jump to: