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.
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.
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
}
}
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.
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?
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.
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");
}
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
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
}
}
}