[RESOLVIDO] Executar captura de um dado I2C quando pressionados 2 botões simultaneamente (altímetro digital)

Boa tarde, pessoal!

Esta é minha primeira participação aqui depois de um tempo afastado do mundo DIY....resolvi fazer um altímetro digital.

A ideia é utilizando um TTGO (ESP32) com um BMP280 eu consiga apresentar a altitude relativa ao solo.

O problema é que não estou sabendo como adquirir o dado de pressão local e inserir na variavel bmp.readAltitude(x) onde o x é o valor referencia de pressão a ser descontado. outro ponto é que para essa aquisição acontecer, gostaria que os dois botoes do TTGO (GPIO 0 e 35) fossem pressionados simultaneamente por 5 segundos.

No codigo atual eu usei o serial.print para checar resultado do delay do botão, porém segue um loop com o envio de "apertou" pela serial a cada 10 segundos independentemente do botão estar pressionado ou não.

alguem consegue me ajudar?

Segue .ino anexo

assim como descrição do circuito e no link abaixo também um video mostrando o funcionamento do altimetro com a função tft.print(bmp.readAltitude(970.9872)); calibrado pra pressão da minha casa

https://youtu.be/cUavhl_21UM

obrigado desde ja!

Exibições: 846

Anexos

Responder esta

Respostas a este tópico

Bom dia jose, o prototipo ja está funcionando sem problemas. Ainda é preciso fazer o ajuste manual do zero pressorico, por isso peço a ajuda.
Brigado pela dica de mesma forma!
Complementando apenas....
Eu consigo o dado bmp.readAltitude(x) e consigo fazer com que ele seja exibito no display.
O que nao sei fazer é como descrever para que ele pegue o valor de pressao local e assuma como zero, entende?

Olá
Obrigado por atender a recomendação do TM e remover o código do corpo do tópico.


Minha primeira recomendação;


Ajuste o alinhamento do seu código( Identição).


http://wiki.inf.ufpr.br/marcos/doku.php?id=identacao_ou_alinhamento....

Usando a IDE do arduino é muito fácil fazer isto.
Basta segurar Crtl e apertar a letra T, e a IDE faz a identição por você.


Qual a vantagem de usar a identição com Ctrl e T?
Além de ficar um código mais legível e organizado, se você esquecer de abrir ou fechar{ } ( ) , ou ainda alguns outros erros de digitação, o código fica completamente desalinhado e você pode identificar esta falha.

Minha segunda e nova recomendação;

Sempre que usar bibliotecas baixadas da web, informe no comentário da linha da biblioteca o link de onde baixou e a versão da biblioteca.
A razão disto é que existem na web várias bibliotecas que tem nomes iguais, varias versões e nem sempre com funcionamento iguais. 

Assim para que possamos ajudar e as vezes rodar seu código para testar, possamos baixar as referidas bibliotecas.

Ex:
Esta eu encontrei:
#include <Adafruit_BMP280.h>       // https://github.com/adafruit/Adafruit_BMP280_Library   version=2.6.2

Esta eu não encontrei:
#include "Final_Frontier_28.h" //

Sobre seu código.
Concordo com o TM no item 1.
Quando declarou nas linhas 24 e 25, ou 55 e 56, você fez uma declaração de constante local.
Portanto só serão válidas dentro das funções que foram declaradas.
e podem variar o conteúdo de uma função para a outra.
Como são pinos e provavelmente você quer usar no seu código todo, devem ser delatadas fora de qualquer função e serão consideradas declarações globais.

Concordo com o TM no item 3. Muito importante saber se o I2C funciona corretamente e qual o endereço, antes de testar um código feito por nós.

Não só concordo mas quase que exige com o que o TM sugere no item 4.  Esquema está à sua vista, e não na nossa.

Concordo com o TM no item 5.

Depois de tudo dito, vou esperar o link das bibliotecas 

#include "Final_Frontier_28.h"
#include "Free_Fonts.h"

para montar e testar seu projeto.

RV mineirin

Boa tarde, tudo bem?

Em relação a fonte final_frontier eu baixei neste site 

https://tomeko.net/online_tools/file_to_hex.php?lang=en

Já a free_fonts faz parte da Adafruit_GFX_Library

https://github.com/adafruit/Adafruit-GFX-Library

Muito obrigado pela ajuda, pessoal!

Adicionei no post inicial também um video mostrando o retorno que consigo pela tela ao subir um elevador.

Fiz algumas modificações já considerando o que me foi explicado e dessa forma consegui fazer com que o altímetro ajustasse o zero cada vez que é resetado; mas a função de apertar os dois por 5 segundos para resetar o zero novamente ainda não esta funcionando =/

coloca:

bmp.readAltitude(928.9478); e me diz o resultado.

Edit --------

com relação aos 5 segundos, será trabalhando com millis. É bem simples. Várias condições podem ser estabelecidas neste ponto, depende unicamente das características exatas que você precisa.

Com esse valor esse fica oscilando entre 1 e -1m

Certo.

Veja, no estudo da altimetria na aviação, estudamos sobre 4 pontos de referência para "altura/altitude". QFE, QNH, QNE e QFF, sendo que todas, por convenção, são medidas em "hPa" (hectopascal), que por sua vez é uma unidade de pressão e possui uma conversão APROXIMADA de 1hPa = 30 pés = 9 metros, entretanto, apenas 2 delas são interessantes para você. QNH e QFE. (Evidentemente, se você quiser fazer um calculo baseado nestes itens, você precisará ver o correto - não aproximado).

Resumo rápido:

QNH = Pressão ao nível médio do mar. Possui valor universal de 1013,2 hpa (para entendimento).

QFE = Pressão medida na estação, definindo altitude igual a 0fts quando em solo.

Agora veja, as funções do seu sensor: 

bmp.readTemperature(): 

- Identifica a temperatura atual

bmp.readPressure(): 

- Identifica o PA (altitude pressão) no local da estação

- Veja que PA e hPa são parecidos, mas não são iguais. 1PA = 0,01hPa.

- Da mesma forma, sabemos que o QFE é a pressão, em hPa, medida na estação (pegou o feeling?)

- Logo... poderiamos dizer que:

float QFE = bmp.readPressure() / 100;

bmp.readAltitude(var): 

- Identifica a distancia para um determinado ajuste de hPa. Por padrão (void) é ajustado para 1013,2 hpa. Neste caso, ele converte para pés e depois para metros.

E o que nós queremos? Queremos que ele apresente o valor da distancia do solo até o ponto da estação, em metros. Logo...

int distancia = bmp.readAltitude(QFE): 

Então, sempre que você quiser apertar os botões, por 5 segundos, para obter o novo valor do QFE , bastará chamar uma formula como essa: QFE = bmp.readPressure() / 100;

obs- Eu poderia dizer que era só dividir a segunda função por 100 e depois jogar na terceira função, mas ai perde a magia da coisa.

====== EDIT =======

Essa variação de +1 e -1 pode ser devido a alguma coisa no circuito, ou em relação a qualidade ou limitação do componente. Eu não conheço. Em todo caso, você também pode tirar uma média dos valores para reduzir essa taxa de erro.

Exemplo, você joga no loop, faz 10..20...50... leituras, e depois divide pelo número de leituras.

Ahhh sim!! Eu acabeo fazendo ja o valor/100 considerando a unidade mesmo, mas desconhecia essas variaveis como QNH e QFE.

No codigo atualizado que eu fiz o upload eu até ja tinha modificado pra x/100 ahauahahahha

Quanto a variaçao, to pesquisando aqui como reduzir o intervalo de aferiçoes que por padrao é de 500ms...e dentro disso o datasheet da bosh da uma precisao media de +- 0.12hPa que ta dentro do que eu to observando aqui né.

Ahhh e aparentemente ele ja faz o offset por variaçao de temperatura na razao de 1.5Pa/K

Qualquer coisa, você pode criar uma função e jogar num "for" para realizar a média. Exemplo bonito:

#define clicos 10

int NEW_QFE() {
int valor = 0;
for (byte i = 0; i < ciclos; i++) {
valor = valor  + bmp.readPressure();
}
valor = valor / ciclos;

valor = valor / 100;
return valor;
}

=== EDIT ===

Quanto maior o número de ciclos, menor será a taxa de erro (correção por software) e maior será o tempo que ele irá levar para obter a informação.

Quanto ao tempo de 5 segundos, de forma simplista, usando o millis.

Anexei um exemplo que PODE SER exatamente o que você quer, entretanto TENTE ENTENDER o código. Não adianta copiar e colar.

Tira um tempo para esquentar o juízo e fazer testes com esse "millis". Na minha opinião, é uma função de conhecimento obrigatória, e a probabilidade de você utilizar em outro código/projeto é de 9999999999999999%.

Extras.ino

Olá,

no pseudo esquema que você postou não aparece como estão ligados os 2 botões.

RV mineirtin

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço