Problemas com programação: float e sensor ultrasônico

Oi, pessoal!

Estou fazendo medidas de distância com um sensor ultrasônico, mas não estou conseguindo valores com números decimais (aparece, por exemplo, 26,00, mas não 26,45). Não consigo saber onde estou errando. Abaixo segue o código utilizado:

const int trigPin = 12;
const int echoPin = 13;
float distancia=0;

void setup(){
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}

void loop(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned long duracao = pulseIn(echoPin, HIGH);
float distancia = duracao / 58;
Serial.print("Distancia: ");
Serial.println(distancia);

delay(1000);
}

Alguém sabe como me ajudar?

Desde já, agradeço!

Exibições: 1796

Responder esta

Respostas a este tópico

 Olá Tamara.

  Vou indicar alguns links que explicam como simular e programar o Sensor Ultrassônico com o Arduino.

Você poderia  testar colocando um dos programas de exemplo (que tem lá no blog mesmo) no seu Arduino e usando o seu sensor, e ver se ele está respondendo da mesma forma que agora.

  [Teoria e Exemplo]

  http://blogembarcado.blogspot.com.br/2012/12/ultrasonic-sensor-simu...

  [Biblioteca + Exemplos]

  http://blogembarcado.blogspot.com.br/2013/06/sensor-ultrassonico-v2...

  Boa sorte no projeto. ^^

 Att.

Ola Tamara!

Não tenho certeza.. mas acho que so faltou converter o valor da distancia pra float

float distancia = (float) duracao / 58;

Espero q isso ajude!

Realmente, não sei se o ultrassom tem essa precisão toda de dar resultados em centímetros, milímetros e décimos de milímetros. Mas se quiser tentar, declare duracao e distancia como float (ou double). E não precisa (ou não pode) declarar distancia 2 vezes.

Boa sorte

Tamara, a precisão que esse sensor consegue é de centímetros.

Prezados Daniel, Diego, Rodrigo e Mauro, um amigo me ajudou com o tal código. Agora estou usando ele assim:

  float duracao, distancia;
  digitalWrite(trigPin, LOW);                    //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
  delayMicroseconds(2);                         // delay de 2 microssegundos
  digitalWrite(trigPin, HIGH);                   //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
  delayMicroseconds(10);                      //delay de 10 microssegundos
  digitalWrite(trigPin, LOW);                   //seta o pino 12 com pulso baixo novamente
  duracao = pulseIn(echoPin, HIGH);      //pulseIn lê o tempo entre a chamada e o pino entrar em high
                                                          //Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado
                                                          //porque é o tempo de ida e volta do ultrassom
  distancia = (duracao)/ 58;
Está funcionando, embora oscile bastante. Até tentei utilizá-lo fazendo a média de 10 medidas, mas acabou piorando a situação. É muito complicado quando a água está evaporando, o sensor acaba ficando meio perdido.
Agradeço a ajuda de vocês!
Att

Tamara, mas esse é o jeito mesmo.

Fazer uma média de 10 medidas piorou? Engraçado, não era para acontecer isso. O que exatamente aconteceu? Vc pode tentar outros filtros, por exemplo descartando o maior e o menor valor antes de tirar a média etc.

Piorou, Mauro, infelizmente. Ele fica bem pouco sensível. Se eu colocar obstáculos como um pedaço de madeira, ele até funciona direito, mas com a superfície da água não dá certo. Tens alguma sugestão?

Abraço!

Tamara,

O que vc chama de pouco sensível? Ao fazer a média, ele fica menos sujeito a flutuações.

Tem jeito de vc colocar umas amostras aqui, filmar e colocar no youtube para a gente ver?

Esse tipo de sensor é muito usado para indicar o nível de reservatórios, então deve funcionar.

Esse algoritmo do Rodrigo ai em baixo é um exemplo do que é a média.

[],

Mauro

Oi, Mauro. Como já estou fazendo as medidas hoje, não tenho como fazer o vídeo. Mas vou ver o que acontece e, qualquer coisa, posto no youtube sim.

Quanto à sensibilidade, sim, ele fica bem menos sujeito a flutuações, mas justamente por isso, a mínima quantidade de água que evapora ele não percebe. Fui clara? Se quiser mais informações, fique à vontade.

Obrigada pela ajuda!

Abraço.

Sua média tá mais ou menos assim?:

 float duracao, distancia;
for(int i = 0; i<10;i++){
  digitalWrite(trigPin, LOW);                   
  delayMicroseconds(2);                         
  digitalWrite(trigPin, HIGH);                   
  delayMicroseconds(10);                      
  digitalWrite(trigPin, LOW);                   
  duracao = pulseIn(echoPin, HIGH);     
  distancia += (duracao)/ 58;
}
Serial.println(distancia/10);
*as variaveis devem ser declaradas fora do escopo do void loop
Senão, fica a sugestão, porque a média é uma solução eficiente para ter uma boa precisão.
Caso esteja oscilando muito, use médias de 3 a 5, substituindo os "10" no código.

Oi, Rodrigo! Sim, a que eu estava usando era assim mesmo. Vou ainda fazer mais testes, aí posto aqui.

Obrigada por enquanto!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço