Ajuda sobre sensor barometrico BMP180, como calcular a velocidade vertical.

Ol

Pessoal, estou precisando de uma ajuda para um projeto com um sensor barométrico BMP 180, onde, com a variação da altitude ,calcule a velocidade vertical  , e conforme a velocidade ,acione volume diferente do  buzzer. Fiz um teste no cod. em anexo onde o sensor está acionando o buzzer conforme a condição .

Grato.

Exibições: 1124

Responder esta

Respostas a este tópico

#include <SFE_BMP180.h>
  #include <Wire.h>
 
 
   SFE_BMP180 bmp180;
   
  double Po; ; //presao do punto inicial para h=0;102218
  char status;
  double T,P,A;
   double PresionNivelMar=1013.25; // pressao do nivel do mar em  mbar
    double cond ; // variaçao de 0.5 para  1
  float altitude;
 
   
 
   void setup()
{
  Serial.begin(9600);
  pinMode(11,OUTPUT);
 
 
  if (bmp180.begin()){
    Serial.println("BMP180 iniciado correctamenten");
    status=bmp180.startTemperature();//inicio da leitura da temperatura
   if (status!=0)
   {
    delay(status);   //pausa para que fianlize a leitura
    status=bmp180.getTemperature(T) ;//obtendo a temperatura
    if(status!=0)
    {
      status=bmp180.startPressure(3) ;//inicio da leitura de pressao
      if(status!=0)
      {
        delay(status); //pausapara que finalize a leitura
        status=bmp180.getPressure(P,T); //OBTENDO A pressao
        if(status!=0)
        {
          Po=P;
          Serial.println("ponto de referencia estabelecido: h=0");
        }
      }
    }
   }
  }
  else
  {
    Serial.println("Error al iniciar el BMP180");
    while(1); // bucle infinito
   
}
  }


void loop()
{
 
  char status;
  double T,P,A;
  cond= A;
 

  status = bmp180.startTemperature();//Inicio de lectura de temperatura
  if (status != 0)
  {   
    delay(status); //Pausa para que finalice la lectura
    status = bmp180.getTemperature(T); //Obtener la temperatura
    if (status != 0)
    {
      status = bmp180.startPressure(3);//Inicio lectura de presión
      if (status!=0)
     
      {        
        delay(status);//Pausa para que finalice la lectura        
        status = bmp180.getPressure(P,T);//Obtenemos la presión        if (status ! = 0)
      
      
        {                  
          Serial.print("Temperatura: ");
          Serial.print(T);
          Serial.print(" *C , ");
          Serial.print("Presion: ");
          Serial.print(P);
          Serial.print(" mb , ");     
          //-------Calculamos la altitud--------
          A= bmp180.altitude(P,PresionNivelMar);
          Serial.print("Altitud: ");
          Serial.print(A);
          Serial.println(" m s.n.m.");  
           
          
      
            status = bmp180.getPressure(P,T);//Obtenemos la presión
        if (status != 0)
        {                    
          //-------Calculamos la altura con respecto al punto de referencia--------
          A= bmp180.altitude(P,Po);
          Serial.print("h=");
          Serial.print(A);
          Serial.println(" metros");
  }
          }
          
        }      
      }
         
  }
 
 
       if ( A >=(cond, 0.5)){
  // CODIGO DO SOM SUBINDO AQUI
    tone(11,500,200);
  delay(200);
 
  }
 
     else if (A<=(cond, A,0.2)){
  // CODIGO DO SOM DESCENDO AQUI

  tone (11,1200,200); // Toca o buzzer em tonalidade de dó, em 262Hz
    delay (200); // Deixa o buzzer tocando em 262Hz, e o led ativado por 200 milésimos de segundos
   
 
    }
  delay(500);
 
 
  }

Amigo, como vc irá lidar com o fato de que esse sensor te dá resultados diferentes de altitude, mesmo com esse sensor parado (fixo)?

Ele calcula a altitude baseando-se na pressão atmosférica, e a pressão atmosférica varia conforme inúmeros fatores.

Em que tipo de projeto vc irá usar esse cálculo de velocidade vertical?

Obrigado pela atenção. O projeto é um Variometro , onde mede a velocidade vertical. A pressão Barométrica varia conforme a altitude, a ideia, é pegar o valor da ultima leitura da altitude, e a nova leitura , a diferença, em millis, aciona o buzzer, em ascendente , quanto maior variação, menor o intervalo do beep do buzzer, e com o som mais agudo,  em descendente aciona o buzzer com o som mais grave.O exemplo que fiz, não está medindo a velocidade da variação, e sim se leitura foi dentro do especificado .

É assim: uma coisa é um sensor medir a altitude primeiro e depois tentar obter por cálculo a pressão atmosférica. Outra coisa é o sensor medir primeiro a pressão atmosférica pra depois obter por cálculo a altitude.

Tenho esse sensor BMP180 funcionando há mais de 2 anos, fixo numa parede da minha cozinha e mede de minuto em minuto a pressão atmosférica aqui da minha casa. Medi agora, deu 960.35 hPa, o que equivale a 468,39m de altitude. Há um minuto atrás, mediu 960.52 hPa, o que equivale a 467,17m de altitude.

Em 1 minuto, mesmo com o sensor exatamente no mesmo local, sem estar em movimento, variou 0,17 hPa ou 1,22m. 

Percebe o que estou querendo dizer? Esse sensor é super sensível, vai te resultar em leituras de altitude absurdamente oscilantes.

Mas se vc achar que pode lidar com tal fato, o cálculo de velocidade não tem segredo, isso é coisa de ginásio, calcula-se o deslocamento e divide-se pelo tempo gasto.

Minha sugestão é usar uma média aritmética dos valores de pressão. Ou outro tipo de média. 

Devido às pequenas variações que ocorrem naturalmente. 

https://pt.wikipedia.org/wiki/M%C3%A9dia

vou exemplificar uma boa forma de voce aplicar a funçao no seu codigo... pra nao dizer que dei algo pronto rsrs...

if ( V_sensor_atual != V_sensor_antes){

int V_buzzer = V_sensor_atual - V_sensor_antes;

//se os valores forem muito baixos implicando no tom do alarme muito curto coloque uma expressão aqui

V_buzzer= max(min(V_buzzer,100),200); //ajuste esses números conforme a variação do sensor nesse caso estou limitando de 100 a 200millis

Tone (11, 1200,V_buzzer);

}

V_sensor_antes=V_sensor_atual;

Bom primeiramente deixo claro que não conheço a variação do sensor por isso a necessidade de ajustar os números, caso seja muito baixa vc pode fazer uma expressão antes do V_buzzer, para multiplicar o valor e consequentemente o tempo dos beeps e caso esse valor que eu estipulei(100~200) seja muito pouco vc ajusta a sua necessidade, espero ter ajudado!

Muito obrigado pela atenção.

Vou testar.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço