08 maio 2013

Medidor de distância com o sensor ultrassônico HC-SR04

Hoje apresento o circuito de um medidor de distância usando o sensor ultrassônico HC-SR04, o display LCD Winstar WH1602A e claro, o Arduino.

HC-SR04 Arduino Sensor Ultrassonico
Como comentei no post anterior, o HC-SR04 pode ser usado para medir distâncias de até 4m com precisão de 3mm (dados do datasheet do produto) e identificar a presença de objetos ou captar movimentos.

Isso nos permite criar alarmes, sensores de presença, sistemas de escuta, sensores de estacionamento, sensores de obstáculos para serem usados em robôs, e muitas outras aplicações.

Resumindo o funcionamento : é enviado um sinal ultrassônico pelo módulo, o mesmo detecta o retorno deste sinal (eco), e com base no tempo entre esses dois eventos, gera um sinal que permite medir a distância até o objeto.

O circuito é praticamente idêntico ao que usei nos outros projetos usando o WH1602A, com a diferença que no pino 15 (backlight, ou luz de fundo) eu coloquei uma pequena resistência para limitar a corrente.

Circuito Arduino Uno HC-SR04
O programa usa a biblioteca Ultrasonic, que voce pode baixar neste link. O programa faz a leitura dos dados do sensor, calcula a distancia em centímetros e polegadas, e apresenta os dados no LCD 16x2. 

Você não tem LCD ? Não tem problema. Os mesmos dados são enviados para o serial monitor. ;-)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//Programa : Medidor de distancia com HC-SR04
//Autor : Arduino e Cia

#include <Ultrasonic.h>     //Carrega a biblioteca Ultrasonic
#include <LiquidCrystal.h>  //Carrega a biblioteca LCD

//Define o pino do Arduino a ser utilizado com o pino Trigger do sensor
#define PINO_TRIGGER  13 

//Define o pino do Arduino a ser utilizado com o pino Echo do sensor
#define PINO_ECHO     10 

//Inicializa o sensor ultrasonico
Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO); 

//Define os pinos que serão ligados ao LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

void setup()
{
  Serial.begin(9600); //Inicializa a serial
  lcd.begin(16,2); //Inicializa LCD
  lcd.clear();     //Limpa o LCD
}

void loop()
{
  float cmMsec, inMsec;

  //Le os dados do sensor, com o tempo de retorno do sinal
  long microsec = ultrasonic.timing();  

  //Calcula a distancia em centimetros
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); 

  //Calcula a distancia em polegadas
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); 

  //Apresenta os dados, em centimetros, no LCD e na Serial
  lcd.setCursor(0,0);
  lcd.print("Cent.: ");
  lcd.print("        ");
  lcd.setCursor(7,0);
  lcd.print(cmMsec);

  Serial.print("Cent: ");
  Serial.print(cmMsec);

  //Apresenta os dados, em polegadas, no LCD e na Serial  
  lcd.setCursor(0,1);
  lcd.print("Pol. : ");
  lcd.print("        ");
  lcd.setCursor(7,1);
  lcd.print(inMsec);

  Serial.print(", Pol. : ");
  Serial.println(inMsec);

  delay(1000);
}

Recomendo também a leitura do artigo Controle de vagas de estacionamento com o sensor HC-SR04, onde utilizo a biblioteca NewPing para controlar vários sensores ultrassônicos ao mesmo tempo.

137 comentários:

  1. OLA TUDO BEM ME CHAMO LINDERSON ESTOU COM UM PROJETO DE ESCOLA ONDE TENHO Q USAR UM SENSOR ULTRASONICO PARA DETECTAR A PRESENÇA DE UM VEICULO ONDE CONFORME OS VEICULOS SE APROXIMADO DO SENSOR SUA VELOCIDADE DIMINIUI E UM LED VERDE ACENDE,DEPOIS UM AMARELO E POR FINAL UM LED VERMELHO E ASSIM O VEICULO PARA DE IMEDIATO.
    GOSTARIA DE SABER SE TEM COM EU PROGRAMAR ISSO NO PIC 16F628A USANDO O PROGRAMA PIC COMPILEE MODELO DE SENSOR ULTRASONICO POSSO USAR

    OBRIGADO

    LINDERSON

    ResponderExcluir
    Respostas
    1. Bom dia Linderson

      Esse sensor HC-SR04 pode ser usado perfeitamente no PIC, mas eu não tenho programa de exemplo para te passar. Eu sei que funciona pois vendo esse tipo de sensor para usuários que programam em PIC. Abraço.

      Excluir
  2. Amigo seu código ta dando erro!!

    ResponderExcluir
    Respostas
    1. Bom dia ! Pode me falar qual erro está apresentando ? Valeu.

      Excluir
    2. Boa noite!! a IDE sublinha essa linha do código:
      Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO); //Inicializa o sensor ultrasonico
      e manda essa mensagem:
      sketch_oct01b_Medidor_de_distancia_com_HC_SR04:26: error: 'Ultrasonic' has not been declared


      Excluir
    3. Boa tarde. Você instalou a biblioteca Ultrasonic corretamente ?

      Excluir
    4. como a pessoa consegue instalar a biblioteca do ultrasonic??

      Excluir
    5. Boa noite. Depois de baixar a biblioteca no link indicado no artigo, basta descompactar e copiar a para dentro da pasta LIBRARIES que fica dentro do programa do Arduino. Abraço !

      Excluir
    6. ola boa noite eu tentei fazer isso mais dá biblioteca invalida #include

      Excluir
    7. não consigo baixar a biblioteca Ultrassonic

      Excluir
  3. Amigo, boa noite, curti o post, mas sou usuário do PIC e gostaria de saber se posso utilizar este sensor nesta família de microcontroladores. Provavelmente a resposta será que sim, mas não consegui entender como, pois este modelo de sensor não envia um sinal analógico de 0 a 5V, conforme eu oscile o range de distância do mesmo, e sim um disparo de sinal... Não consegui entender como assimilar isto no pic. Vc pode me ajudar?

    ResponderExcluir
  4. Boa tarde ! Pode sim, dê uma olhadinha nesse vídeo do Youtube.

    http://www.youtube.com/watch?v=dRq0e9rwqHo

    O programador usa o PIC juntamente com o HC-SR04, e dá os links para o código e o diagrama. O sensor não envia um sinal analógico. A distância é medida de acordo com o "echo" do sinal, ou seja, dependendo do tempo que o pino fica em estado "alto". Esse tempo é então utilizado em uma fórmula, que converte para centímetros ou polegadas, dependendo do que você precisar. Nesse programa do Arduino que está no meu artigo, a biblioteca acaba fazendo todo o trabalho de cálculo, mas se vc precisar de mais informações sobre o funcionamento do sensor, utilize esse link :

    http://www.webtronico.com/sensor-de-distancia-ultrasonico-hc-sr04.html

    Espero ter ajudado. Um abraço e se precisar de mais informações, utilize o formulário de contato do site. Obrigado !

    ResponderExcluir
  5. Olá, boa tarde!
    Preciso que o meu Arduíno leia dois sensores utlrassônicos ao mesmo tempo... será que tem como?

    ResponderExcluir
    Respostas
    1. Bom dia Guilherme !

      Tem sim, e estou fazendo um post sobre isso. Se precisar dessa solução com urgência, me mande uma mensagem usando o formulário de contato no lado direito da página. Abraço !

      Excluir
    2. Bom dia Guilherme, acabei de postar um novo artigo, mostrando como utilizar 2 sensores HC-SR04 e a biblioteca NewPing :

      http://www.arduinoecia.com.br/2013/12/controle-de-vagas-de-estacionamento-com.html

      Abraço !

      Excluir
  6. Se não estou enganado, você conectou um potenciomêtro no circuito, gostaria de saber qual a finalidade dele no circuito e se é realmente necessário colocá-lo?

    ResponderExcluir
    Respostas
    1. Boa noite. O potenciômetro serve apenas para ajustar o contraste do LCD. Pode até ser substituído por uma resistência, se você preferir. Abraço !

      Excluir
  7. Como posso incluir 3 botões (iniciar, pausar e parar), já que o professor pediu para que as distâncias fossem guardadas na memória, ao clicar no botão parar, ele daria a soma de todas as distâncias. Além disso ele quer que seja usado uma chave seletora para dividir entre uma "trena eletronica" e contador. ???

    ResponderExcluir
    Respostas
    1. Boa tarde.Interessante a sua pergunta. Não é muito difícil de implementar. Você já iniciou a programação ? Abraço !

      Excluir
  8. Posso tentar fazer sem o resistor ou vai queimar?

    ResponderExcluir
    Respostas
    1. Boa tarde. Pode ligar direto. Eu coloquei o resistor para diminuir um pouco a luminosidade. Abraço !

      Excluir
  9. O meu da erro:
    avrdude: stk500_getsync(): not in sync: resp=0x00

    ResponderExcluir
    Respostas
    1. Isso parece ser o erro que acontece quando a IDE perde o sincronismo com o Arduino. Geralmente, basta tirar o cabo USB e conectar novamente.

      Excluir
    2. Isso acontece tbm quando seu atmega 328p queimou

      Excluir
    3. Seu erro pode ocorrer por conta da RXTX estar sendo já utilizada , verifique se não tem nada ligado nessas portas e coloque novamente , isso acontece por conta do usb também ser uma porta serial porém a RXTX que é usada pelo bluetooth etc.. , é prioritária , então é necessário tirar o que esta plugado nelas :D , vlw !

      Excluir
  10. Bom dia, estou a procura de um Arduino ultrassônico para captação de som, vc sabe me informar aonde posso encontrar ou se o que vc está usando serve?

    ResponderExcluir
    Respostas
    1. Bom dia Wellington,

      O HC-SR04 serve mais como um sensor ultrasônico mesmo, detectando objetos e calculando a distância por meio do "eco".

      Não encontrei nenhum sensor parecido com o que você precisa, mas creio que o que você precisa estaria mais relacionado à um microfone de alta sensibilidade. Nesse fórum aqui (em inglês), tem um cara que levanta a mesma questão que você, talvez seja um bom ponto de partida :

      http://electronics.stackexchange.com/questions/96150/recording-ultrasonic-frequencies

      Se descobrir algo e quiser compartilhar aqui com o pessoal do site, fico muito grato.

      Abraços !

      Excluir
  11. A leitura da sendo feita de trás pra frente, exemplo: 20.10 , 19.10 ...
    como faço para ele começar a leitura com 0 depois 1.5 , 2.0, 3.8, 20.5

    ResponderExcluir
    Respostas
    1. Bom dia,

      Nesse caso, você não conseguiria começar do zero, pois o sensor tem uma distância mínima para detecção.

      Se você souber exatamente a distância entre o sensor e o objeto, você consegue mostrar os valores no sentido inverso. É isso que você precisa ?

      Abraço !

      Excluir
    2. Vamos imaginar um pote de 15 cm de altura. O sensor está na boca do pote. Inicialmente o pote está vazio, ele está fazendo uma leitura de +-15 cm. Ao encher o pote com areia digamos 5 cm. O sensor está fazendo a leitura de +-10 cm. Como faço para ele fazer a leitura de +-5 cm e não de +-10 cm. Ou seja ele tem que fazer a leitura da quantidade que eu enche. Se eu encher com 1 cm de areia ele tem que mostra 1 cm de enchido.

      Excluir
    3. Entendi o que você precisa. Acho que o mais indicado é você utilizar a biblioteca NEWPING, que eu comento nesse post :

      http://www.arduinoecia.com.br/2013/12/controle-de-vagas-de-estacionamento-com.html

      Com ela, você tem mais funções para utilização com o HC-SR04, e também consegue determinar a distância máxima de detecção, que no caso do exemplo que você deu, seria de 15 cm. Com isso, é só subtrair os 15 do valor que o sensor detectar. Num exemplo bem simplista, você poderia inserir essa linha de código usando o exemplo desse post mesmo :

      cmMsec = 15 - cmMsec;

      Não sei se resolve o seu problema, mas é um ponto de partida. Se precisar de ajuda ou quiser detalhar mais o seu projeto, entre em contato.

      Abraço !

      Excluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Boa noite. Tem algum link desse display ? Sabe qual controlador ele usa ?

      Abraço !

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
    3. Boa tarde,

      Andei pesquisando, e até achei um datasheet desse display, mas não consegui descobrir ainda qual controlador ele usa :

      http://www.powertipusa.com/pdf/pc2004a.pdf

      De qualquer forma, segundo o datasheet, a pinagem é a mesma de outros displays que eu utilizo nos meus posts. Tente seguir a ligação desse post aqui :

      http://www.arduinoecia.com.br/2013/12/lcd-16-x-2-backlight-azul-hd44780.html

      E tente mudar essa linha, que define o número de linhas e colunas do display :

      lcd.begin(16, 2);

      mude para :

      lcd.begin(20,4);

      Depois me conte o que conseguiu, por favor.

      Abraço !

      Excluir
  13. Já mudei continua igual. A 2ª e a 4ª linha aparecem a preto com os caracteres estranhos :(

    ResponderExcluir
  14. Este comentário foi removido pelo autor.

    ResponderExcluir
  15. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Você está usando a biblioteca Newtone ? Se quiser, poste o código que eu tento ver se consigo compilar aqui.

      Abraço !

      Excluir
  16. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. É quase isso. Explicando de uma forma resumida, seu código do Arduino é separado em 3 partes :

      Parte 1 - Carregamento de bibliotecas, definição de variáveis, etc.
      Parte 2 - Void Setup() - É a parte em que você define as configurações iniciais, que serão executadas apenas uma vez. É ali que você define se os pinos são de entrada ou saída, a inicialização da serial, etc
      Parte 3 - Void loop() - Como o próprio nome diz, é um Loop onde os comando serão executados em sequencia, e , ao final, o processo é repetido continuamente.

      Me conte um pouco sobre o seu projeto. O que você precisa exatamente ?

      Com base nisso, vamos dar uma olhada no código e ver o que precisa ser retirado e/ou acrescentado.

      Abraço !

      Excluir
    2. Eu queria que aparecesse a distância no display e que o buzzer também desse sinal. Mais tarde queria adicionar mais coisas ao projecto como por exemplo mostrar a distância no telemóvel ou ligar e desligar o display/buzzer tudo isto por bluetooth.

      Excluir
    3. Veja se é mais ou menos isso que você precisa. Eu coloquei no inicio do programa o carregamento da biblioteca Newtone , e também as definições do buzzer. No final, antes do delay, coloquei o comando NewTone(....) para acionar o bip a cada vez que ele faz a leitura, ou seja, a cada 1 segundo :

      //Programa : Medidor de distancia com HC-SR04
      //Autor : Arduino e Cia

      #include //Carrega a biblioteca Ultrasonic
      #include //Carrega a biblioteca LCD
      #include

      #define PINO_TRIGGER 13 //Define o pino do Arduino a ser utilizado com o pino Trigger do sensor
      #define PINO_ECHO 10 //Define o pino do Arduino a ser utilizado com o pino Echo do sensor

      Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO); //Inicializa o sensor ultrasonico
      LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Define os pinos que serão ligados ao LCD

      //Dados do buzzer
      #define tempo 500
      int frequencia = 2000;
      int Pinofalante = 7;
      int atraso = 1000;

      void setup()
      {
      Serial.begin(9600); //Inicializa a serial
      lcd.begin(16,2); //Inicializa LCD
      lcd.clear(); //Limpa o LCD
      }

      void loop()
      {
      float cmMsec, inMsec;

      long microsec = ultrasonic.timing(); //Le os dados do sensor, com o tempo de retorno do sinal

      cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); //Calcula a distancia em centimetros
      inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); //Calcula a distancia em polegadas

      //Apresenta os dados, em centimetros, no LCD e na Serial
      lcd.setCursor(0,0);
      lcd.print("Cent.: ");
      lcd.print(" ");
      lcd.setCursor(7,0);
      lcd.print(cmMsec);
      Serial.print("Cent: ");
      Serial.print(cmMsec);

      //Apresenta os dados, em polegadas, no LCD e na Serial
      lcd.setCursor(0,1);
      lcd.print("Pol. : ");
      lcd.print(" ");
      lcd.setCursor(7,1);
      lcd.print(inMsec);
      Serial.print(", Pol. : ");
      Serial.println(inMsec);
      //Aciona o bip
      NewTone(Pinofalante, frequencia, tempo);
      delay(1000);
      }

      Excluir
    4. Creio que por motivos de segurança os comentários não aceitam qualquer formatação. No começo do programa, carregue as bibliotecas dessa maneira :

      #include (sinal de menor)Ultrasonic.h(sinal de maior) //Carrega a biblioteca Ultrasonic
      #include (sinal de menor)LiquidCrystal.h(sinal de maior) //Carrega a biblioteca LCD
      #include (sinal de menor)NewTone.h(sinal de maior)

      Qualquer dúvida, é só dar uma olhada no exemplo do post. Abraço.

      Excluir
  17. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Entendi. O que você precisa então é do programa do sensor de ré, com as funções do display do Medidor de Distancia :

      //Programa : Sensor de estacionamento com HC-SR04
      //Autor : Arduino e Cia

      #include //Carrega a biblioteca Ultrasonic
      #include //Carrega a biblioteca Newtone
      #include //Carrega a biblioteca LCD

      //Dados do buzzer
      #define tempo 500
      int frequencia = 2000;
      int Pinofalante = 2;

      int atraso = 1000;

      //Define o pino do Arduino a ser utilizado com o pino Trigger do sensor
      #define PINO_TRIGGER 13
      //Define o pino do Arduino a ser utilizado com o pino Echo do sensor
      #define PINO_ECHO 10

      //Inicializa o sensor ultrasonico
      Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO);

      // Inicializa o display
      LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Define os pinos que serão ligados ao LCD

      void setup()
      {
      pinMode(Pinofalante,OUTPUT); //Pino do buzzer
      Serial.begin(9600); //Inicializa a serial
      lcd.begin(20,4); //Inicializa LCD
      lcd.clear(); //Limpa o LCD
      }

      void loop()
      {
      float cmMsec, inMsec;

      //Le os dados do sensor, com o tempo de retorno do sinal
      long microsec = ultrasonic.timing();

      //Calcula a distancia em centimetros
      cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

      //Ajusta o atraso de acordo com a distancia
      if (cmMsec > 80)
      {
      atraso = 2000;
      //Apresenta os dados, em centimetros, no LCD e na Serial
      lcd.setCursor(0,0);
      lcd.print("Cent.: ");
      lcd.print(" ");
      lcd.setCursor(7,0);
      lcd.print(cmMsec);
      Serial.print("Cent: ");
      Serial.print(cmMsec);
      }
      else if (cmMsec >50 && cmMsec<80)
      {
      atraso = 1500;
      //Apresenta os dados, em centimetros, no LCD e na Serial
      lcd.setCursor(0,0);
      lcd.print("Cent.: ");
      lcd.print(" ");
      lcd.setCursor(7,0);
      lcd.print(cmMsec);
      Serial.print("Cent: ");
      Serial.print(cmMsec);
      }
      else if (cmMsec >30 && cmMsec<50)
      {
      atraso = 1200;
      //Apresenta os dados, em centimetros, no LCD e na Serial
      lcd.setCursor(0,0);
      lcd.print("Cent.: ");
      lcd.print(" ");
      lcd.setCursor(7,0);
      lcd.print(cmMsec);
      Serial.print("Cent: ");
      Serial.print(cmMsec);
      }
      else if (cmMsec > 10 && cmMsec < 30)
      {
      atraso = 700;
      //Apresenta os dados, em centimetros, no LCD e na Serial
      lcd.setCursor(0,0);
      lcd.print("Cent.: ");
      lcd.print(" ");
      lcd.setCursor(7,0);
      lcd.print(cmMsec);
      Serial.print("Cent: ");
      Serial.print(cmMsec);
      }
      else if (cmMsec < 10)
      {
      atraso = 300;
      //Apresenta os dados, em centimetros, no LCD e na Serial
      lcd.setCursor(0,0);
      lcd.print("Cent.: ");
      lcd.print(" ");
      lcd.setCursor(7,0);
      lcd.print(cmMsec);
      Serial.print("Cent: ");
      Serial.print(cmMsec);
      }

      NewTone(Pinofalante, frequencia, tempo);

      delay(atraso);
      }


      Não esqueça de carregar as bibliotecas Ultrasonica, Newtone e LiquidCrystal no começo do programa.

      Abraço !

      Excluir
  18. Este comentário foi removido pelo autor.

    ResponderExcluir
  19. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Sem problemas, vamos ver no que posso te ajudar. :-)

      Depois de todas as linhas que tiverem esse comentário :

      //Apresenta os dados, em centimetros, no LCD e na Serial

      Coloque essa linha de comando :

      lcd.clear(); //Limpa o LCD

      Vamos por partes. Veja se a exibição dos dados está correta, por favor.

      Abraço !

      Excluir
  20. Este comentário foi removido pelo autor.

    ResponderExcluir
  21. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Estranho esse problema da distância. Vou tentar montar o circuito aqui e ver se esse erro aparece.

      Quanto ao buzzer, creio que seja alguma coisa referente à ligação, você já verificou se a polaridade está certa ?

      Abraço

      Excluir
  22. Amigo, como faço pra usar esse projeto no micro controlador MSP430 obrigado>

    ResponderExcluir
    Respostas
    1. Boa tarde Jhonas,

      Vou ficar te devendo, não conheço muito este microcontrolador. Mas achei um artigo que talvez sirva de ponto de partida :

      http://www.meanpc.com/2012/09/using-hc-sr04-ultrasonic-sensor-with-ti.html

      Abraço !

      Excluir
  23. Olá, boa noite. Estou usando o Arduino uno. mas aparece uns erros como: long microsec = ultrasonic.timing();

    sketch_may17a.ino: In function 'void loop()':
    sketch_may17a:24: error: 'class Ultrasonic' has no member named 'timing'
    sketch_may17a:26: error: 'class Ultrasonic' has no member named 'convert'
    sketch_may17a:26: error: expected unqualified-id before numeric constant
    sketch_may17a:27: error: 'class Ultrasonic' has no member named 'convert'
    sketch_may17a:27: error: 'IN' is not a member of 'Ultrasonic'

    já instalei a biblioteca do ultra_sônico e o erro permanece.

    a versão do IDE é 1.0.5

    ResponderExcluir
    Respostas
    1. Boa tarde Jhonas,

      Isso parece ser mesmo erro de biblioteca, ou algum erro na instalação, ou a versão não é a mesma que estou usando nesse post. Verifique essa parte, por favor. Faça o download da biblioteca nesse link :

      http://freecode.com/projects/hc-sr04-ultrasonic-arduino-library

      Abraço !

      Excluir
  24. Este comentário foi removido pelo autor.

    ResponderExcluir
  25. Boa tarde,

    Acho que o que você precisa está nesse post :

    http://www.arduinoecia.com.br/2014/04/sensor-de-estacionamento-re-com-arduino.html

    Espero que ajude. Qualquer coisa. é só perguntar

    Abraços !

    ResponderExcluir
  26. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Junto com essas linhas :

      Serial.print("Cent: ");
      Serial.print(cmMsec);

      Você pode incluir o comando lcd.print ou lcd.println para mostrar as informações no Display, já que elas já estão disponíveis no programa (variável cmMsec).

      Não esqueça de carregar a biblioteca LiquidCrystal no começo do programa.

      Abraço !

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
    3. Boa tarde,

      Não consigo, pois estou desenvolvendo outros posts e precisaria desmontar tudo e testar.

      Mas se quiser tentar eu posso te ajudar a tirar as dúvidas depois.

      Abraço !

      Excluir
  27. Obgado ADM, mas o erro persiste. Tudo indica que não está reconhecendo a biblioteca, a versão é 1.0.5 sistema operacional windows XP. será que o sistema XP pode interferir? me ajuda, é trabalho de TCC pra junho.

    erro

    sketch_may19a.ino: In function 'void loop()':
    sketch_may19a:24: error: 'class Ultrasonic' has no member named 'timing'
    sketch_may19a:26: error: 'class Ultrasonic' has no member named 'convert'
    sketch_may19a:26: error: expected unqualified-id before numeric constant
    sketch_may19a:27: error: 'class Ultrasonic' has no member named 'convert'
    sketch_may19a:27: error: 'IN' is not a member of 'Ultrasonic'

    ResponderExcluir
    Respostas
    1. Bom dia Jhonas,

      Realmente parece algum erro de biblioteca. Se possível, me passe o código completo usando o formulário de contato no lado direito da página, que eu tento compilar aqui e te falar o que está acontecendo de errado.

      Se o código for o mesmo que estou utilizando nesse post, está compilando certinho, acabei de testar, blz ?

      Abraço.

      Excluir
  28. Boas. Era só para agradecer. Finalmente consegui por tudo a funcionar.

    Obrigado pela ajuda e espero que publique mais projectos interessantes.

    Abraços!

    ResponderExcluir
    Respostas
    1. Boa noite,

      Agradeço o retorno e aguardo sua visita em breve.

      Abraços !

      Excluir
  29. o código é o que vc está usando. O erro persiste. Fiz o seguinte teste:
    - Coloquei um exemplo do ultrasônico para rodar, o erro persistiu. affs

    ResponderExcluir
    Respostas
    1. Oi Jhonas,

      Puxa, se nem com o exemplo da biblioteca o programa compila, o problema é sério. rs

      Eu testaria uma instalação da IDE e da biblioteca "do zero" em outro computador, apenas para tentar isolar o problema.

      Abraço !

      Excluir
    2. O erro (class has no member named timing) ele não identifica algum membro chamado tempo ADM?

      Excluir
    3. Bom dia Jhonas,

      É mais ou menos isso...você tentou instalar a biblioteca e e compilador em outro computador ? Parece que temos aí uma versão de biblioteca incorreta ou alguma incompatiblidade com a versão da IDE.

      Abraço.

      Excluir
  30. Olá ADM, montei o projeto, tudo certo, muito obrgado, porém o sensor fixa um num e não varia de acordo com a aproximação do objeto. o que fazer?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Teria que ver o circuito para ver o que está acontecendo. Pode ser algum problema no circuito, e veja também se os pinos do seu módulo correspondem aos pinos do módulo que eu uso no post.

      Abraço !

      Excluir
  31. MAIS LOCO QUE FAR CRY!!!!!!!!

    ResponderExcluir
  32. Excelentes tópicos, muita informações consegui aqui! estou construindo um braço robotico, esta quase pronto! quero mostrar as posições dos servo em display lcd 20x4 mas o lcd mostra alguns caracteres estranhos(parece letras japonesas).
    ex:
    if (results.value == 16761405 || results.value == 2400 || results.value == 352)
    if(pos1 < 179)
    pos1 = pos1 + 1;
    delay(35);
    Serial.println("Posicao J1");
    Serial.println(pos1);
    lcd.setCursor(0,1);
    lcd.print(pos1);
    j1.write(pos1);

    o que pode estar errado ? Obrigado e Excelente trabalho!

    ResponderExcluir
    Respostas
    1. Bom dia Leandro,

      Obrigado pela visita. Esses caracteres aparecem só quando vc manda imprimir a variável pos1 ?

      Abraço.

      Excluir
  33. Boa Noite. ja é o segundo codigo q nao copila =( sempre da essa mensagem 'class Ultrasonic' has no member named 'timing'
    ????

    ResponderExcluir
    Respostas
    1. Bom dia Renan,

      Acabei de testar esse mesmo programa, com a biblioteca mencionada no link (biblioteca versão 1.1.2). E funcionou normalmente.

      Você está usando alguma versão de IDE diferente ou a biblioteca foi baixada de algum outro lugar ?

      Abraço !

      Excluir
  34. Instalei tudo certinho roda o programa, mas acho que meu modulo esta queimado pois não aparece valor algum, ja troquei cabos e nada, aparece tudo zero! como posso ter certeza que modulo esta funcionando ?

    ResponderExcluir
    Respostas
    1. Bom dia Leandro,

      Os valores aparecem no serial monitor ?

      Abraço !

      Excluir
    2. tenho o mesmo problema e sim no serial monitor todos os valores são zero. experimentei tirar os fios e então o Arduino me deu valores aleatórios, e quando liguei de novo... os mesmos zeros

      Excluir
  35. Boa tarde. Consegui fazer o projeto funcionar, porém ele parece medir errado, como se estivesse descalibrado. Por Exemplo: Um objeto a uns 10 cm, ele marca no Serial Monitor 172,36 cm. Tem como consertar isso? E obrigado por disponibilizar seu trabalho.

    ResponderExcluir
    Respostas
    1. Boa noite Evandro,

      Você teria outro HC-SR04 para testar ? Se não tiver, verifique as conexões dos pinos Echo e Trigger. Já tive informações também de alguns módulos em que esses pinos vieram invertidos na marcação. Tente inverter os fios e ver se funciona.

      Abraços !

      Excluir
  36. Boa noite,
    Tenho procurado a muito tempo um programa que leia tantas casas decimais em CM como o seu, fiz o download da biblioteca, add ela porem quando fui compilar o codigo ocorreu o seguinte problema:


    sketch_aug31a.ino: In function 'void loop()':
    sketch_aug31a:31: error: 'class Ultrasonic' has no member named 'timing'
    sketch_aug31a:34: error: 'class Ultrasonic' has no member named 'convert'
    sketch_aug31a:34: error: expected unqualified-id before numeric constant
    sketch_aug31a:37: error: 'class Ultrasonic' has no member named 'convert'
    sketch_aug31a:37: error: 'IN' is not a member of 'Ultrasonic'

    voce sabe o que pode ser?

    ResponderExcluir
    Respostas
    1. Boa tarde Thiago,

      Você reiniciou a IDE depois da instalação da biblioteca ?

      Abraço.

      Excluir
  37. Estou precisando de ajudar para terminar a programação de um robô para competição.
    Estou usando o sensor ultrassom HCSR-04 para o robô detectar obstáculos e depois, dentro de um loop conseguir desviar do mesmo. O programa funciona corretamente. O problema é que de alguma forma, o sensor frontal fica com valor zero (0) de vez em quando e prejudica o desempenho do robô. Porém, quando coloco o programa do ultrassom apenas para informar a distancia, fica apresentando a distância normal, sem oscilações. Resumindo: no programa do robô (o circuito eletrônico usa todas as portas digitais para sensores, servos - apenas este com alimentação externa) a distância do sensor frontal não fica constante com o sensor parado - parecendo até mal funcionamento. Favor ajudar, que meus alunos já tentaram, eu já tentei, mudei o formato do programa, já troquei vários sensores, porém, estou achando que o problema é nas portas do Arduino. Agradeço antecipadamente. Flávio

    #include
    #include
    #include "Ultrasonic.h"
    Ultrasonic ultrasonic(7,6);
    long microsec = 0;
    float distanciaCM = 0;

    Servo servo1; // servo ESQUERDA 72 e 73 para
    Servo servo2; // servo DIREITA 69 e 70 para

    //#define echoPin 6 //Pino 8 recebe o pulso do echo
    //#define trigPin 7 //Pino 7 envia o pulso para gerar o echo
    #define echoPin3 8
    #define trigPin3 9
    #define echoPin2 10
    #define trigPin2 11

    int sensoresquerda = 2;
    int sensordireita = 5;
    int sensoresqMEIO = 3;
    int sensordirMEIO = 4;

    long duration = 0;
    float distancia = 0;

    int valorsensoresqMEIO = 0;
    int valorsensordirMEIO = 0;
    int valorsensoresquerda = 0;
    int valorsensordireita = 0;

    int tempo = 0;
    int tempogira = 900;
    int s1frente = 90;
    int s2frente = 49;
    void setup() //------------------------------------------------------------------------
    {
    //configuração dos pinos dos sensores
    pinMode (sensoresquerda, INPUT);
    pinMode (sensordireita, INPUT);
    pinMode(sensoresqMEIO, INPUT);
    pinMode(sensordirMEIO, INPUT);

    // pinMode(echoPin, INPUT);
    // pinMode(trigPin, OUTPUT);
    pinMode(echoPin2, INPUT);
    pinMode(trigPin2, OUTPUT);
    pinMode(echoPin3, INPUT);
    pinMode(trigPin3, OUTPUT);

    Serial.begin (9600);
    servo1.attach(13); // portas dos servos 1 e 2
    servo2.attach(12);
    }
    void loop() //-----------------------------------------------------------------------
    {


    servo1.write(90);
    servo2.write(49);

    microsec = ultrasonic.timing(); //Lendo o sensor
    distanciaCM = ultrasonic.convert(microsec, Ultrasonic::CM); //Convertendo a distância em CM
    Serial.print(distanciaCM);
    Serial.println(" cm");
    if (distanciaCM <= 4)
    {
    Serial.print("OBSTÁCULO");
    servo1.write(180); // GIRA PARA DIREITA
    servo2.write(180);
    delay(700);
    int sinal = 0;

    while (sinal != 1)
    {
    digitalWrite(trigPin2, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin2, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin2, LOW);
    long duration2 = pulseIn(echoPin2,HIGH);
    long d2 = duration2 /29 / 2 ;

    digitalWrite(trigPin3, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin3, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin3, LOW);
    long duration3 = pulseIn(echoPin3,HIGH);
    long d3 = duration3 /29 / 2 ;

    if (d2 > d3)
    {
    servo1.write(72); // gira para esquerda com servo1 parado // 72 e 0
    servo2.write(0);
    delay (150);
    }
    if (d2 < d3)
    {
    servo1.write(180); // 180 - 69
    servo2.write(69);
    delay (150);
    }
    if (d2 == d3)
    {
    servo1.write(90); // PARA FRENTE
    servo2.write(49);
    delay (100);
    }}


    delay (50);
    } }

    ResponderExcluir
    Respostas
    1. Também estou com esse mesmo problema. O programa parece está bem. Funciona bem por um tempo e aleatoriamente o sensor começa a mostrar zero, o que prejudica muito o funcionamento do projeto. Jah estou a acreditar que é problema no sensor. Caso tenha resolvido o problema. Como fez? Vlw!

      Excluir
  38. Boa tarde tenho um trabalho da facu para fazer utilizando este sensor e o programa quartus, alguem aqui sabe como?
    Grato
    Luiz

    ResponderExcluir
  39. Olá excelente seu trabalho, gostaria que você pudesse me ajudar, tem com durante a medição quando o sensor marcar por exemplo 5 cm o pino 7 da saída digital tenha um nível logico alto, obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde Alexander,

      Obrigado. Tente fazer um "IF" simples, testando o valor da distancia em cm:

      if (cmMsec = 5) //Verifica se a distancia e igual a 5 cm
      {
      digitalWrite(7, HIGH); //Aciona a porta 7
      }

      Abraço !

      Excluir
  40. Bom dia! Gostaria de saber como ler no monitor serial o tempo em segundos que o sinal leva até retornar ao invés de ler a distancia percorrida em si. Gostaria apenas de ler o tempo. Fico extremamente grato pela resposta!

    ResponderExcluir
    Respostas
    1. Boa tarde Lucas,

      Por favor dê uma olhad aneste artigo, creio que tenha o que vc precisa: http://www.instructables.com/id/Easy-ultrasonic-4-pin-sensor-monitoring-hc-sr04/?ALLSTEPS

      Abraço !

      Excluir
  41. quando uso este sensor com o módulo de comunicação RF 433Mhz o sensor só mostra zero. Sem o código do receptor ele mede direito. Onde posso estar errando? São incompatíveis?

    ResponderExcluir
  42. tentei usar com o módulo de comunicação RF 433 Mhz e o sensor só mostra zero. São Incompatíveis?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Nunca usei os 2 juntos, mas até onde eu sei, deveria funcionar.

      Abraço!

      Excluir
    2. Também tive esse mesmo problema. Posso estar falando besteira, mas penso que isso tenha a ver com os Timmers do microprocessador... Não tenho conhecimento, mas ouvi falar sobre isso. Se alguém tiver alguma resposta pra esse erro: lyang.mdrs@gmail.com

      Valeu!

      Excluir
    3. Resolvi trocando as porta onde o sensor ultrassônico estava conectado.

      Excluir
  43. Olá
    Primeiramente parabéns pelo site.
    Gostaria de saber se no seguidor de linha, posso colocar este sensor, sendo que ao avistar um obstaculo terá que parar por 10 segundo e depois retornar ao percurso normal. Como faço isso.
    Preciso de uma força aí.
    Obrigado
    Carlos

    ResponderExcluir
  44. HOLA QUE TAL SALUDOS Y FELICITACIONES POR SUS APORTES EN ARDUINO
    ESTOY CORRIENDO SU PROGRAMA DEL SENSOR ULTRASONICO PERO ME SALE UN ERROR AL COMPILAR: YA CARGE LAS LIBRERIAS.

    inMsec = ultrasonic.convert (microsegundos, ultrasónico :: EN);

    PODRÍA APOYARME POR FAVOR?
    MUCHAS GRACIAS SALUDOS DESDE MEXICO

    ResponderExcluir
    Respostas
    1. Gracias Roberto!

      Compruebe la instalación de la biblioteca, por favor.

      ¡Saludos desde Brasil! :)

      Excluir
  45. Bom dia,
    preciso usar um sensor HC-sr04 como um sensor de presença, que detecta qualquer objeto a 4m de distância, o problema que eu estou tendo é o seguinte:

    Coloquei no "loop" o delay com valor "10", e, realmente eu preciso que ele fique fazendo a leitura assim mesmo, em um pequeno espaço de tempo, mas, quando não se tem nada na frente do sensor, ele demora muito tempo para liberar o loop, acredito que ele fica esperando o sinal de ECO, mas eu preciso que ele não fique esperando, pois tem que ser rápido, se vc souber alguma maneira de melhorar este problema agradeço.

    Att. Hemerson

    ResponderExcluir
    Respostas
    1. Boa noite Hemerson,

      Creio que esse tempo esteja muito curto, e o sensor ultrassônico não está tendo tempo de processar o sinal. Uma opção é você tentar algum tipo de sensor ultrassônico mais rápido (não sei se existe), ou usar algum outro tipo de sensor no seu projeto.

      Abraço!

      Excluir
    2. Boa tarde Hemerson, meu projeto é parecido e estou tendo o mesmo problema. Se conseguiu resolve-lo ou achar outra alternativa, poderia me dizer.
      Agradeço!!!

      Excluir
    3. Boa tarde, quero saber se existe um modo de fazer com que o ECHO não espere tanto tempo pelo retorno do sinal? Quero que o TRIGGER emita sinais periºodicos mesmo se n|ao houver leitura do ECHO.
      Obrigado!!

      Excluir
  46. Olá,
    Montei o esquema mostrado e compilei tudo certo, queria que alem de mostrar as medidas no LCD, mostrasse tambem no serial monitor do arduino no computador. Não estou conseguindo fazer isso.

    Obrigada

    ResponderExcluir
    Respostas
    1. Bom dia Ana,

      O programa já está configurado para mostrar no Serial Monitor as medidas... No display aparece normalmente ?

      Abraço!

      Excluir
    2. Então, essa é a questão, não sei se está configurado para mostra no monitor. Quando peguei o projeto ele já estava meio que tudo montado e com o programa já feito, compilei no meu computador mas ele não mostra no serial monitor. No display mostra certinho.

      Excluir
    3. Boa noite Ana,

      Entendi. Gostaria de dar uma olhada no programa, deve ser algum detalhe fácil de resolver.

      Se preferir, use o formulário de contato no lado direito da página para mandar o código.

      Abraço!

      Excluir
    4. Ok, mandarei! Obrigada (:

      Excluir
  47. Boa noite gostaria de usar este sensor em um andador, quero colocar ele para o caso da criança que esta usando estiver em uma rampa e perder o controle assim o sensor detecte que a velocidade aumentou e envie um sinal para que os freios sejam acionados. o meu projeto e um andador com freios automatizados e sensor de distancia pra evitar que a criança bata com o andador em algum obstaculo, um projeto de tecnologia assistiva para uma criança com limitações.. se puderem me ajudar ficarei grata!
    Att. Mariana souza

    ResponderExcluir
    Respostas
    1. Bom dia Mariana,

      Interessante o seu projeto. Só fico em dúvida se o sensor ultrassônico é rápido o suficiente para detectar a velocidade, como você precisa.

      Outra questão é o tipo de freio, que não pode ser muito brusco, senão você corre o risco de arremessar a pessoa/criança para fora do andador, ou até mesmo tombá-lo.

      Abraço!

      Excluir
  48. ou nao consigo instalar a biblioteca

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Que mensagem de erro está aparecendo ?

      Abraço!

      Excluir
  49. Olá, fiz esse circuito mas nao aparece nada no diplay. só acende o blacklight. Anguem pode me ajudar ?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Você ligou o potenciômetro corretamente ?

      Abraço!

      Excluir
  50. Boa noite estou tentando testar o seu código, porem quando eu compilo o código, recebo um erro 'class Ultrasonic' has no member named 'convert' você pode me dizer como resolver este erro.

    ResponderExcluir
    Respostas
    1. Oi Marcelo,

      Você está usando a mesma biblioteca indicada no post ? Qual a versão da sua IDE ?

      Abraço!

      Excluir
  51. Bom dia , queria saber qual era o valor da resistência .

    ResponderExcluir
    Respostas
    1. Bom dia,

      Eu usei uma de 10K, mas você pode experimentar outros valores pra ver como fica a iluminação do display.

      Abraço!

      Excluir
  52. Alguem conseguiu resolver o problema de compilação do programa? da erro no timing e no convert

    ResponderExcluir
    Respostas
    1. Olá,

      Tem certeza que você carregou a biblioteca que está no post ? acabei de usar essa biblioteca com a IDE 1.6.7, e funcionou normalmente.

      Creio que no seu caso seja conflito com alguma biblioteca existente.

      Abraço!

      Excluir
  53. Bom dia , o Código de Arduino que está nesta pagina não esta a dar.
    Tem o seguinte problema:
    ultrasonic.h: No such file or directory

    ResponderExcluir
    Respostas
    1. Boa noite,

      Por favor verifique a instalação da biblioteca.

      Abraço!

      Excluir
  54. bom dia estou com um erro e não consigo corrigi-lo tem como me ajudar
    e nesta linha
    //Inicializa o sensor ultrasonico
    ultrasonic ultrasonic(PINO_TRIGGER,PINO_ECHO);
    erro é este :
    exit status 1
    'ultrasonic' does not name a type
    tradução:status de saída 1
    " Ultra-som " não nomeia um tipo
    obrigado se poder me ajudar agradeço

    ResponderExcluir
    Respostas
    1. Boa tarde Claudemir,

      É algum erro na instalação da biblioteca. Veja se não está em conflito com alguma outra que você já tenha instalado na IDE.

      Abraço!

      Excluir
  55. Boa tarde.

    não estou conseguindo compilar esse código do sensor

    ResponderExcluir
  56. Olá , primeiramente parabéns pelo projeto, não sou da área sou bióloga mas gostaria de saber se este projeto pode ser usado no acompanhamento de crescimento de um vegetal?

    ResponderExcluir
    Respostas
    1. Oi Graciela,

      Interessante o seu projeto. Teoricamente sim, mas teríamos que fazer testes.

      Caso precise de ajuda para implementar, entre em contato utilizando o formulário de contato no lado direito da página.

      Abraço!

      Excluir
  57. O link para baixar a biblioteca Ultrasonic.h não está mais disponível, onde posso encontrá-lo?

    ResponderExcluir
    Respostas
    1. Boa noite,

      O link está funcionando normalmente. Pode tentar de novo ?

      Abraço!

      Excluir
  58. o link para baixar a biblioteca Ultrasonic não esta mais disponível aqui também

    ResponderExcluir
  59. bom dia, sou iniciante no arduino e gostaria de ajuda na parte de software , preciso fazer um trabalho pratico onde um sensor ultrassonico (Sensor de Distância Ultrassônico HC-SR04) tem que abrir um rele(modulo rele 5v) quando um objeto fica a 1metro do sensor, e permanecer aberto(rele) até que seja resetado o erro e dado inicio ao processo novamente. obrigado

    ResponderExcluir
  60. bom dia preciso modificar meu trabalho para medir a altura de uma pessoa embaixo do sensor

    ResponderExcluir