Go Down

Topic: Far misurare tempo ad arduino (ms) (Read 1 time) previous topic - next topic

peppe91

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. :) Buona giornata

erpomata

Bè dovresti lavorare con la funzione millis().

Per esempio:

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

if altro evento{
tempoAltroEvento=millis();
}

tempoPassato =tempoAltroEvento-tempoAccensioneRele;
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

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

peppe91

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: [Select]

#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?

leo72

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

peppe91

#5
Apr 18, 2013, 06:20 pm Last Edit: Apr 18, 2013, 06:28 pm by peppe91 Reason: 1

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: [Select]
duration = pulseIn(rete, HIGH,2000);
giusto?

Edit: dimenticavo, sul reference dice che il pulseIn lavora in microsecondi.... quindi possibile che dovrei scrivere
Code: [Select]
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...?

leo72

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

peppe91

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;
}

leo72

Ricordati di dichiarare duration di tipo unsigned long.

peppe91

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

nid69ita


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 ;
my name is IGOR, not AIGOR

Go Up