Ajuda na contagem de tempo

Por favor alguem pode me ajudar?

fiz um projetinho em que o arduino recebe sinais digitais de um sensor.

fica em nivel alto a entrada do arduino.ocorrendo o evento vai para nivel baixo e retorna para alto.
preciso calcular quanto tempo demorou parair do nivel alto para baixo.

um exemplo pratico do quero fazer e utilizar um sensor em uma estera.
meu sensor envia um sinal em nivel alto quando nao passa nada, e quando passa o produto em sua frente vai para nivel baixo e retorna para alto.
precisso calcular quanto tempo demorou para passar um produto entre o outro.

Dá uma olhada aqui:

Mudou de nivel:
meutempo = millis();

Mudou novamente:
diferencadetempo = millis() - meutempo;

Lago

Nao entendi muito bem sera que vc poderia me falar como faço neste exemplo de programacao.

int i=0;
int norte=13;
void setup(){

Serial.begin(9600);

pinMode(norte, INPUT);
}

void loop()
{
if(digitalRead(norte)==HIGH){

}
else if(digitalRead(norte)==LOW)
{
if(digitalRead(norte)==HIGH){
i++;
Serial.println(i);
}
}

}

Eu quero fazer a contagem de tempo a cada incremento realizado.
e depois zerar o contador de tempo e contar de novo na proxima e assim sucessivamente.

Se puder me ajudar que ainda sou iniciante.

int i=0;
int flagHIGH=0;
unsigned long temp1;
unsigned long temp2;
unsigned long tempHL;
int norte=13;
void setup(){
  Serial.begin(9600);
  pinMode(norte, INPUT);
}

void loop()
{ 
  if(digitalRead(norte)==HIGH){
  temp1=millis();
  flagHIGH=1;
   
  }
  else if(digitalRead(norte)==LOW&&flagHIGH==1){
          temp2=millis();
          tempHL=(temp2-temp1);
          flagHIGH=0;
          Serial.println(tempHL);//Tempo entre o nivel alto e baixo

  }
}

Aqui esta um exemplo que fiz.Testa o funcionamento.

Não seria isto que querias dizer vasr??

int i=0;
unsigned char flagHIGH=0;
unsigned long temp1;
unsigned long temp2;
unsigned long tempHL;

int norte=13;

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

void loop()
{ 
  if(digitalRead(norte)==HIGH && flagHIGH == 0){
     temp1=millis();
     flagHIGH=1;   
  }
  if(digitalRead(norte)==LOW&&flagHIGH==1){
          temp2=millis();
          tempHL=(temp2-temp1);
          flagHIGH=0;
          Serial.println(tempHL);//Tempo entre o nivel alto e baixo
  }
}
unsigned char flagHIGH=0;
if(digitalRead(norte)==HIGH && flagHIGH == 0)

Sim desta forma é o mais correto.Obrigado pela correção!

Por Favor alguem sabe me dizer com certeza, se desta forma que fiz estou perdendo alguma amostra( Coleta de dados no sensor).

por que ao fazer na pratica se a velocidade for muito rapida parece que ele não registra algumas amostras, porem meu colega me falou que ao imprimir na tela gasta muito tempo no processamento, que talvez não esteja perdendo, que por conta deste processamento que demora ele deixa de mostrar, mas que o bom seria fazer também com interrupções só que não tenho nem ideia de como se faz.

Alguem pode me responder por favor?

Melhor explicação sobre interrupções que vi:

Tem esse em portugues, a partir do minuto 31:

willpeixoto:
switch (numero){
case 1:
Serial.println("Recebi 1 movendo servo");
sv1.write(servo);
sv2.write(servo);
sv3.write(servo);
sv4.write(servo);
digitalWrite(ledVerde01, HIGH);
digitalWrite(ledVermelho01, LOW);
delay (8000);
Serial.println(timeElapsed);
sv1.write(90);
sv2.write(90);
sv3.write(90);
sv4.write(90);
digitalWrite(ledVerde01, LOW);
digitalWrite(ledVermelho01, HIGH);
break;

Usar o delay para valores superiores a uma ou duas dezenas de milissegundos e uma ma pratica de programacao. :wink:

Galera, vamos ver se alguem pode me dar uma força, usei o codigo do VASR + BUBULINDO, e consegui rodar metade do meu projeto, queria uma ajuda para implementar outra contagem:
Estou fazendo um sensor de geladeira que conta quanto tempo a porta fica aberta e quanto tempo a porta fica fechada, com este condigo consegui mensurar o tempo dela aberta, alguem tem alguma iedia de como contabilizar o tempo dela fechada?

Obrigado Wally

Sabes quando a porta abriu... sabes quando a porta fecha... Tens de ter duas variáveis para contar os intervalos entre esses eventos usando a mesma lógica.

DEU CERTO!!! Segue o Código

int i=0;
unsigned char flagHIGH=0;
unsigned long temp1;
unsigned long temp2;
unsigned long tempab;

int porta=13;

void setup(){
Serial.begin(9600);

}

void loop()
{
if(digitalRead(porta)==HIGH && flagHIGH == 0){
temp1=millis();
flagHIGH=1;
Serial.print("Tempo de porta Aberta foi:");
Serial.print((temp1-temp2)/1000);//Tempo entre o nivel alto e baixo
Serial.println(" Segundos");
}
if(digitalRead(porta)==LOW&&flagHIGH==1){
temp2=millis();
tempab=(temp2-temp1);
flagHIGH=0;
Serial.print("Tempo de porta Fechada foi:");
Serial.print(tempab/1000);//Tempo entre o nivel alto e baixo
Serial.println(" Segundos");
}

}

Outra duvida,

Quando eu Imprimo na tela os valores, eu quero imprimir tbm o horario HH:mm:ss.

alguem sabe se isso é possivel ?

Claro que é possível. Se tem o tempo em segundos, se dividir por 60 tem minutos e se dividir esse resultado por 60, novamente, tem as horas.
Um exemplo simples:

int valor;

int segundos;
int minutos;
int horas;

void setup(){
  Serial.begin(9600);
  valor = 4825;
}

void loop() {
   segundos = valor % 60;
   valor = valor / 60;
   minutos = valor % 60;
   valor = valor / 60;
   
   horas = valor;
   
   if (horas < 10) {
     Serial.print("0");
   }
   Serial.print(horas);
   Serial.print(":");
   if (minutos < 10) {
     Serial.print("0");
   }
   Serial.print(minutos);
   Serial.print(":");
   if (segundos < 10) {
     Serial.print("0");
   }   
   Serial.print(segundos);
   Serial.println();
   
   while(1);   
}

Olá Pessoal. Estou com um problema parecido. Se alguém puder me ajudar, agradeço;

#define sensor1Pin 2 // sensor móvel
#define sensor2Pin 3 // sensor fixo
// as entradas digitais 2 e 3 possuem interupção externa ou seja. executam uma função quanto altera o estado delas com prioridade
unsigned long int time1;
unsigned long int time2;
unsigned long int time3=0; // marcador de tempo

void setup() {
Serial.begin(115200);
pinMode(sensor1Pin,INPUT);
pinMode(sensor2Pin,INPUT);
attachInterrupt(digitalPinToInterrupt(sensor1Pin), sensor1ISR, RISING);
attachInterrupt(digitalPinToInterrupt(sensor2Pin), sensor2ISR, RISING);
Serial.println("incio");
time3=millis();
}

void sensor1ISR(void){
time1 = micros();

}

void sensor2ISR(void){
time2=micros();

}
void loop() {

Serial.print(time1);
Serial.print (",");
Serial.println(time2);

if( (millis() - time3)> 7000){ // se o programa estiver rodando por mais que 7000 milisengundos.....
Serial.println("fim");
while(true){ // vem pra um loop para travar... Para reinicar o programa basta dar reset na placa
}
}
}

Monitor Serial :

1255460,1236096
1255460,1236096
1255460,1236096
1255460,1236096
1255460,1236096
1255460,1236096

Eu queria saber o tempo que chega no monitor serial entre uma linha e outra

Isso tem de ser medido pelo computador, não pelo Arduino.