Ir ao conteúdo
  • Cadastre-se

Arduino Cronometro dando lag depois de inserir sensor hc-sr04


aluizs

Posts recomendados

Olá,

Estou trabalhando em um projeto de cronometro que é acionado por um botão e pausado através de um sensor ultrassônico (hc-sr04), só que começou a dar lag depois que implementei o código do sensor, antes disto estava funcionando normalmente.

Estou usando o arduino uno, 2 botões táctil e o sensor ultrassônico utilizando o código abaixo.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#include <Ultrasonic.h>

#define I2C_ADDR 0x27 // Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
//--------------------------------------------------------
#define BTN_PLAY 10
#define BTN_STOP 11
//--------------------------------------------------------
#define ECHO_PIN 13 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define MAX_DISTANCE 20 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

long tempo_2;
long distancia;
//--------------------------------------------------------
int estado_btnplay;
int estado_btnstop;

unsigned long tempo;
unsigned long tempo_play = 0;
unsigned long tempo_stop;
unsigned long tempo_segundo;

int controle = 1;

int horas = 0;
int minutos = 0;
int segundos = 0;
int decimas = 0;
int milisegundos = 0;
int contar = 1;

//------------------------------------------------------------
// Alterar o endereço conforme modulo I2C
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup()
{
Serial.begin(9600);
pinMode(BTN_PLAY, INPUT_PULLUP);
pinMode(BTN_STOP, INPUT_PULLUP);

//LCD.Backlight ON;
lcd.begin(20,4);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

lcd.home ();
lcd.setCursor(3,0);
lcd.print(“Tec Dicas”);
lcd.setCursor(3,1);
lcd.print(“Cronometro”);
delay(1000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“PLAY p/ iniciar”);
}

void loop()
{
estado_btnplay = digitalRead (BTN_PLAY);
estado_btnstop = digitalRead (BTN_STOP);

//-------------------------------------------------------
float cmMsec, inMsec;
long microsec = ultrasonic.timing();
// cmMsec = ultrasonic.convert(microsec,Ultrasonic::CM);
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

//--------------------------------------------------------

if ((estado_btnplay == LOW) && (controle == 1)) //apertado
{
controle = 0;
lcd.setCursor(3, 0);
lcd.print("TEMPO ‘PLAY’ ");
}

if (controle == 0)
{
milisegundos = millis();
if(milisegundos % 100 == 0){ //Entrar apenas se tiver passado o décimo de segundo
decimas++;
if(decimas == 10){ //Quando passou 10 décimos de segundo, conta um segundo
decimas = 0;
segundos++;
}
if(segundos == 60){
// Após 60 segundos, conta um minuto
segundos = 0;
minutos++;
}
if(minutos == 60){// Depois de 60 minutos, conta uma hora
minutos = 0;
horas++;
}
//exibição no LCD
lcd.setCursor(3,1);
if(horas < 10){ //se as horas forem menor que 10, acrescenta um 0 na frente
lcd.print(“0”);
}
lcd.print(horas);
lcd.print(":");

lcd.setCursor(6,1);
if(minutos < 10){//se os minutos forem menor que 10, acrescenta um 0 na frente
lcd.print(“0”);
}
lcd.print(minutos);
lcd.print(":");

lcd.setCursor(9,1);
if(segundos < 10)

{//se os segundos forem menor que 10, acrescenta um 0 na frente
lcd.print(“0”);
}
lcd.print(segundos);
lcd.print(":");

lcd.setCursor(12,1);
lcd.print(decimas);
}
}

//-----------------------------------------
if ((estado_btnstop == LOW) && (controle == 0)) //apertado
{
controle = 1;
horas = 0;
minutos = 0;
segundos = 0;
decimas = 0;

lcd.setCursor(3, 0);
lcd.print("TEMPO ‘STOP’ ");
delay(10000);
}
else if ((estado_btnstop == LOW) && (controle == 1)) //apertado
{
lcd.setCursor(3, 0);
lcd.print("PLAY p/ iniciar ");

lcd.setCursor(3,1);
lcd.print(“00:00:00:0”);
}

//----------------------------------------

//-------------------------------------------------------
if (cmMsec < 20 )
{
controle = 1;
horas = 0;
minutos = 0;
segundos = 0;
decimas = 0;

lcd.setCursor(3, 0);
lcd.print("TEMPO ‘STOP’ ");
}

lcd.setCursor(3,3);
lcd.print(cmMsec);
//-------------------------------------------------------

}

a estrutura dos botões estão de acordo com a imagem abaixo.

modelo da montagem dos botões, sem o sensor


Alguem poderia me auxiliar com este problema.

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Pra quem não quiser clicar...

montagem-cronometro-arduino-display-lcd-

 

Qual lag? Observações preliminares:

-operações com long ou float podem levar muito tempo em mc de 8 bits. Tenha certeza que um int não resolve

-a impressão no lcd também leva tempo

-o ultrassom geralmente leva um tempo meio que considerável pra responder. Este tempo deve ser considerado na concepção do projeto.

-por trabalhar "à parte" fora do loop, o uso de interrupts otimiza o tempo

Perceba a repetida palavra tempo. Portanto um lag mínimo, hás de conviver com.

 

Onde/como/porquê/pra quê serve o projeto? De posse da resposta, quiçá lhe apareçam alternativas e/ou soluções...

 

Link para o comentário
Compartilhar em outros sites

Izadora,

 

     boa tarde,

 

    Obrigado pelas considerações.

   Sou Profissional de Educação Física e tenho que avaliar a velocidade de meus alunos de tempos em tempos e este  projeto tem o intuito de  mensurar o tempo deles neste teste.

   E como eu disse, utilizando o código sem a implementação do sensor o tempo corre normalmente, sem o lag na leitura do tempo no LCD.

 

  

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ok com estas informações alimentadas, computemo-las....Se com botão o tempo de resposta te atende, então foquemos  apenas no tempo de resposta do sensor. Como não respondeu qual o valor do lag, não tem como computar muita mais coisa. Mesmo assim, vejamos

comofunciona.png

De fato o tempo de resposta deste sensor é bem pequeno pros padrões humanos. Talvez a distância que quer medir é longa demais pra uma resposta no 1º disparo. Ou o objeto (humano?)  não dá eco direito ou a maneira/condições que quer medir são impróprias, etc. Se o problema persistir e achar que deve, informe tudo o que puder, com fotos, desenhos, figuras e videos. Isso deve ajudar quem for te ajudar...

Ah e publique o circuito...

 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!