Sensor de estacionamento com Arduino e sensor HC-SR04
No post de hoje vamos utilizar o Arduino juntamente com o sensor ultrasônico HC-SR04 para montar um sensor de estacionamento (ou sensor de ré), que emite um “bip” conforme o sensor se aproxima de um obstáculo. Quanto mais próximo o obstáculo, maior a frequência do bip.
Como (geralmente) uma imagem vale mais do que mil palavras, vamos dar uma olhada no sensor instalado em um trator, devidamente “emprestado” do sobrinho 🙂
Bacana, né? Vamos ver como montar isso.
Circuito sensor de estacionamento com Arduino
O circuito é composto apenas pelo Arduino, um sensor ultrasônico HC-SR04 e um buzzer, com uma resistência de 330 ohms para limitar a corrente.
No programa, utilizei a biblioteca NEWTONE, que pode ser baixada nesse link e que eu já abordei nesse post.
O motivo de usar essa biblioteca é que a função TONE, normalmente usada para produzir sons com Arduino, apresenta conflito com a biblioteca Ultrasonic, também utilizada nesse projeto.
O som do bip pode ser alterado conforme a necessidade, alterando o valor das variáveis frequencia e tempo, setadas no começo do programa.
O pino Trigger do sensor vai ligado ao pino 13 do Arduino, e o pino Echo do sensor vai ligado ao pino 10 do Arduino. A alimentação do sensor é de 5 volts. O buzzer vai na porta 2 do Arduino.
A variável cmMsec armazena o valor da distância entre o sensor e o obstáculo. Uma série de comandos IF verificam o valor de cmMsec e atualizam a variável atraso, que é utilizada no final do programa para determinar a frequência de acionamento do bip.
Os valores lidos pelo sensor também podem ser acompanhados pelo serial monitor e, com algumas alterações no programa, exibidos em um display.
// Programa : Sensor de estacionamento com HC-SR04 // Autor : Arduino e Cia #include <Ultrasonic.h> //Carrega a biblioteca Ultrasonic #include <NewTone.h> //Carrega a biblioteca Newtone //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); void setup() { pinMode(Pinofalante,OUTPUT); //Pino do buzzer Serial.begin(9600); //Inicializa a serial } 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; } else if (cmMsec >50 && cmMsec<80) { atraso = 1500; } else if (cmMsec >30 && cmMsec<50) { atraso = 1200; } else if (cmMsec > 10 && cmMsec < 30) { atraso = 700; } else if (cmMsec < 10) { atraso = 300; } //Apresenta os dados, em centimetros, na Serial Serial.print("Cent: "); Serial.print(cmMsec); Serial.print(" atraso : "); Serial.println(atraso); //Emite o bip NewTone(Pinofalante, frequencia, tempo); delay(atraso); }
Podem ser adicionados outros comandos IF para melhorar a “precisão” do sensor, ou até mesmo ser utilizada outra solução para calcular o valor do delay. Uma sugestão seria a utilização da função map, por exemplo.
Por enquanto é isso. Já posso devolver o trator para o dono. 🙂
Olá! Parabéns pelo post!
Por favor, poderia me esclarecer uma dúvida? Quando tento carregar o programa no Arduino, a IDE apresenta a seguinte mensagem de erro:
"class Ultrasonic has no member named timinng"
E aponta para a linha onde está o comando:
long microsec = ultrasonic.timing();
O que poderia estar causando este erro?
Desde já agradeço!
Oi Leandro,
Por favor veja se não tem nada errado no programa, a mensagem que ele está apresentando é realmente essa, como "timinng" escrito errado ?
Abraço.
Ah… Na verdade na mensagem de erro aparece escrito timing com um 'n' só…
Será que é um erro nas bibliotecas??? A biblioteca Ultrasonic que baixei neste site está na extensão .tar. Será que não pode ser isso???
Oi Leandro,
Você descompactou o arquivo .tar, correto ?
Pode ser uma biblioteca diferente da que foi utilizada no post, existem várias bibliotecas Ultrasonic, e as funções podem ter sido escritas de forma diferente.
A que estou usando eu baixei desse link :
http://freecode.com/urls/f05d8c56e9a2b61313a757a6cfb3bdf5
Veja que depois de descompactada, essa biblioteca gera a pasta HCSR04Ultrasonic. Renomeie a pasta apenas para "Ultrasonic".
Abraço !
Olá!
Realmente o problema estava sendo causado por incompatibilidade da biblioteca. É que a pasta desse link está compactada duas vezes. E uma compactação foi feita na extensão .gz e outra na .tar.
Agora deu certo! Muito obrigado!
Legal Leandro !
Que bom que deu certo. Se precisar de algo, estamos aí.
Abraço !
Obrigado!!!
Abraço!!!
parabens pelo post.
gostaria de saber como faço quando tenho duas condiçoes .
ex distancia menor que 50 cm e tempo que o objeto permaneceu na frente do sensor superior a 3 s.
obrigado
Boa tarde Camila,
Você pode colocar um contador de tempo dentro do IF, e se atingir o tempo que você precisa ele toma alguma ação.
Abraços.
Olá Arduíno e Cia,
Estou precisando de ajuda. Como farei para que o buzzer somente funcione quando o ultrasônico identificar algum obstaculo á frente? Caso contrario o buzzer permaneça desligado.
Grato.
Bom dia Willian,
Faça um IF simples, que testa quando o valor de cmMsec for maior do que zero, ele aciona o buzzer. Exemplo :
if (cmMsec > 0)
{
NewTone(Pinofalante, frequencia, tempo);
}
else
{
noNewTone();
}
Abraço !
gostaria que so acione o buzzer quando identificar um objeto, vc deu o exemplo mas nao consegui implementar no codigo, como faço?
Oi Carlos,
Tente o circuito do programa desse artigo, implementando o IF que eu citei acima :
http://www.arduinoecia.com.br/2013/05/medidor-de-distancia-com-o-sensor.html
Se não conseguir, volte aqui e poste o código que eu te ajudo, ok ?
Abraço !
Como faço para quando chegar muito perto do sensor ultrassonico ele desliga o buzzer? e tambem só acionar o buzzer quando identificar algum objeto?
Boa noite,
Use para isso os comandos IF. Por exemplo. Se CM > 0 significa que ele detectou algum objeto, e assim vc pode acionar alguma porta do Arduino.Para parar o buzzer, use o comando noNewTone().
Abraço !
pode me ajudar com esse codigo
// Programa : Sensor de estacionamento com HC-SR04
// Autor : Arduino e Cia
float sinVal;
int toneVal;
#include //Carrega a biblioteca Ultrasonic
#include //Carrega a biblioteca Newtone
//Dados do buzzer
#define tempo 500
int frequencia = 40000;
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);
void setup()
{
pinMode(Pinofalante,OUTPUT); //Pino do buzzer
Serial.begin(9600); //Inicializa a serial
}
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
//Apresenta os dados, em centimetros, na Serial
Serial.print("Cent: ");
Serial.print(cmMsec);
Serial.print(" atraso : ");
Serial.println(atraso);
//Emite o bip
if (cmMsec < 180)
{
for (int x=0; x<180; x++) {
// converte graus para radianos, e depois obtém o valor do seno
sinVal = (sin(x*(3.1416/180)));
// gera uma frequência a partir do valor do seno
toneVal = 2000+(int(sinVal*1000));
tone(Pinofalante, toneVal);
delay(2);
}
}
else
{
noNewTone();
}
}
sempre depois que ele toca o alarme o noNewtone nao o desliga fica tocando um bipe continuo
Boa noite,
Você está misturando o tone com o NewTone, tente alterar essa linha :
tone(Pinofalante, toneVal);
para
NewTone(Pinofalante, toneVal);
Abraço !
muito obrigado deu certo
Legal !!! Abraço.
nao tenho um resistor de 330ohms posso utilizar um de 300?
Pode sim, sem problemas. Abraço !
No meu estão aparecendo os seguintes erros:
sketch_apr03a.cpp: In function ‘void loop()’:
sketch_apr03a.cpp:36:30: error: ‘class Ultrasonic’ has no member named ‘timing’
sketch_apr03a.cpp:39:23: error: ‘class Ultrasonic’ has no member named ‘convert’
sketch_apr03a.cpp:39:53: error: expected unqualified-id before numeric constant
O que pode ser isso? Fiz tudo de acordo com o código (Copiada e colada básica) Instalei as bibliotecas, e mesmo assim não consigo achar o erro. :/
Boa tarde,
Verifiquei e aqui compilou normalmente… Você tem outra versão de IDE para testar ? Pode ser algum conflito com outra biblioteca.
Abraço.
Boa noite,
Qual o modelo do buzzer que você utilizou?
Boa noite,
Um desses comuns de computador. Peguei de uma CPU velha. 🙂
Abraço !
Como posso criar um forma de desligar e ligar o sensor para que ele não fique apitando quando um carro parar atras de mim no transito?
Boa tarde Diego,
Você pode fazer com que o sensor funcione apenas quando o carro estiver em movimento, por exemplo, pois a princípio é um sensor de estacionamento, e não de proximidade, assim você pode usar um outro sensor para ver se o carro está se movimentando ou não.
Acho que essa é a melhor maneira. Abraço !
Eh bem simples, coloque um resistor ligado a lampada de Ré no positivo de 100k e quando você acionar a macha ré funcionará perfeitamente, mas não esqueça de declarar a variavel para se ter a resposta no arduino.
Crie um Rotina de ativação do arduino, e,coloque um resitor de 100 k na lampada de macha ré.
Ola amigo estou tendo esse erro aqui
sketch_may25a:20: error: 'Ultrasonic' does not name a type
sketch_may25a.ino: In function 'void loop()':
sketch_may25a:33: error: 'ultrasonic' was not declared in this scope
sketch_may25a:36: error: 'Ultrasonic' has not been declared
sketch_may25a:66: error: 'NewTone' was not declared in this scope
declaro a bibliotecas as variaveis ate fiz o download nos links passado mas o erros continuam tem como me ajudar ?
Ola
Montei um Drone e gostaria de coloco sensor ultrasonico e controlar ele de longe, para quando ele estiver proximo de bater ele emite um son no buzzer que estara no controle e não nele.
Tem como me ajudar? eu ja tentei varias coisas só que não estou conseguindo fazer funcionar.
Agradecido
Boa noite,
Interessante essa idéia. Como você está pensando em mandar os dados do drone para o controle ?
Abraço !
Comprei um drone pronto para aprender melhor pois não sabia nada.
Entao comprei dois nrf24l01 e um arduino pro mini e consigo ligar led, motor e brincar de longe com dois nrf e dois arduinos, mas oque pretendo mesmo até mês que vem para apresentar o inicio do projeto, não estou conseguindo, que é colocar os sensores ultrasônicos HC-SR04 no drone e quando o drone estiver para bater ele envie um sinal via nrf para o outro nrf com arduino ligar o buzzer igual o programa de voces só que via nrf e não estou conseguindo.
Tem como me ajudar?
Amigo, não estou conseguindo fazer o seguinte, quero que objetos acima de 1 metro o buzzer fique desligado, começe apitar somente abaixo de 100cm. vi um exemple que deu num comentário mas não consegui implementar. pode me aajudar ?
obrigado
Boa noite,
Faça um loop com apenas um IF, mais ou menos assim:
if (cmMsec < 100)
{
NewTone(Pinofalante, frequencia, tempo);
}
Abraço!
Boa noite, qual o problema do meu código ? eu quero que o bip seja soado somente quando tiver algum obstáculo perto do sensor, mas ele está soando sem parar. Poderia me ajudar ? Desde já obrigado!
*Tentei testar se cmMsec for igual a zero ele desliga o sensor, mas não funcionou
#include //Carrega a biblioteca Ultrasonic
#include //Carrega a biblioteca Newtone
//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);
void setup()
{
pinMode(Pinofalante,OUTPUT); //Pino do buzzer
Serial.begin(9600); //Inicializa a serial
}
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);
if (cmMsec == 0)
{
noNewTone();
}
//Ajusta o atraso de acordo com a distancia
if (cmMsec > 80)
{
atraso = 1000;
} else if (cmMsec >50 && cmMsec<80)
{
atraso = 1500;
}
else if (cmMsec >30 && cmMsec<50)
{
atraso = 1200;
}
else if (cmMsec > 10 && cmMsec < 30)
{
atraso = 700;
}
else if (cmMsec < 10)
{
atraso = 300;
}
//Apresenta os dados, em centimetros, na Serial
Serial.print("Cent: ");
Serial.print(cmMsec);
Serial.print(" atraso : ");
Serial.println(atraso);
//Emite o bip
NewTone(Pinofalante, frequencia, tempo);
delay(atraso);
}
Boa tarde,
Utilize apenas um IF no código, ficaria mais ou menos assim:
if (cmMsec > 0 && cmMsec < 30) /distancia maior do que 0 e menor do que 30cm
{
NewTone(Pinofalante, frequencia, tempo);
}
Abraço !
scope
sketch_oct02b:39: error: expected ';' before 'maior'
invalid suffix "cm" on integer constant
Parabens amigo me ajudou muito consegui quase terminar meu tcc estou com 2 sensores como seria a programação?desde ja agradeço obs:ja tentei editar assim
#define PINO_TRIGGER 8
#define PINO_TRIGGER 13
#define PINO_ECHO 9
#define PINO_ECHO 10
Mas so reconheçe 1 sensor desde ja agradeço abraçs
Boa Tarde, preciso de uma ajuda, eu copiei o seu código só que ta dando um erro:
C:UsersBrennoDownloadsarduino-0022arduino-0022librariesNewToneNewTone.cpp: In function 'void NewTone(uint8_t, long unsigned int, long unsigned int)':
C:UsersBrennoDownloadsarduino-0022arduino-0022librariesNewToneNewTone.cpp:25: error: 'digitalPinToBitMask' was not declared in this scope
C:UsersBrennoDownloadsarduino-0022arduino-0022librariesNewToneNewTone.cpp:26: error: 'digitalPinToPort' was not declared in this scope
C:UsersBrennoDownloadsarduino-0022arduino-0022librariesNewToneNewTone.cpp:26: error: 'portOutputRegister' was not declared in this scope
C:UsersBrennoDownloadsarduino-0022arduino-0022librariesNewToneNewTone.cpp:27: error: 'portModeRegister' was not declared in this scope
o que faço?
Ola, estou desenvolvendo um detector de cores para deficientes visuais, entao precisa ser com modulo de voz, estou usando o modulo IS1820 e preciso que ele fale determinada cor quando detectada pelo codigo rgb, estou usando o sensor ColorPal2838, ja programei o sensor, porem nao sei como fazer o modulo reproduzir o que eu programar no arduino, Grande abrac!!!
Bom dia,
O IS1820 só vai reproduzir o que está gravado na memória, sem que você possa escolher qual parte da gravação vc quer.
Acho que o mais indicado seria o WTV-020, gravando o arquivo de som de cada cor em um arquivo separado:
http://www.arduinoecia.com.br/2015/06/modulo-mp3-wtv020-sd-arduino.html
Abraço!
Uma duvida,
Como poderia colocar um botão liga-desliga ?
Boa tarde fiz toda a programação so que quando vou carregar ele mostra isso e n carrega na placa e aparece isso aqui.
''O sketch usa 5.698 bytes (17%) de espaço de armazenamento para programas. O máximo são 32.256 bytes.''
Variáveis globais usam 253 bytes (12%) de memória dinâmica, deixando 1.795 bytes para variáveis locais. O máximo são 2.048 bytes.
o que seria isso?
Bom dia Tales,
São apenas informações sobre a quantidade de memória e recursos que o programa ocupa.
A IDE apresenta alguma mensagem de erro ?
Abraço!
Boa Tarde. Parabéns pelo post…
Gostaria de dar uma finalidade pratica para o projeto, adaptando o sensor aa luz de ré do carro, ligando assim somente quando engatasse a marcha aa ré. Minha duvida é se o hc-sr04, pode ficar com os dois sensores expostos as intempéries como chuva e temperatura do asfalto, visto que se eu colocar o sensor dentro de uma caixa hermetica ele não vai funcionar…
Boa tarde Majela,
Realmente acho que não aguenta, apesar que nunca testei com vidro/acrilico, já que ele tem uma distância mínima de detecção (3 cm, se não me engano). Nesse caso, não sei o que aconteceria se você colocasse um vidro dentro dessa distância mínima. Vou testar.
Existem outros sensores ultrassonicos que eu creio que sejam mais adequados, mas eu não testei com Arduino:
https://www.sick.com/br/pt/sensores-de-distancia/sensores-de-ultrassom/c/g185671
Abraço!
arduino e cia, Tem como disponibilizar o link da biblioteca #include do seu projeto, pois aqui eu to usando esta dando erro e não reconhece algumas funções do código.
desde já agradeço e parabéns pelo projeto.
arduino e Cia, tem como esta disponibilizando o link da biblioteca #include que você esta utilizando no projeto, por que o que eu estou usando esta dando erro e não reconhece algumas funções do código.
desde ja agradeço.
Oi Ronielson,
É a biblioteca newtone ? Já atualizei o link da biblioteca no post.
Abraço!
Boa tarde… o link q vc deixou da sua bib do Sensor Ultra sonico, está fora.. e as que eu tenho nenhuma é compativel, provavelmente a variável é diferente 😛
poderia disponibilizar por favor? grato desde já,
att Will Gasperi
Bom dia,
Tente este link, por favor: http://freecode.com/projects/hc-sr04-ultrasonic-arduino-library
Abraço!
Boa tarde!
Saberia me dizer como utilizar este sensor para a seguinte situação: o meu obstáculo está atrás de uma parede, portanto não quero captar o primeiro eco (da parede) mas sim o segundo, do objeto que está atrás dela.
Obrigado
Boa noite,
Hummm.. vc quer um sinal que "atravesse" parede ?
Bom dia!
Isso, justamente como um ultrassom, utilizado para ultrassonografia. Acredito que o som emitido por este sensor já atravessa a parede e este mesmo som enviado também retorna ao sensor, porém não sei como captar este som … que vem mais fraco … demora um pouco mais… dependendo de vários fatores, como a espessura e material da parede e do obstáculo que está do outro lado.
Sabe se tem como captar este som mais fraco e mais demorado que o sensor recebe de eco?
Obrigado
Davi
Oi Davi,
Eu já vi sensores ultrassonicos que podem "enxergar" através da parede, mas creio que com o HC-SR04, especificamente, não seja possível.
Vamos ver se algum outro leitor do blog pode te ajudar com esse assunto. 🙂
Abraço!
Adilson
Sim Adilson, vamos aguardar. Você lembra que sensores eram estes?
Obrigado
Davi
Não lembro direito, mas era um sensor industrial, e bem caro, inclusive.
Vou ver se acho a referência aqui em algum canto.
Abraço!
Eu gostaria de saber como faço pra inicialmente, em:
if (cmMsec > 80)
{
atraso = 2000;
ao invés de um atraso de 2000 eu silenciasse o buzer, para q ele começasse a bipar apenas a partir do intervalo (cmMsec >50 && cmMsec<80)
Ola. Como seria o programa se eu colocasse o sensor barométrico BMP 180 no lugar do ultrasônico.
abaço
Boa tarde, como faço para baixa a biblioteca do ultrasonic seu link acima não esta abrindo a página ?
Olá, vocês poderiam postar esta biblioteca Ultrasonic.h novamente. o Link de um post aqui citado esta quebrado.
Ola, vc poderia me informar porque esta dando esse erro?
desde já, muito obrigado!
Abraço.
sensor_estacionamento.ino: In function ‘void loop()’:
sensor_estacionamento.ino:40:28: error: ‘class Ultrasonic’ has no member named ‘timing’
sensor_estacionamento.ino:43:21: error: ‘class Ultrasonic’ has no member named ‘convert’
In file included from sensor_estacionamento.ino:8:0:
/home/claudio/sketchbook/libraries/Ultrasonic/Ultrasonic.h:16:12: error: expected unqualified-id before numeric constant
#define CM 1
^
sensor_estacionamento.ino:43:51: note: in expansion of macro ‘CM’
Bom dia! Preciso utilizar esse projeto mas substituindo o som do buzzer por uma gravação de voz, podem me auxiliar?
Dar pra fazer esse circuito sem o resistor?
Boa tarde
Também estou com problemas com a biblioteca Ultrasonic. Aparece o mesmo erro descrito acima.
"sensor_estacionamento.ino:40:28: error: ‘class Ultrasonic’ has no member named ‘timing’"
Estou usando o seu projeto em meu tcc, mas o código fica dando erro no void setup antes do serialbegin. O que pode ser ?
Oi Tom,
Passe a mensagem de erro pra gente tentar descobrir o que é.
Abraço!
Adilson
Boa noite!
Parabéns pelo trabalho!!!
A biblioteca Ultrasonic.h não está mais disponível no link.
Você teria outro link?
Estou procurando mas ainda sem sucesso.
Abs!
Boa noite, estou implementando um projeto que ao invés de um buzzer eu utilizo um vibracall, você poderia me ajudar nessa adaptação do código? Não sei programar nesta linguagem, estou um pouco perdido. Desde já, agradeço.
Boa TARDE pode me dar os links para baixar as bibliotecas?
Oi Ricardo,
Link das bibliotecas no próprio post.
Abraço!
Adilson
unsigned int Ultrasonic::timing()' is private
Dá me este erro .. como posso resolver?
Oi André,
Isso me parece ser erro de biblioteca… vc usou a mesma que eu usei no post?
Abraço!
Adilson
olá, como faço em relação aos códigos para adicionar o motor micro vibrador para disparar juntamente com o buzzer, ou seja, o sensor HC-SR04 capita o obstáculo e destapara o alerta sonoro junto com a vibração ? Poderia me ajudar por gentileza.