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.
Tags:
#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.
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por