O HC-SR04 tem seu funcionamento baseado no envio (trigger) e recebimento (echo) de ondas ultrassônicas, ou seja, o sensor não envia nenhuma medida para o controlador, apenas sinaliza quando o pulso enviado é recebido. Neste caso o Arduino é responsável por medir o tempo e calcular as distâncias, tomando como referência o tempo que a onda ultrassônica demora para atingir um objeto e voltar.
No gif abaixo é possível observar o efeito citado anteriormente. Quando medimos o pino echo do sensor com auxílio do osciloscópio verificamos a variação da largura do pulso (tempo) quando a distância sofre variação.
Leitura com Osciloscópio
Depois de medir o tempo da onda ultrassônica, o Arduino também se encarrega em calcular a distância que o sensor está do objeto, utilizando a equação abaixo, presente na biblioteca Ultrasonic.
Aplicação
Monte o sensor na Blackboard/Arduino seguindo o esquemático apresentado a seguir. Ligando os pinos de alimentação do sensor (5V e GND), o pino ECHO ao pino 13 e TRIG ao pino 12.
Circuito Elétrico
Faça o download da biblioteca do sensor pelo botão abaixo.
Se você quer realizar a leitura do sensor ultrassônico sem o uso de biblioteca, pode se basear na lógica de leitura utilizada na biblioteca (arquivo "Ultrassonic.cpp" contido no arquivo ZIP do botão acima), juntamente com o datasheet do sensor (https://s3-sa-east-1.amazonaws.com/robocore-lojavirtual/620/HCSR04.pdf), para entender melhor como fazer o cálculo de conversão.
mateusfranck Enviado: 2022-02-09 18:25:27
#include <Ultrasonic.h>
#define pino_trigger 7
#define pino_echo 6
Ultrasonic ultrasonic(pino_trigger, pino_echo);
void setup()
{
Serial.begin(9600);
Serial.println("Lendo dados do sensor...");
}
void loop()
{
//Le as informacoes do sensor, em cm e pol
float cmMsec, inMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
não sei porque estou tendo dificuldade para converte o tempo em distancia sempre dar erro
A biblioteca "Ultrassonic" utilizada neste tutorial não possui as funções "timing()" e "convert()", apenas a função "distance()" que retorna o valor já convertido em centímetros. Se estiver utilizando outra biblioteca, é necessário ler a documentação dela para entender melhor como usar suas funções.
A_S_Falcao Enviado: 2021-09-14 18:50:55
Olá,
Escrevi um script simples baseado no exemplo do site.
#include "Ultrasonic.h"
// Arduino Mega Robocore
// Trigger = 26 Fio Azul
// Echo = 24 Fio Verde
HC_SR04 sensor(26, 24); //Configura os pinos sensor ultrassonico (Trigger, Echo)
void setup()
{
Serial.begin(9600);
Serial.println ("Hola, que tal!");
}
void loop()
{
Serial.print(sensor.distance()); //Exibe no terminal as medidas
Serial.println(" cm");
delay(100);
}
Resultado:
Hola, que tal!
0 cm
0 cm
Testei meses atrás com Arduino Uno e o teste foi OK. Troquei por sensor novo e o erro continua.Alguma dica?
Baixei a biblioteca do site e uso a IDE 1.8.15 com Arduino Mega Robocore Black. Jà usei os pinos 12 e 13 e 4 e 5 mas o erro continua.
Giovanni5
Enviado: 2021-09-15 11:39:03
A_S_Falcao
Esta biblioteca não possui nenhuma incompatibilidade com as placas da plataforma Arduino Mega, e se os sensores estão funcionando com uma placa Arduino UNO, não há porque não funcionar com a Mega. Parece algo besta, mas algo que costuma impedir o funcionamento de sensores ultrassônicos é a inversão na conexão dos pinos trigger e echo.
Obrigado pela resposta.
Os fios estavam ligados da forma correta. Aí desconfiei dos jumpers e medi com um multímetro. Um deles tinha mau contato. Troquei o jumper e funcionou OK.
Boa tarde, estou montando um projeto de sensor de estacionamento, de modo que conforme a distancia seja apresentada num LCD aciona-se o buzzer em diferentes intervalos e acendem-se leds para indicar as faixas de proximidade com o obstaculo. Porém tenho me deparado com uma grande variação de leitura das medidas de modo que tem atrapalhado no acionamento dos leds e buzzer. Estou tentando coletar amostras de medidas, tirando a media entre elas mas o me programa não tem funcionado corretamente. Existem funções ou outras maneiras de coletar amostras mais confiaveis desse sensor?
Francois
Enviado: 2018-09-10 16:13:14
Emanuelf
Este sensor é indicado para esse tipo de aplicação. Além da média móvel das leituras, é recomendado que você faça leituras com pelo menos 100 ms de intervalo entre elas. Esse tempo impede que uma leitura interfira na próxima. Verifique também as conexões, pois um mau contato pode prejudicar a leitura.
tonyf.eng Enviado: 2018-09-03 19:30:36
Boa noite!
Gostaria de saber se é possível calcular a quantidade de ML /Litros em uma caixa dágua, se sim...tem como enviar um sketch de exemplo? Obrigado.
ViniDj
Enviado: 2018-09-04 09:54:21
tonyf.eng
Uma vez que você consegue relacionar a altura do líquido com o volume interno, fazendo uma regra de três simples você consegue saber quanto ele está cheio. Não temos um código pronto para isso, de toda forma com o estudo adequado você consegue chegar nesse código facilmente.
nicolygabricuch Enviado: 2018-08-29 09:48:32
Bom dia, estou fazendo um protótipo que tem como objetivo acionar o buzzer quando 1 dos sensores ultrassônicos for acionado, porém esta dando erro. O código que estou utilizando é esse:
#include <Ultrasonic.h>
//Define os pinos para o trigger e echo
#define pino_trigger1 4
#define pino_echo1 5
#define pino_trigger2 8
#define pino_echo2 9
#define buzzer 13
//Inicializa o sensor nos pinos definidos acima
Ultrasonic ultrasonic1(pino_trigger1, pino_echo1);
Ultrasonic ultrasonic2(pino_trigger2, pino_echo2);
void setup()
{
Serial.begin(9600);
Serial.println("Lendo dados do sensor...");
pinMode(buzzer,OUTPUT); //Pino do buzzer
}
void loop()
{
float cm1, cm2;
//Le as informacoes do sensor 1
long microsec1 = ultrasonic1.timing();
cm1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);
//Le as informacoes do sensor 2
long microsec2 = ultrasonic2.timing();
cm2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);
//Exibe informacoes no serial monitor
Serial.print("Distancia em cm sensor1: ");
Serial.println (cm1);
//Exibe informacoes no serial monitor
Serial.print("Distancia em cm sensor2: ");
Serial.println (cm2);
if (cm1 < 30) {
tone (buzzer,300,50 );
}
else {
noTone(buzzer);
}
delay(200);
}
e esta dando erro nesta linha: cm2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);
alguém poderia me auxiliar?
Verifique as conexões dos seus sensores e adicione um intervalo de tempo entre cada leitura (~100 ms), pois um sensor pode influenciar no outro.
lxaraujo Enviado: 2018-07-12 10:30:01
Bom dia. Estou desenvolvendo um AGV para funcionar em uma área industrial e vou precisar colocar 6 sensores ultrasonicos nele. Eu posso utilizar um pino apenas para fazer o trigger dos 6 simultaneamente e 6 pinos independentes para identificar o echo? Estou projetando o circuito para usar uma mega. Obrigado
ViniDj
Enviado: 2018-07-12 12:13:39
lxaraujo
Talvez se puder usar mais pinos para trigger seja melhor, de toda forma, se conseguir fazer um software robusto talvez dê certo. Lembre-se que o HC-SR04 não é um sensor padrão industrial, portanto dependendo do ambiente pode ser necessário usar um sensor industrial.
Josecarlosbueno Enviado: 2018-03-06 16:16:11
Boa tarde , estou tendo problema para ligar o buzzer, sera que pode me ajudar, eu tirei o LCD e coloque ele no lugar para apitada quando tiver um obstaculo x cm, mas o mesmo não esta funcionando... Obrigado pela ajuda...
O primeiro passo é verificar o circuito que você montou. Em seguida você pode adicionar uma rotina <if> para acionar o buzzer quando a distância lida for menor do que um valor predefinido, e desligá-lo quando for maior. Você também pode usar o monitor serial da IDE do Arduino para verificar se o seu código está funcionando conforme previsto.
Josecarlosbueno Enviado: 2018-02-15 17:39:21
Boa tarde, tem como colocar no lugar do LCD, um mine caixa de som para apitar quando tiver obstaculo?