BMP180 é um sensor de pressão digital projetado para operação de baixa potência e baixa tensão em telefones celulares, dispositivos de navegação e assistentes digitais pessoais. O sensor possui uma interface I2C para comunicar os dados do sensor. Ele pode operar em 2,5 ~ 3,6 V e consome apenas 12 uA, mesmo no modo de resolução ultra-alta. O sensor pode ser usado para diversas aplicações, incluindo medição de altitude a partir do nível do mar, medição de altitude a partir do solo, medição de velocidade vertical e detecção de condições climáticas.
Neste projeto, desenvolvemos um medidor de altitude usando o sensor BMP180 e nossa placa microcontroladora favorita – Arduino. Este medidor de altitude exibe a altitude em tempo real a partir do nível do mar em um pequeno display OLED. O display OLED usado para a altitude atual é o SSD1306.
Componentes necessários
- Arduino UNO/qualquer placa Arduino x1
- Sensor de pressão BMP180 x1
- SSD1306 OLEDx1
- Conectando fios/fios de jumper
Conexões de circuito
O medidor de altitude é projetado conectando o sensor de pressão SSD1306 OLED e BMP180 com o Arduino UNO. O sensor BMP180 possui quatro terminais – Vin, Gnd, SCL e SDA. Os pinos Vin e Gnd do sensor são conectados à saída de 3,3 V e a um pino de aterramento do Arduino UNO. Os pinos SCL e SDA do sensor podem ser conectados a qualquer uma das portas I2C da placa Arduino. As portas I2C no Arduino UNO são mostradas na imagem abaixo.
O OLED SSD1306 é conectado ao Arduino usando uma porta SPI física. Para fazer a interface do SSD1306 OLED via porta SPI física, conecte os pinos D0/SCK e D1/MOSI do SSD1306 OLED aos pinos D13 e D11 do Arduino, respectivamente. Conecte os pinos DC, RESET e CS do SSD1306 aos pinos D9, D10 e D8 do Arduino, respectivamente. O circuito final é o seguinte.
Esboço do Arduino
Como funciona o circuito
BMP180 é um sensor piezoresistivo usado para detectar a pressão atmosférica. O sensor mede a temperatura e a pressão, pois ambos os fatores afetam a densidade do ar. A temperatura é medida para compensar as leituras de pressão de acordo com as mudanças na densidade do ar. O sensor gera a pressão atmosférica em Pascal através de sua interface I2C.
Existem bibliotecas Arduino disponíveis para sensores BMP180 da Adafruit e Sparkfun. Neste projeto, estamos usando a biblioteca do Sparkfun, e esta biblioteca converte a saída do sensor em Pascal para hectoPascal.
O sensor primeiro lê a leitura de temperatura não compensada e depois a leitura de pressão não compensada. Finalmente, ele faz alguns cálculos complexos com ambas as leituras, envolvendo uma série de coeficientes armazenados em sua EEPROM para fornecer pressão barométrica e temperatura precisas. A pressão barométrica varia com a altitude, e a pressão atmosférica diminui com o aumento da altitude e vice-versa. Uma mudança de 1 Hectopascal corresponde a cerca de 8 metros de altitude. O BMP180 é um sensor muito sensível e responde até mesmo a mudanças mínimas na pressão atmosférica real. A equação a seguir fornece a altitude do nível do mar.
altitude = 44330 * (1 – (Patual/Pnível do mar)^(1/5.255))
O próprio sensor se encarrega de realizar todos esses cálculos complexos e emite diretamente a pressão barométrica verdadeira atual.
O Arduino escuta a pressão barométrica do sensor BMP180 por meio de sua interface I2C. A biblioteca Sparkfun fornece funções de leitura de temperatura, pressão e altitude, e o Arduino lê a leitura de altitude e exibe a leitura no SSD1306 OLED.
O display OLED está conectado à porta física SPI do Arduino. Assim, o OLED se comunica com o controlador pela interface SPI enquanto o sensor BMP180 retransmite as leituras de pressão pela interface I2C. O Arduino lê a altitude do BMP180 via I2c e a exibe no display OLED via SPI. A leitura de saída exibida está em metros.
O código
Em primeiro lugar, as bibliotecas SPI e Wire são importadas para comunicação de dados através de interfaces SPI e I2C. As bibliotecas Adafruit_GFX e Adafruit_SSD1306 são importadas para funcionar com o display OLED SSD1306. A biblioteca Sparkfun BMP180 é importada para funcionar com o sensor BMP180. Constantes e atribuições de pinos para o display OLED são definidas. Um objeto 'display' da classe 'Adafruit_SSD1306' é instanciado para lidar com o display OLED, e um objeto 'pressão' da classe 'SFE_BMP180' é instanciado para lidar com o sensor BMP180. Uma 'linha de base' variável é definida para armazenar a pressão atmosférica de referência ao nível do mar. A seguir, um array de bitmap é definido para armazenar o logotipo EEWORLDONLINE.
Na função setup , a taxa de transmissão para comunicação de dados é definida como 9600 bps. A exibição é inicializada usando o método display.begin . Se a pressão detectar o método sensor.begin BMP180, o logotipo piscará no display OLED. Caso contrário, a mensagem “Dispositivo não funciona” piscará no OLED.
Na função loop são declaradas variáveis para armazenar leituras de pressão e altitude. A pressão é lida chamando a função definida pelo usuário getPressure . A pressão atmosférica de base para a localização atual é definida. Isto é definido como 1013, pois a altitude é lida em relação ao nível do mar aqui. A altitude é medida chamando o objeto de sobrepressão do método altitude com a linha de base fornecida. O display OLED é limpo usando o método display.clearDisplay . O cursor está configurado para iniciar a tela usando display. método setCursor . O tamanho do texto é definido como 2 usando display. método setTextSize . A cor do texto é definida como branco usando o método setTextColor . A altitude de leitura é impressa no OLED usando os métodos display.print e display.println . As leituras piscam no OLED quando o método display.display(0 é chamado. Um atraso de 1500 ms é fornecido chamando a função delay antes da próxima iteração da função loop .
A função getPressure lê a pressão barométrica do sensor BMP180. Ele usa os métodos startTemperature , getTemperature e startPressure da biblioteca Sparkfun.
Resultado